[그림일기 서비스 보고 공부하기] BaseEntity 공부하기

오젼·2024년 10월 5일
0
import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import jakarta.validation.constraints.NotNull;
import java.time.LocalDateTime;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

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

    @NotNull
    @CreatedDate
    @Column(nullable = false, updatable = false)
    private LocalDateTime createdAt;
}

abstract class 사용 이유

추상 클래스로 만듦으로써, BaseEntity는 직접 인스턴스화될 수 없다.

BaseEntity가 독립적으로 사용되는 것을 방지하고, 반드시 다른 클래스에 의해 상속되어야 함을 명시적으로 나타내기 위함. MappedSuperclass일 때 abstract class로 만드는 것이 권장된다고 한다.

https://ict-nroo.tistory.com/129

@MappedSuperclass

이 어노테이션은 JPA에게 이 클래스가 데이터베이스 테이블과 직접 매핑되지 않고, 단지 자식 엔티티들에게 매핑 정보를 전달하기 위한 부모 클래스임을 알려준다.

JPA가 상속관계를 올바르게 처리하게 하기 위해 꼭 필요한 설정이다.

생길 수 있는 문제:
a) JPA가 BaseEntity를 독립적인 엔티티로 인식하여 별도의 테이블을 생성하려고 할 수 있다.
b) 자식 엔티티들이 BaseEntity의 필드를 상속받지만, 이 필드들이 데이터베이스 테이블에 제대로 매핑되지 않을 수 있다.

@EntityListeners(AuditingEntityListener.class)

@EntityListeners: 엔티티의 생명주기 이벤트를 감지하고 처리하기 위한 리스너를 지정하는 어노테이션. JPA의 어노테이션이다.

AuditingEntityListener: AuditingEntityListener는 엔티티의 생성 시간, 수정 시간, 생성자, 수정자 등의 감사(Auditing) 정보를 자동으로 관리한다.

JPA 엔티티의 생명주기 이벤트(예: 저장, 업데이트)가 발생할 때마다 AuditingEntityListener가 호출된다. AuditingEntityListener는 @CreatedDate, @LastModifiedDate, @CreatedBy, @LastModifiedBy 등의 어노테이션이 붙은 필드를 찾아 자동으로 값을 설정한다.

❗️ 이게 활성화 되려면 애플리케이션 클래스에 @EnableJpaAuditing를 추가해야 한다.

@EnableJpaAuditing
@SpringBootApplication
public class MyApplication {
    // ...
}

0개의 댓글