JPA 를 이용한 데이타 엑세스
목표
H2 데이타베이스를 이용해, 데이타를 insert/update/select 를 수행합니다.
H2 는 디폴트로 메모리에 데이타를 저장하므로, 프로젝트를 재실행하면 입력되었던 데이타는 사라집니다.
프로젝트 생성
신규 프로젝트를 생성합니다.
의존성은 DevTools, Lombok, Spring Web, Thymeleaf, Spring Data JPA, H2 를 선택합니다.
파일 추가
Entity 생성
Customer.java 파일을 추가합니다.
@Entity
를 붙여줌으로 해서, 이 클래스가 Entity 클래스임을 표시합니다.
@Id
를 붙여서, 이 변수가 PK 임을 표시합니다.
@GeneratedValue(strategy= GenerationType.AUTO)
를 지정해서,
PK 의 값은 자동증가임을 표시합니다.
@Entity
public class Customer {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id;
private String firstName;
private String lastName;
protected Customer() {}
public Customer(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
@Override
public String toString() {
return String.format(
"Customer[id=%d, firstName='%s', lastName='%s']",
id, firstName, lastName);
}
public Long getId() {
return id;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}
Repository 생성
CustomerRepository.java 파일을 추가합니다.
interface
만 생성해 주면, 구현 클래스는 Spring 에 의해 자동생성됩니다.
CrudRepository
에 이미 insert/update/delete/select 관련 메소드가 구현되어 있습니다.
CrudRepository<Customer, Long>
에서, Customer
는 Entity, Long
은 PK 의 타입을 의미합니다.
findByLastName
은 특정 필드명으로 검색하는 메소드를,
findBy필드명
형식으로 메소드만 생성하면,
Spring 이 실제 메소드를 자동생성해 줍니다.
public interface CustomerRepository extends CrudRepository<Customer, Long> {
List<Customer> findByLastName(String lastName);
Customer findById(long id);
}
Application 수정
@SpringBootApplication
public class JpaApplication {
public static void main(String[] args) {
SpringApplication.run(JpaApplication.class, args);
}
private static final Logger log = LoggerFactory.getLogger(JpaApplication.class);
@Bean
public CommandLineRunner demo(CustomerRepository repository) {
return (args) -> {
// save a few customers
repository.save(new Customer("Jack", "Bauer"));
repository.save(new Customer("Chloe", "O'Brian"));
repository.save(new Customer("Kim", "Bauer"));
repository.save(new Customer("David", "Palmer"));
repository.save(new Customer("Michelle", "Dessler"));
// fetch all customers
log.info("Customers found with findAll():");
log.info("-------------------------------");
for (Customer customer : repository.findAll()) {
log.info(customer.toString());
}
log.info("");
// fetch an individual customer by ID
Customer customer = repository.findById(1L);
log.info("Customer found with findById(1L):");
log.info("--------------------------------");
log.info(customer.toString());
log.info("");
// fetch customers by last name
log.info("Customer found with findByLastName('Bauer'):");
log.info("--------------------------------------------");
repository.findByLastName("Bauer").forEach(bauer -> {
log.info(bauer.toString());
});
// for (Customer bauer : repository.findByLastName("Bauer")) {
// log.info(bauer.toString());
// }
log.info("");
};
}
}
프로젝트 실행
프로젝트를 실행하면, 로그에 입력한 데이타가 표시되는 것을 확인할 수 있습니다.
Pingback: Spring Boot 시작하기 – 상구리의 기술 블로그