방명록
- JPA 로 데이터 액세스2022년 08월 17일 11시 55분 08초에 업로드 된 글입니다.작성자: 원2728x90반응형
Spring Data JPA 를 사용하여 관계형 데이터베이스에 데이터를 저장하고 검색하는 애플리케이션을 구축해보자
종속성
Spring Data JPA
H2 Database
Entity 생성
package com.example.accessingdatajpa; import lombok.Data; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; // @Table 주석이 없으므로 이 Entity 는 Customer 이라는 테이블에 매핑된다고 가정 @Entity @Data public class Customer { // 객체의 아이디로 인식할 수 있도록 @Id 어노테이션 // ID 가 자동으로 생성되어야함을 나타내는 @GeneratedValue @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; // 아래의 두 객체의 어노테이션이 없는 이유 // 객체 자체와 동일한 이름을 고유하는 열에 매핑된다고 가정 private String firstName; private String lastName; // default 생성자, 직접 사용하지 않으므로 protected 로 지정 protected Customer() {} // 실제 사용하는 생성자 // Customer db에 저장할 인스턴스를 만드는데 사용 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 ); } }
간단한 쿼리 생성
package com.example.accessingdatajpa; import org.springframework.data.repository.CrudRepository; import java.util.List; // CustomerRepository 확장 // Customer 과 함께 작동하는 엔티티 유형 및 ID 는 Long 매개변수에 저장 // CrudRepository 에 엔티티를 저장, 삭제, 찾는 방법을 포함하여 상속 public interface CustomerRepository extends CrudRepository<Customer, Long> { // 메서드를 선언하여 다른 쿼리 메서드를 정의 List<Customer> findByLastName(String lastName); Customer findById(long id); }
ㅣ이렇게 있으면 저장소 인터페이스의 구현을 따로 작성할 필요가 없다
Spring Data JPA 가 알아서 해주기때문
Application Class
실제 테이블을 생성하지 않아서 log 로 출력을 얻어보자
package com.example.accessingdatajpa; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; @SpringBootApplication public class AccessingDataJpaApplication { private static final Logger log = LoggerFactory.getLogger(AccessingDataJpaApplication.class); public static void main(String[] args) { SpringApplication.run(AccessingDataJpaApplication.class, args); } @Bean public CommandLineRunner demo(CustomerRepository repository) { return (args) -> { // CustomerEntity 의 Customer() 생성자를 필요로 하며 해당 생성자를 사용 // 데이터 저장 repository.save(new Customer("Jack", "Sparrow")); repository.save(new Customer("Hector", "Barbossa")); repository.save(new Customer("Black", "Pearl")); repository.save(new Customer("Flying", "Dutchman")); // 모든 데이터 출력 log.info("Customers found with findAll():"); log.info("--------------------------------"); for (Customer customer : repository.findAll()) { log.info(customer.toString()); } log.info(""); // 해당 ID 와 일치하는 데이터 출력 Customer customer = repository.findById(2L); log.info("Customer found with findById(2L):"); log.info("----------------------------------"); log.info(customer.toString()); log.info(""); // lastName 이 일치하는 데이터 출력 log.info("Customer found with findByLastName('Sparrow'):"); log.info("-----------------------------------------------"); repository.findByLastName("Sparrow").forEach(sparrow -> { log.info(sparrow.toString()); }); // for (Customer sparrow : repository.findByLastName("Sparrow")) { // log.info(sparrow.toString()); // } log.info(""); }; } }
결과
: Customers found with findAll(): : -------------------------------- : Customer[id=1, firstName='Jack', lastName='Sparrow'] : Customer[id=2, firstName='Hector', lastName='Barbossa'] : Customer[id=3, firstName='Black', lastName='Pearl'] : Customer[id=4, firstName='Flying', lastName='Dutchman'] : : Customer found with findById(2L): : ---------------------------------- : Customer[id=2, firstName='Hector', lastName='Barbossa'] : : Customer found with findByLastName('Sparrow'): : ----------------------------------------------- : Customer[id=1, firstName='Jack', lastName='Sparrow'] :
728x90반응형'Spring > Spring boot' 카테고리의 다른 글
시간 측정하는 간단한 aop (0) 2022.12.22 mariadb로 데이터 액세스 (0) 2022.08.16 Restful 웹 서비스 구축 (0) 2022.08.16 스프링부트 개념정리 2 (0) 2022.07.27 스프링부트 개념정리 (0) 2022.07.26 다음글이 없습니다.이전글이 없습니다.댓글