
안녕하세요👻
오늘은 JPA Auditing을 이용해 데이터의 생성시간과 수정시간이 엔티티에 자동으로 포함되게 만들어 보겠습니다!
보통 엔티티에는 해당 데이터가 언제 만들어졌는지, 언제 수정되었는지 등 차후 유지보수에 있어서 중요한 정보를 포함하고 있어야 하는데요
매번 데이터를 삽입하기 전, 갱신하기 전에 날짜 데이터를 등록/수정하는 코드가 반복되면 번거롭고 코드도 지저분해지겠죠?
그래서! 이 문제를 해결하고자 JPA Auditing을 적용 해보겠습니다!

먼저 domain 패키지에 BaseTimeEntity라는 Entity를 만들어 주었습니다.
이 Entity는 모든 Entity의 상위 클래스가 되어 Entity들의 createdDate, modifiedDate를 자동으로 관리하는 역할을 합니다.
package com.b1uesoda.springboot.domain;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.time.LocalDateTime;
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseTimeEntity {
@CreatedDate
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime modifiedDate;
}
📍@MappedSuperclass
-JPA Entity 클래스들이 BaseTimeEntity를 상속할 경우 필드들(createdDate, modifiedDate)도 칼럼으로 인식하도록 해줍니다.
📍@EntityListeners(AuditingEntityListener.class)
-BaseTimeEntity 클래스에 Auditing 기능을 포함시킵니다.
📍@CreatedDate
-Entity가 생성되어 저장될 때 시간이 자동 저장됩니다.
📍@LastModifiedDate
-조회한 Entity의 값을 변경할 때 시간이 자동 저장됩니다.
이제 상속받도록 하고 싶은 엔티티 클래스에 클래스가 BaseTimeEntity를 extends 해줍니다. 저 같은 경우에는 Posts엔티티에 적용해 주었습니다.

마지막으로 JPA Auditing 어노테이션들이 모두 활성화 되도록 Application클래스에 활성화 어노테이션 @EnableJpaAuditing을 추가해 줍니다!

자 이제 실제 코드는 완성이 되었으니 기능이 잘 작동하는지 테스트를 해보겠습니다.
저는 예시로 만들어 두었던 PostsRepositoryTest에 테스트 메소드를 추가해 주었습니다.
@Test
public void BaseTimeEntity_등록() {
//given
LocalDateTime now = LocalDateTime.of(2024, 4, 13, 0, 0, 0);
postsRepository.save(Posts.builder()
.title("title")
.content("content")
.author("author")
.build());
//when
List<Posts> postsList = postsRepository.findAll();
//then
Posts posts = postsList.get(0);
System.out.println(">>>>>>>>> createDate=" + posts.getCreatedDate()+", modifiedDate=" + posts.getModifiedDate());
assertThat(posts.getCreatedDate()).isAfter(now);
assertThat(posts.getModifiedDate()).isAfter(now);
}
테스트 코드를 실행해 보면, 다음과 같이 실제 시간이 잘 저장되는 것을 확인할 수 있습니다👍

오늘은 이렇게 JPA Auditing을 이용하여 등록 및 수정 시간을 자동화하는 방법에 대해서 알아보았습니다.
서비스를 운영할 때 데이터가 생성되고, 수정한 일자를 기록하고 트래킹하는 것은 매우 중요하기 때문에, 이를 자동화 시켜주는 JPA Auditing은 거의 필수 요소일 것 같네요🤔
📚Reference
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 이동욱
오늘도 유익한 내용 고맙습니다 늘 응원해요💙