JPA Auditing 기술은 엔티티를 생성 및 변경할 때, 생성시간, 수정시간 등을 자동으로 삽입해 주는 기능입니다.
Audit은 감사하다, 추적하다의 의미를 지니는데, Auditing 기술을 이용하면 마지막에 데이터를 생성 및 수정한 사람과 시간을 추적할 수 있게 됩니다.
우선, Auditing 기술을 사용하게 위해, SpringApplication.class에 다음과 같은 어노테이션을 지정해줘야 합니다.
@EnableJpaAuditing
public class ExerciseApplication {
public static void main(String[] args) {
SpringApplication.run(ExerciseApplication.class, args);
}
}
다음으로 생성시간, 수정시간 필드가 담겨있는 클래스를 생성해 줍니다.
BaseEntity
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
@Getter
public abstract class BaseEntity {
@CreatedDate
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd hh:mm:ss", timezone = "Asia/Seoul")
@Column(nullable = false, updatable = false)
private LocalDateTime createdAt;
@LastModifiedDate
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd hh:mm:ss", timezone = "Asia/Seoul")
@Column(nullable = false)
private LocalDateTime modifiedAt;
}
처음에는 이렇게 클래스를 만들어줬지만, JPA Auditing에서는 @JsonFormat, @DataTimeForamat 어노테이션이 적용이 되지 않는다고 합니다.
그래서 이렇게 설정하고, 데이터를 삽입한 테이블을 조회한 경우 형식이 millisecond까지 나오게 됩니다.
millisecond까지 해당 컬럼에 표시하는 것은 불필요하기에 BaseEntity를 다음과 같이 수정하였습니다.
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
@Getter
public abstract class BaseEntity {
private String createdAt;
private String modifiedAt;
@PrePersist
void onPrePersist() {
this.createdAt = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
this.modifiedAt = createdAt;
}
@PreUpdate
void onPreUpdate() {
this.modifiedAt = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
}
이렇게 엔티티 생성 및 수정이 되기 전, 다음과 같이 formatting을 해줘야 다음과 같이 형식이 올바르게 적용됩니다.
이제 다시 테이블을 조회해 보겠습니다.
다음과 같이 형식이 깔끔하게 지정되었음을 확인할 수 있습니다. 이상으로 JPA Auditing 기술과 데이터의 생성시간, 수정시간 형식을 올바르게 지정하는 방법에 대해서 알아보았습니다.
<참고 자료>
https://lsj8367.tistory.com/entry/JPA-JPA-Auditing
'Java > Spring' 카테고리의 다른 글
[Spring] Lightsail 배포 서버에서 Spring Application 실행 시, Encoding UTF-8 인식을 하지 못하고 한글이 깨지는 현상 (1) | 2023.11.25 |
---|---|
[Spring] @PropertySource, @Value 어노테이션에 대해 알아보자 (0) | 2023.11.25 |
[Spring] DTO, VO 이 둘의 차이에 대해 알아보자 (2) | 2023.11.17 |
[Spring] 웹 애플리케이션과 영속성 관리 (0) | 2023.11.14 |
[Spring] Filter, Interceptor, ArgumentResolver (0) | 2023.10.15 |