JPA 를 이용한 데이타 엑세스

By | 2021년 7월 17일
Table of Contents

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("");
        };
    }
}

프로젝트 실행

프로젝트를 실행하면, 로그에 입력한 데이타가 표시되는 것을 확인할 수 있습니다.

One thought on “JPA 를 이용한 데이타 엑세스

  1. Pingback: Spring Boot 시작하기 – 상구리의 기술 블로그

답글 남기기