보통 엔티티에는 생성하거나 수정한 주체 및 시기에 대한 정보를 포함하는데, 이는 차후 유지보수에 있어서 중요한 역할을 한다. 따라서 이러한 정보는 모든 도메인에 공통으로 존재하며, 이를 처리하는 코드를 모든 도메인에 일일이 포함해주어야 한단 뜻이다. 이는 매우 비효율적인 작업이라고 할 수 있다.
그래서 JPA에서 제공하는 Audit
이라는 기능을 사용하여 이러한 작업을 자동화 할 것이다. 이 기능은 자동으로 시간을 매핑하여 데이터베이스의 테이블에 넣어주는 역할을 수행한다.
기존에 사용하던 Date
와 Calendar
클래스는 다음과 같은 문제점들이 존재했다.
Calendar
의 잘못된 월(Month) 값 설계월-1
임Calendar.OCTOBER
= 9이러한 문제점들은 오픈소스를 사용하여 해결하다가, Java8부터는 문제점을 해결하여 등장한 LocalDate
와 LocalDateTime
클래스를 사용하고 있다.
LocalDate
와 LocalDateTime
이 데이터베이스에 제대로 매핑되지 않는 이슈는 Hibernate 5.2.10 버전에서 해결되었다. Spring Boot 2.x 버전부터는 기본적으로 해당 버전을 사용하므로 별다른 설정없이 바로 적용이 가능하다.
domain
패키지에 BaseTimeEntity
클래스를 생성한다.
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
@CreatedDate
private LocalDateTime created;
@LastModifiedDate
private LocalDateTime modified;
}
모든 Entity의 상위 클래스로 Entity들의 생성시간 및 수정시간을 자동으로 관리하는 역할을 수행한다.
BaseTimeEntity
를 상속할 경우 이 클래스의 필드들도 칼럼으로 인식하도록 설정BaseTimeEntity
클래스에 Auditing 기능 포함Board
클래스가 BaseTimeEntity
를 상속받을 수 있도록 변경한다.
...
public class Board extends BaseTimeEntity {
...
}
마지막으로 JPA Auditing 어노테이션들을 모두 활성화하기 위해 Application
클래스에 활성화 어노테이션을 추가한다.
@EnableJpaAuditing
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
📖 참고