Auditing 기능이란?
JPA를 사용해 도메인을 관계형 데이터베이스 테이블에 매핑할 때 도메인들이 공통적으로 가지고 있는 컬럼이 존재한다.
대표적으로 생성일, 등록일 같은 것들이 있다. 데이터베이스에 누가, 언제했는지 기록을 남기는 생성일, 수정일 컬럼은 굉장히 중요한 데이터라고 할 수 있다.
그래서 Spring Data JPA는 Auditing이라는 기능을 제공해준다.
이 기능은 시간에 대해 자동으로 값을 넣어주는 기능으로, 도메인을 영속성 컨텍스트에 저장하거나 조회 후 수정하는 경우 자동으로 시간을 매핑해 데이터베이스의 테이블에 넣어준다.
사용방법
👉🏻 의존성 추가
📁 build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}
Auditing 기능을 사용하기 위해 Jpa 의존성을 추가해준다.
👉🏻 추상 클래스 생성
📁 BaseTimeEntity
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity{
@CreatedDate
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime modifiedDate;
}
- @MappedSuperclass : JPA Entity들이 해당 클래스를 상속할 경우 createdDate, updatedDate를 컬럼으로 인식
- @EntityListeners(AuditingEntityListener.class) : 해당 클래스에 Auditing 기능을 포함
- @CreatedDate : Entity가 생성되어 저장될 때 시간을 자동 저장
- @LastModifiedDate : 조회한 Entity의 값이 변경될 때 시간을 자동 저장
Date 자료형을 지양하고 java 8 버전에 추가된 LocalDate, LocalDateTime을 사용하는 것을 권장한다.
👉🏻 클래스 상속
📁 Post
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Post extends BaseTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String contents;
@Builder
private Post(String title, String contents) {
this.title = title;
this.contents = contents;
}
public void update(String title, String contents) {
this.title = title;
this.contents = contents;
}
}
👉🏻 JPA Auditing 활성화
@EnableJpaAuditing
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
실행 클래스에 @EnableJpaAuditing 애노테이션을 적용해 JPA Auditing 기능을 활성화해준다.
👉🏻 테스트
@Test
@DisplayName("게시물을 저장하면 생성, 수정시간이 자동으로 생성된다.")
void generateTimeOfPost() {
// given
Post post = Post.builder().build();
Post savePost = postRepository.save(post);
// when
Post findPost = postRepository.findById(savePost.getId());
System.out.println("createdDate = " + findPost.getCreatedDate());
System.out.println("updatedDate = " + findPost.getUpdatedDate());
// then
assertThat(findPost.getCreatedDate()).isNotNull();
assertThat(findPost.getUpdatedDate()).isNotNull();
}
간단하게 테스트 코드를 작성해 실제로 하이버네이트가 생성일, 수정일 값을 자동으로 채워주는지 확인한다.
Refernce
JPA Base Entity 사용한 Audit 기능 사용하기
'🌱 Spring > JPA' 카테고리의 다른 글
[JPA] JPQL : 경로 표현식 (0) | 2023.07.04 |
---|---|
[JPA] JPA 설정 총 정리 : ddl-auto 옵션, 실행 쿼리 보기(SpringBoot 3.x 버전 변경 추가) (1) | 2023.04.19 |
[JPA] OSIV (0) | 2022.12.27 |
[JPA] JPQL : 서브 쿼리 (0) | 2022.11.06 |
[JPA] JPQL : 조인 (0) | 2022.11.04 |
[JPA] JPQL : 페이징 (0) | 2022.11.03 |
[JPA] JPQL : 기본 문법 (0) | 2022.10.29 |
[JPA] JPA가 지원하는 쿼리 방법 (JPQL, Criteria, QueryDsl) (0) | 2022.10.29 |