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;
}
추상 클래스로 만듦으로써, BaseEntity는 직접 인스턴스화될 수 없다.
BaseEntity가 독립적으로 사용되는 것을 방지
하고, 반드시 다른 클래스에 의해 상속되어야 함을 명시적으로 나타내기 위함. MappedSuperclass일 때 abstract class로 만드는 것이 권장된다고 한다.
https://ict-nroo.tistory.com/129
이 어노테이션은 JPA
에게 이 클래스가 데이터베이스 테이블과 직접 매핑되지 않고
, 단지 자식 엔티티들에게 매핑 정보를 전달하기 위한 부모 클래스임을 알려준다.
JPA가 상속관계를 올바르게 처리하게 하기 위해 꼭 필요한 설정이다.
생길 수 있는 문제:
a) JPA가 BaseEntity를 독립적인 엔티티로 인식하여 별도의 테이블을 생성하려고 할 수 있다.
b) 자식 엔티티들이 BaseEntity의 필드를 상속받지만, 이 필드들이 데이터베이스 테이블에 제대로 매핑되지 않을 수 있다.
@EntityListeners
: 엔티티의 생명주기 이벤트를 감지하고 처리하기 위한 리스너를 지정하는 어노테이션. JPA의 어노테이션이다.
AuditingEntityListener
: AuditingEntityListener는 엔티티의 생성 시간, 수정 시간, 생성자, 수정자 등의 감사(Auditing) 정보를 자동으로 관리한다.
JPA 엔티티의 생명주기 이벤트(예: 저장, 업데이트)가 발생할 때마다 AuditingEntityListener가 호출된다. AuditingEntityListener는 @CreatedDate, @LastModifiedDate, @CreatedBy, @LastModifiedBy 등의 어노테이션이 붙은 필드를 찾아 자동으로 값을 설정한다.
❗️ 이게 활성화 되려면 애플리케이션 클래스에 @EnableJpaAuditing를 추가해야 한다.
@EnableJpaAuditing
@SpringBootApplication
public class MyApplication {
// ...
}