JPA 엔티티의 생명주기 이벤트(생성, 수정 등)에 반응하여 자동으로 특정 메서드를 실행할 수 있게 해주는 기능이다.

→ 핵심 목적: 반복되는 엔티티 전처리/후처리 로직을 재사용 가능하게 분리.

 

어노테이션명  호출시점
@PrePersist insert 쿼리 실행 전
@PostPersist insert 쿼리 실행 후
@PreUpdate update 쿼리 실행 전
@PostUpdate update 쿼리 실행 후
@PreRemove delete 쿼리 실행 전
@PostRemove delete 쿼리 실행 후
@PostLoad select 쿼리 실행 후
import java.time.LocalDateTime;

public interface Auditable {
		LocalDataTime getCreateAt();
		LocalDataTime getUpdateAt();

    void setCreatedAt(LocalDateTime createdAt);
    void setUpdatedAt(LocalDateTime updatedAt);
}

import jakarta.persistence.*;

import java.time.LocalDateTime;

public class AuditListener {

    @PrePersist
    public void perPersist(Object o) {
        if (o instanceof Auditable) {
            ((Auditable) o).setCreateAt(LocalDateTime.now());
            ((Auditable) o).setUpdateAt(LocalDateTime.now());
        }
    }

    @PreUpdate
    public void perUpdate(Object o) {
        if (o instanceof Auditable) {
            ((Auditable) o).setUpdateAt(LocalDateTime.now());
        }
    }
}

import jakarta.persistence.*;
import java.time.LocalDateTime;

@Entity
@NoArgsConstructor
@Data
@EntityListeners(AuditListener.class)
public class Post implements Auditable {

    @Id
    @GeneratedValue
    private Long id;

    private String title;
    
    private LocalDateTime createdAt;
    
    private LocalDateTime updatedAt;

  
    // getter/setter 생략 가능
}

 

AuditingEntityListener

Spring Boot에서 제공하는 AuditingEntityListener는 Spring Data JPA의 감사(Auditing) 기능을 자동화해주는 리스너 클래스다. 이 리스너를 통해 createdDate, lastModifiedDate, createdBy, lastModifiedBy 같은 필드를 자동으로 관리할 수 있다.

import jakarta.persistence.*;
import lombok.Data;
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
@EntityListeners(AuditingEntityListener.class)
@Data
public class BaseEntity {

    @CreatedDate
    private LocalDateTime createdAt;

    @LastModifiedDate
    private LocalDateTime updatedAt;
}
import jakarta.persistence.*;
import java.time.LocalDateTime;

@Entity
@NoArgsConstructor
@Data
@ToString(callSuper= true)
@EqualsAndHashCode(callSuper= true)
@EntityListeners(AuditListener.class)
public class Post extends BaseEntity implements Auditable {

    @Id
    @GeneratedValue
    private Long id;

    private String title;
    
}

'Spring' 카테고리의 다른 글

JPA - 1:N 연관 관계  (0) 2025.06.16
JPA - 1:1 연관 관계  (0) 2025.06.16
JPA  (1) 2025.06.06
Jacoco - 테스트 커버리지 확인하기  (1) 2025.04.21
JUnit  (0) 2025.04.21

+ Recent posts