보통 엔티티에는 해당 데이터의 생성시간과 수정시간을 포함한다. 차후 유지보수에 있어 굉장히 중요한 정보이기 때문이다.
그렇다보니 매번 DB에 삽입하기 전, 갱신하기 전에 날짜 데이터를 등록/수정하는 코드가 여기저기 들어간다.
데이터의 생성 시간, 수정 시간을 등록하는 코드가 반복적으로 들어가면 코드가 지저분해진다. 이 문제를 해결하기 위해 JPA Auditing을 사용할 수 있다.
LocalDate
와 LocalDateTime
이 등장했다. Java의 기본 날짜 타입인 Date
의 문제를 제대로 고친 타입이므로 Java 8이면 무조건 사용해야 한다.불변 객체가 아니다.
불변 객체란 변경이 불가능한 객체
를 의미한다. 멀티 스레드 환경이라면 언제든 문제가 발생할 수 있다.
Calendar는 월(Month) 값 설계가 잘못되었다.
Calendar
에서 10월을 나타내는 Calendar.OCTOBER
의 값은 9이다. 당연히 10이라고 생각하는 개발자들에게 혼란을 불러일으킨다.
→ 참고
BaseTimeEntity 클래스 생성
⇒ BaseTimeEntity 클래스는 모든 Entity의 상위 클래스가 되어 Entity들의 createdDate와 modifiedDate를 자동으로 관리하는 역할을 하는 것이다.
BaseTimeEntity 코드
package com.jojoldu.book.springboot.domain;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
@CreatedDate
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime modifiedDate;
}
Posts 클래스가 BaseTimeEntity를 상속 받도록 추가
...
public class Posts extends BaseTimeEntity {
...
}
JPA Auditing 어노테이션들을 모두 활성화 할 수 있도록 Application 클래스에 활성화 어노테이션 하나 추가
@EnableJpaAuditing // JPA Auditing 활성화
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}