Back-end/Spring

[JPA] Entity에 JPA로 (생성시간, 수정시간)넣기 - Auditing

code_wizard 2023. 11. 26. 16:59

 

# Auditing?

Audit는 사전적 의미로 감사하다, 심사하다 등의 의미를 지닌다.

Spring Data JPA는 Auditing이라는 기능을 제공한다.


 

# 사용이유

보통 Entity에는 해당 데이터의 "생성시간과 수정시간"을 포함한다.

차후 유지보수에 있어 굉장이 중요한 정보임.

DB에 (삽입,갱신)하기 전, "시간 데이터"를 넣어주어야 함. 

 

이런 단순한 코드가 "테이블""서비스 메소드"에 포함된다면

코드가 지저분해질 수 있기에 JPA가 제공하는 JPA  Auditing을 사용할 수 있다.


# 사용방법

스프링 부트에서 gradle로 의존성을 관리한다면 

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    }

만 추가해도 Auditing 기능을 사용할 수 있다.

 

더보기

🚩 참고  🚩

자바 1.8 이상부터는 

기존 *문제들을 해결하였고 LocalDate, LocalDateTime를 사용한다.

DB에 매핑되지 않았던 이슈 Hibernate 5.2.10 버전부터 해결됨.

스프링 부트 2.X 이상은 하이버네이트 버전을 생각하지 않아도됨. (더 높은 버전임)

 

 

*기존 문제

기본의 있던 Date, Calander 클래스는 문제점이 있었다.

=> 불변객체아님(변경됨)=> 멀티스레드에서 문제가능 

1) BaseTimeEntity.java 클래스 생성

 

package com.book.book_aws.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 abstract class BaseTimeEntity {

    @CreatedDate
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime modifiedDate;
    
}

 

"BaseTimeEntity클래스""모든 Entity의 상위 클래스"가 된다.

 

 

@MappedSuperclass

JPA Entity 클래스들이 BaseTimeEntity을 상속할 경우

(createdDate, modifiedDate)도 칼럼으로 인식하도록 합니다.

 

@EntityListeners(AuditingEntityListener.class)

BaseTimeEntity클래스에 Auditing 기능을 포함시킨다.

 

 

 

[ JPA Entity가 BaseTimeEntity를 상속하는 모습 ] 

 

 

[ JPA Entity가 BaseTimeEntity를 상속하는 모습 ] 

 

[TEST 결과 확인]