🔥스파르타 TIL (Spring)

JPA Auditing 이란?

승승장규 2025. 3. 7. 12:11

데이터의 생애 주기(Lifecycle)를 추적하고 관리하기 위해 사용할 수 있다. JPA Auditing과 LocalDateTime을 사용하면 각 엔티티의 생성, 수정, 삭제 시점과 같은 중요한 정보를 자동으로 기록하고 관리할 수 있다.

 

엔티티의 수명 동안 언제 생성되고 수정되었는지 추적하는 것은 시스템의 변경 내역을 관리한다. 예를 들어, 사용자가 데이터를 수정하거나 새로운 엔티티를 추가할 때, 데이터가 언제 어떻게 변경되었는지 알 수 있어서 문제가 발생한 시점이나 원인을 추적하는 데 용이하고, 누가 언제 데이터를 변경했는지 기록할 수 있어서 보안 감사, 법적 요구사항 등을 충족하는 데 필요할 수 있다.

데이터의 생성일과 수정일을 추적하면, 더 이상 사용되지 않는 오래된 데이터를 쉽게 식별할 수 있어서 특정 기간 동안 사용되지 않은 데이터를 삭제하거나 보관할 수 있다.

LocalDateTime을 사용하여 각 엔티티의 생애 주기를 추적하면, 특정 시간에 데이터를 만료시키거나 갱신하는 작업을 자동화할 수 있다. 예를 들어, 임시 데이터를 일정 시간 후에 자동으로 삭제하거나, 수명을 기준으로 데이터를 갱신하는 작업을 처리할 수 있다.

 

왜 굳이 JPA Auditing을 사용해야 할까?

 

JPA Auditing을 사용하지 않으면, 엔티티의 생성일, 수정일, 생성자, 수정자 등을 수동으로 관리해야 하는데, 이를 위해서는 각 엔티티 클래스에서 필드를 수동으로 설정하고, 생성 및 수정 시 이를 코드로 관리해야 한다.

@Entity
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    
    // 수동으로 생성 및 수정 일자 필드를 추가
    private LocalDateTime createdAt;
    private LocalDateTime modifiedAt;

    private String createdBy;
    private String modifiedBy;

    // 생성자, 수정자 필드를 수동으로 관리해야 함
    @PrePersist
    public void prePersist() {
        this.createdAt = LocalDateTime.now();
        this.createdBy = "ADMIN";
    }

    @PreUpdate
    public void preUpdate() {
        this.modifiedAt = LocalDateTime.now();
        this.modifiedBy = "ADMIN";
    }
}

 

JPA Auditing을 사용하면, @CreatedDate, @LastModifiedDate, @CreatedBy, @LastModifiedBy 등을 사용하여 엔티티의 날짜와 사용자 정보를 자동으로 관리할 수 있다.

 

JPA Auditing을 사용하려면 @EnableJpaAuditing 어노테이션을 달아줘야 하고,

@SpringBootApplication 어노테이션이 달려있는 메인 클래스에 @EnableJpaAuditing 어노테이션을 추가로 달아줘야 한다.

@Getter
@MappedSuperclass // JPA Entity 클래스들이 이 추상 클래스에 설정한 변수들을 컬럼으로 인식하게 해줌
@EntityListeners(AuditingEntityListener.class)
// 추상화 시킨 이유는 이 클래스 자체를 객체로 생성할 필요가 없기 때문에
public abstract class Timestamped {

    @CreatedDate
    @Column(updatable = false) // 최초 생성 시간만 저장하기 위해 update 방지
    @Temporal(TemporalType.TIMESTAMP) // 자바의 Date, Calendar와 같은 날짜 데이터를 매핑할 때 사용
    private LocalDateTime createdAt;

    @LastModifiedDate
    @Column
    @Temporal(TemporalType.TIMESTAMP)
    private LocalDateTime modifiedAt;
}

==========================================================================================

// 위에서 작성한 TimeStamped 추상 클래스를 상속 받아서 사용하면 된다. 이렇게 되면 추가로 진행할 Entity에도 
// 상속받아서 사용할 수 있다.
@Entity
public class Product extends TimeStamped{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;
}


/*
   DATE : XXXX-XX-XX
   TIME : XX:XX:XX
   TIMESTAMP : XXXX-XX-XX XX:XX:XX..,,,,
*/