JPA Auditing은 엔티티의 생성·수정 시각과 생성자·수정자를 저장할 때 자동으로 채워 주는 Spring Data JPA 기능이다. 모든 엔티티에 반복되는 createdAt = now() 코드를 없앤다.
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@Getter
public abstract class BaseEntity {
@CreatedDate @Column(updatable = false) private LocalDateTime createdAt;
@LastModifiedDate private LocalDateTime updatedAt;
@CreatedBy @Column(updatable = false) private String createdBy;
@LastModifiedBy private String updatedBy;
}
@Entity
public class Contact extends BaseEntity { ... }@Configuration
@EnableJpaAuditing(auditorAwareRef = "auditorAware")
public class JpaConfig {
@Bean
AuditorAware<String> auditorAware() {
return () -> Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication())
.filter(Authentication::isAuthenticated)
.map(Authentication::getName);
}
}@EnableJpaAuditing으로 켜고, 엔티티에AuditingEntityListener를 등록한다- 시각은 자동으로 채워지지만, "누가"는 앱이 알려 줘야 한다.
AuditorAware를 구현해 현재 로그인 사용자를 돌려준다(시큐리티 필터체인) - 공통 필드는
@MappedSuperclass기반 클래스로 모은다. 테이블은 엔티티마다 따로 생긴다 - 시각 컬럼은 저장 시점(
@PrePersist·@PreUpdate)에 채워지므로, 벌크UPDATE쿼리에는 적용되지 않는다(JPQL과 @Query)
한계
Auditing은 "마지막으로 누가 언제 바꿨나"만 남긴다. 무엇이 어떻게 바뀌었는지 이력 전체가 필요하면 Hibernate Envers 같은 이력 테이블(audit table)이나, 변경을 이벤트로 남기는 방식(CDC (변경 데이터 캡처))을 쓴다. 장고에서는 auto_now_add·auto_now 필드 옵션이 시각 부분을 같은 방식으로 처리한다(Django 모델 매니저와 QuerySet).
출처: Spring Data JPA 문서: Auditing 애너테이션 · AuditorAware · JPA Auditing 설정