[Spring Boot] JPA Auditing으로 BaseTimeEntity 구현

01_BaseTimeEntity


📍 BaseTimeEntity

모든 엔티티가 공통으로 가져야 할 시간 관련 필드를 모아둔 부모 클래스

자식 엔티티는 BaseTimeEntity를 상속받기만 하면 createdAt, updatedAt 필드를 자동으로 가지게 됨

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;

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseTimeEntity {
    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createdAt;

    @LastModifiedDate
    private LocalDateTime updatedAt;
}

 

🔍 코드 설명

  • @MappedSuperclass: 클래스를 상속받는 엔티티에 필드만 물려줌. 테이블로 생성되지 않음
  • @EntityListeners(AuditingEntityListener.class): 엔티티가 저장, 수정될 때 이벤트를 감지하여 콜백을 실행하는 리스너를 등록함
  • @Column(updatable = false): JPA Auditing의 동작에만 의존하지 않고, DB 레벨에서도 수정을 막아둠

 

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member extends BaseTimeEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    // ...
}

 

시간 필드가 필요한 엔티티는 BaseTimeEntity를 상속하면 된다.

 

 

 

📍 LocalDateTime vs Instant

타입 특징 사용 시점
LocalDateTime 타임존 정보가 없는 로컬 시간 단일 지역 서비스, JVM 시간대를 그대로 사용해도 무방한 경우
Instant UTC 기준 시각 글로벌 서비스, 분산 환경, 여러 타임존을 다뤄야 하는 경우
ZonedDateTime 타임존 정보를 포함한 시각 시간대 변환이 빈번하게 필요한 경우

 

 

 

 

02_JPA Auditing


📍 @EnableJpaAuditing

@EntityListeners(AuditingEntityListener.class) 만 붙여서는 BaseTimeEntity가 동작하지 않음

Auditing 기능을 스프링 부트 애플리케이션 전역에서 활성화해야 함

@EnableJpaAuditing
@SpringBootApplication
public class MainApplication {

    public static void main(String[] args) {
        SpringApplication.run(UnisApplication.class, args);
    }
}

 

🔍 코드 설명

  • @EnableJpaAuditing: 스프링 컨텍스트에 Auditing 관련 빈을 등록. 없다면 createdAt, updatedAt이 항상 null로 저장됨