Chapter 03. 스프링 부트에서 JPA로 데이터베이스 다뤄보자 (2) - DoDaek/freelec-springboot2-webservice GitHub Wiki
- JPA Auditing으로 생성시간/수정시간 자동화하기
- 보통 Entity에는 해당 데이터의 생성시간과 수정시간을 포함합니다.
- 언제 만들어졌는지, 언제 수정되었는지 등은 차후 유지보수에 있어 굉장히 중요한 정보이기 때문입니다.
- 매번 DB에 삽입하기 전, 갱신하기 전에 날짜 데이터를 등록/수정하는 코드가 여기저기 들어가게 됩니다.
// 생성일 추가 코드 예제 public void savePosts() { ... posts.setCreateDate(new LocalDate()); postsRepository.save(posts); ... }
- 위처럼 단순하고 반복적인 코드가 모든 테이블과 서비스 메소드에 포함되어야 한다고 생각하면 어마어마하게 귀찮고 코드가 지저분해집니다.
- 이 문제를 해결하고자 JPA Auditing을 사용하겠습니다.
- 보통 Entity에는 해당 데이터의 생성시간과 수정시간을 포함합니다.
- LocalData 사용
- Java8부터
LocalDate
와LocalDateTime
이 등장했습니다. LocalDate
와LocalDateTime
이 데이터베이스에 제대로 매핑되지 않는 이슈가 Hibernate 5.2.10 버전에서 해결되었습니다.- 스프링 부트 1.x를 쓴다면 별도로 Hibernate 5.2.10 버전 이상을 사용하도록 설정이 필요합니다.
- Java8부터
- Java8 이전의 문제점
- Java8이 나오기 전까지 사용되었던
Date
와Calendar
클래스는 다음과 같은 문제점들이 있었습닏. - 불변 객체가 아닙니다.
- 멀티스레드 환경에서 언제든 문제가 발생할 수 있습니다.
Calendar
는 월(Month
)값 설계가 잘못되었습니다.- 10월을 나타내는
Calendar.OCTOBER
의 숫자 값은9
입니다. - 당연히
10
으로 생각했던 개발자들에게 큰 혼란이 왔습니다.
- 10월을 나타내는
- Java8이 나오기 전까지 사용되었던
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); } }