JPA Auditing

청포도봉봉이·2023년 8월 27일
1

Spring

목록 보기
25/32
post-thumbnail

✅ 개요

@Entity
public class Comment {
    ...

    @Column(nullable = false)
    private LocalDateTime createDate;

    @Column(nullable = false)
    private LocalDateTime updateDate;
}

아래와 같은 소스에서 Entity를 생성할때마다 날짜를 추가해주는게 너무 비효율적이라고 생각했습니다. 이를 해결하기 위해서 JPA Auditing 이용했습니다. 이를 이용하면 @CreatedDate@LastModifiedDate 어노테이션을 사용하여 LocalDateTime 변수에 자동으로 생성 및 수정 시간을 설정할 수 있습니다.




👉Audit 클래스 생성

package study.till.back.entity;

import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.Column;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {

    @CreatedDate
    @Column(nullable = false)
    private LocalDateTime createDate;
 
    @LastModifiedDate
    @Column(nullable = false)
    private LocalDateTime updateDate;
}

Audit 전용 클래스이며 공통으로 사용될 createDate, updateDate 속성을 가집니다. @CreatedDate@LastModifiedDate 어노테이션을 사용해주고, @EntityListeners(AuditingEntityListener.class) 어노테이션을 통해 자동으로 설정되도록 도와줍니다.

BaseTimeEntity는 JPA에서 공통적으로 사용되는 시간 베이스 엔티티 클래스입니다. 이 클래스는 생성 및 수정 시간을 자동으로 관리하는 것을 목적으로 합니다. 이를 구성하려면 다음 요소들이 필요합니다:
@MappedSuperclass: 이 어노테이션은 현재 클래스를 JPA 엔티티가 아닌, 다른 엔티티 클래스에서 상속 받아 사용할 '기반 클래스'로 표시하는 데 사용됩니다. 이렇게 하면 상속하는 하위 클래스에는 기반 클래스의 멤버 필드를 마치 자기 자신의 멤버 필드처럼 사용할 수 있습니다.
@EntityListeners(AuditingEntityListener.class): 이 어노테이션은 엔티티를 생성/수정할 때마다 특정 리스너(이 경우에는 AuditingEntityListener)를 통해 엔티티의 시간 정보를 자동으로 업데이트합니다.
@CreatedDate: 이 어노테이션은 엔티티가 최초 생성되어 저장될 때 생성 시간을 자동으로 설정해줍니다. 여기서는 createDate 필드에 적용되어 있습니다.
@LastModifiedDate: 이 어노테이션은 엔티티가 수정될 때마다 수정 시간을 자동으로 설정해줍니다. 여기서는 updateDate 필드에 적용되어 있습니다.

BaseTimeEntity는 다른 엔티티 클래스에서 상속받아 공통적인 생성 및 수정 시간 관리 기능을 제공합니다. 이렇게 사용함으로써 매 엔티티 클래스마다 생성 및 수정 시간 관련 코드를 중복해서 작성하지 않아도 됩니다. 예를 들어, 상술한 Comment 엔티티 클래스에서 BaseTimeEntity를 상속받기만 하면 자동으로 생성 및 수정 시간 관리 기능이 활성화됩니다. 이를 통해 코드의 중복성도 줄이고 유지 보수성을 높일 수 있습니다.


👉Comment 클래스 수정

@Entity
public class Comment extends BaseTimeEntity {
    ...

    ...
}

이제 Comment 클래스의 createDate와 updateDate가 자동으로 생성 및 수정 시간을 설정할 수 있도록 구성되었습니다. 이러한근 방식은 동적인 값인 생성 및 수정 시간을 관리하는 데 적합합니다.

profile
자존감 낮아질 시간에 열심히 학습하고 커밋하자

0개의 댓글