엔티티에는 보통 데이터의 생성 시간과 수정 시간이 포함된다. 언제 만들어졌고 수정되었는지는 향후 유지보수에 있어서 굉장히 중요한 정보이기 때문이다.
그렇다 보니 매번 DB에 insert, 갱신 하기 전에 날짜 데이터를 등록/수정하는 코드가 들어가게 되어 코드가 복잡하고 길어진다.
Java8 부터 등장한 LocalDate와 LocalDateTime은 그간 Java의 기본 날짜 타입인 Date의 문제점을 모두 고쳐서 Java 8 이상부터는 무조건 사용해야 한다고 생각하면 된다.
참고
자바 8이 나오기 전까지 사용되었던 Date와 Calendar 클래스는 다음과 같은 문제점들이 있었다.
- 불변의 객체가 아니다. -> 멀티 스레드 환경에서 문제가 발생할 수 있다.
- Calendar는 월(month) 설계가 잘못 되었다. -> 10월을 나타내는 Calendar.OCTOBER의 숫자 값은 '9'이다.
@Getter
@MappedSuperclass // 1
@EntityListeners(AuditingEntityListener.class) // 2
public class BaseTimeEntity {
@CreatedDate // 3
private LocalDateTime localDateTime;
@LastModifiedDate // 4
private LocalDateTime modifiedDate;
}
1 : 모든 JPA 엔티티들이 BaseTimeEntity를 상속 받을 경우 필드도 컬럼으로 인식하도록 한다.
2 : BaseTimeEntity 클래스에 Auditing 기능을 포함시킨다.
3 : 엔티티가 생성될 때 생성된 시간이 자동 저장된다.
4 : 조회한 엔티티가 수정될 때 수정된 시간이 자동 저장된다.
@Getter
@NoArgsConstructor
@Entity
public class Posts extends BaseTimeEntity {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 500, nullable = false)
private String title;
@Column(columnDefinition = "TEXT", nullable = false)
private String content;
private String author;
위와 같은 식으로 BaseTimeEntity를 상속 받으면 엔티티의 생성, 수정 시간이 자동으로 데이터베이스에 등록된다.
마지막으로 Application에 @EnableJpaAuditing를 써주어야 한다.
@SpringBootApplication
@EnableJpaAuditing
public class Application {
public static void main(String[] args) {
SpringApplication.run(PracOauthApplication.class, args);
}
}
1~4번째는 생성/수정 시간을 적용하기 전이고 5번 째는 생성 수정 시간 컬럼이 추가되어 잘 적용된 모습을 볼 수 있다.