Chapter 03. 스프링 부트에서 JPA로 데이터베이스 다뤄보자 (2) - DoDaek/freelec-springboot2-webservice GitHub Wiki

  1. JPA Auditing으로 생성시간/수정시간 자동화하기
    • 보통 Entity에는 해당 데이터의 생성시간과 수정시간을 포함합니다.
      • 언제 만들어졌는지, 언제 수정되었는지 등은 차후 유지보수에 있어 굉장히 중요한 정보이기 때문입니다.
    • 매번 DB에 삽입하기 전, 갱신하기 전에 날짜 데이터를 등록/수정하는 코드가 여기저기 들어가게 됩니다.
      // 생성일 추가 코드 예제
      public void savePosts() {
          ...
          posts.setCreateDate(new LocalDate());
          postsRepository.save(posts);
          ...
      }
      
    • 위처럼 단순하고 반복적인 코드가 모든 테이블과 서비스 메소드에 포함되어야 한다고 생각하면 어마어마하게 귀찮고 코드가 지저분해집니다.
    • 이 문제를 해결하고자 JPA Auditing을 사용하겠습니다.

  1. LocalData 사용
    • Java8부터 LocalDateLocalDateTime이 등장했습니다.
    • LocalDateLocalDateTime이 데이터베이스에 제대로 매핑되지 않는 이슈가 Hibernate 5.2.10 버전에서 해결되었습니다.
    • 스프링 부트 1.x를 쓴다면 별도로 Hibernate 5.2.10 버전 이상을 사용하도록 설정이 필요합니다.

  1. Java8 이전의 문제점
    • Java8이 나오기 전까지 사용되었던 DateCalendar 클래스는 다음과 같은 문제점들이 있었습닏.
    • 불변 객체가 아닙니다.
      • 멀티스레드 환경에서 언제든 문제가 발생할 수 있습니다.
    • Calendar는 월( Month )값 설계가 잘못되었습니다.
      • 10월을 나타내는 Calendar.OCTOBER의 숫자 값은 9입니다.
      • 당연히 10으로 생각했던 개발자들에게 큰 혼란이 왔습니다.

  1. BaseTimeEntity 클래스
    • BaseTimeEntity 클래스는 모든 Entity의 상위 클래스가 되어 Entity들의 createdDate, modifiedDate를 자동으로 관리한ㄴ 역할입니다.
    • 모든 Entity 클래스가 BaseTimeEntity를 상속받도록 변경합니다.
    • 마지막으로 JPA Auditing 어노테이션들을 모두 활성화할 수 있도록 Application 클래스에 활성화 어노테이션 하나를 추가하겠습니다.
      @EnableJpaAuditing
      @SpringBootApplication
      public class Application {
      
          public static void main(String[] args) {
              SpringApplication.run(Application.class, args);
          }
      }