처음부터 시작하는 Java
  • JPA 로 데이터 액세스
    2022년 08월 17일 11시 55분 08초에 업로드 된 글입니다.
    작성자: 원2
    728x90
    반응형

    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
    댓글