본문 바로가기

Spring Framework/JPA

[JPA] Note2. @BaseTimeEntity Refactoring

반응형

Note1. @BaseTimeEntity 

대부분의 Entity에는 created_at, updated_at column이 포함되어 있다. 

이러한 생성/수정일자를 관리하는 방식은 여러가지로 개인 프로젝트에서도 아래와 같이 User Entity는 JPA Auditing 기능을 사용하고 Problem Entity에는 생성자에서 생성/수정 일자를 초기화하는 등 여러 방식이 혼합되어 있었다. 

하지만 이는 코드 일관성과 유지보수 측면에서 좋지 않은 코드이고 이러한 생성/수정 일자를 한 곳에서 일괄적으로 관리하기 위해 JPA는 BaseTimeEntity라는 어노테이션을 제공한다. 

 

User Entity 

    @CreatedDate
    @Column(name = "created_at", updatable = false)
    private LocalDateTime createdAt;

    @LastModifiedDate
    @Column(name = "updated_at")
    private LocalDateTime updatedAt;

 

Problem 

    @Column(name = "created_at")
    private LocalDateTime createdAt;

    @Column(name = "updated_at")
    private LocalDateTime updatedAt;

    // 기본 생성자
    public Problem() {
        LocalDateTime now = LocalDateTime.now();
        this.createdAt = now;
        this.updatedAt = now;
    }

 

Note2. Code

전역에서 사용할 BaseTimeEntity를 선언한다. 

@MappedSuperclass 어노테이션으로 엔터티가 아닌 상속용 클래스임을 명시하고, JPA Auditing을 사용해 자동으로 시간을 관리하도록 해주었다. 

/**
 * 모든 엔티티의 공통 시간 필드를 관리하는 Base 클래스
 * - @MappedSuperclass: 엔티티가 아닌 상속용 클래스
 * - JPA Auditing을 사용하여 자동으로 시간 관리
 */
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@Getter
public abstract class BaseTimeEntity {

    @CreatedDate
    @Column(name = "created_at", nullable = false, updatable = false)
    private LocalDateTime createdAt;

    @LastModifiedDate
    @Column(name = "updated_at", nullable = false)
    private LocalDateTime updatedAt;
}

 

created_at, updated_at column을 사용할 엔터티는 별도의 헬퍼 메서드나, 생성자를 선언할 필요 없이 BaseTimeEntity를 상속받기만 하면 자동으로 컬럼이 생성되어 관리된다. 

public class User extends BaseTimeEntity {
...
}
반응형