@Entity
public class Comment {
...
@Column(nullable = false)
private LocalDateTime createDate;
@Column(nullable = false)
private LocalDateTime updateDate;
}
아래와 같은 소스에서 Entity를 생성할때마다 날짜를 추가해주는게 너무 비효율적이라고 생각했습니다. 이를 해결하기 위해서 JPA Auditing
이용했습니다. 이를 이용하면 @CreatedDate
와 @LastModifiedDate
어노테이션을 사용하여 LocalDateTime 변수에 자동으로 생성 및 수정 시간을 설정할 수 있습니다.
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를 상속받기만 하면 자동으로 생성 및 수정 시간 관리 기능이 활성화됩니다. 이를 통해 코드의 중복성도 줄이고 유지 보수성을 높일 수 있습니다.
@Entity
public class Comment extends BaseTimeEntity {
...
...
}
이제 Comment 클래스의 createDate와 updateDate가 자동으로 생성 및 수정 시간을 설정할 수 있도록 구성되었습니다. 이러한근 방식은 동적인 값인 생성 및 수정 시간을 관리하는 데 적합합니다.