엔티티와 관련된 작업을 하다 보면, 데이터의 등록 시간과 수정 시간과 같이 자동으로 추가되고 변경되어야 하는 칼럼들이 있다. 이를 매번 프로그램 안에서 처리하는 일은 번거롭기 때문에 자동으로 처리할 수 있도록 어노테이션을 이용해서 설정한다.
프로젝트 내에 entity 패키지 속 BaseEntity 클래스를 추상 클래스로 작성하자.
package org.zerock.guestbook.entity;
import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.time.LocalDateTime;
@MappedSuperclass // 이 어노테이션이 적용된 클래스는 테이블로 생성되지 않는다.
// 실제 테이블은 BaseEntity 클래스를 상속한 엔티티의 클래스로 DB 테이블이 생성된다.
@EntityListeners(value = { AuditingEntityListener.class})
@Getter
abstract class BaseEntity {
@CreatedDate
@Column(name = "regdate", updatable = false)
private LocalDateTime regDate;
@LastModifiedDate
@Column(name = "moddate")
private LocalDateTime modDate;
}
BaseEntity 클래스는 @MappedSuperClass라는 특별한 어노테이션이 적용되는데, 해당 어노테이션이 적용된 클래스는 테이블로 생성되지 않는다. 실제 테이블은 BaseEntity 클래스를 상속한 엔티티의 클래스로 데이터베이스 테이블이 생성된다.
JPA는 JPA만의 고유한 메모리 공간(이하 context)을 이용해서 엔티티 객체들을 관리한다. 기존의 MyBatis 방식과 비교하면 다음과 같다.

위의 그림에서 ①, ②, ③의 경우 동일한 객체이건 전혀 다른 객체이건 상관없지만, JPA 방식에서는 해당 엔티티 객체는 유지되고 필요할 때 꺼내서 재사용하는 방식이 된다. 이러한 엔티티 객체에는 어떤 변화가 일어나는 것을 감지하는 리스터가 있다.
AuditingEntityListener : JPA 내부에서 엔티티 객체가 생성/변경되는 것을 감지하는 역할@CreatedDate : JPA에서 엔티티의 생성시간 처리 @LastModifiedDate : 최종 수정 시간을 자동으로 처리하는 용도JPA를 이용하면서
AuditingEntityListener를 활성화시키기 위해서는 프로젝트에 @EnableJpaAuditing 설정을 추가해야 한다.