데이터의 생애 주기(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..,,,,
*/
'🔥스파르타 TIL (Spring)' 카테고리의 다른 글
Redis를 활용한 BlackList 관리 중 깨달은 문제 (0) | 2025.04.23 |
---|---|
Transaction 이란? (0) | 2025.03.14 |
IoC 컨테이너 활용: 생성자 주입과 빈 조회 방식 (0) | 2025.03.06 |
동기(Sync)와 비동기(Async)란? (0) | 2025.03.05 |
Pageable을 알아보자 (0) | 2025.02.25 |