데이터의 생성 시간과 수정 시간은 포스팅, 게시글, 댓글 등 다양한 데이터에서 매우 자주 활용됩니다.
이러한 시간 정보를 통해 데이터의 유효성, 최신 상태를 확인할 수 있으며, 데이터를 추적하거나 감사(Audit)하는 데 중요한 역할을 합니다.
하지만 각각의 엔티티에서 생성 및 수정 시간을 매번 수동으로 작성하는 것은 매우 비효율적입니다.
이러한 작업을 자동으로 처리하는 것이 JPA Auditing입니다.
JPA Auditing란❓
JPA Auditing는 데이터베이스 엔티티의 생성 및 수정 정보를 자동으로 기록하고 관리하는 기능입니다.
JPA Auditing 기능을 통해 다음과 같은 정보를 자동으로 기록할 수 있습니다.
- 생성 시간
- Entity가 처음 생성된 시간
- 수정 시간
- Entity가 마지막으로 수정된 시간
- 생성자
- Entity를 생성한 사용자
- 수정자
- Entity를 마지막으로 수정한 사용자
JPA Auditing 설정
1. 의존성 추가
Maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Gradle
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
2. @EnableJpaAuditing 어노테이션 추가
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@SpringBootApplication
@EnableJpaAuditing
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
JPA Auditing을 활성화하려면 @EnableJpaAuditing 어노테이션을 사용해야 합니다. 이 어노테이션을 @SpringBootApplication 어노테이션이 있는 클래스에 추가하여 JPA Auditing 기능을 설정합니다.
3. Auditing 추상 클래스 구현
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class Auditable {
@CreatedDate
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime lastModifiedDate;
// Getters and Setters
}
TimeStamp를 구현한 클래스를 Entity클래스로 사용하는 경우는 일반적이지 않습니다. 따라서 @abstract 즉 추상클래스로 주로 선언을 합니다.
엔티티에서 JPA Auditing 기능을 사용하려면, @CreatedDate, @LastModifiedDate, @CreatedBy, @LastModifiedBy 등의 어노테이션을 사용할 수 있습니다. 이를 위해 Auditing 추상 클래스를 구현하여 공통 필드를 정의할 수 있습니다.
4. 엔티티 클래스에 Auditing 설정 추가
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class User extends Auditable {
@Id
private Long id;
private String name;
private String email;
// Getters and Setters
}
Auditing 추상 클래스를 상속받아 JPA Auditing을 적용합니다. 이를 통해 Entity 클래스에서 생성 및 수정 정보를 자동으로 기록할 수 있습니다.
@MappedSuperclass
import javax.persistence.MappedSuperclass;
import javax.persistence.Column;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import java.time.LocalDateTime;
@MappedSuperclass
public abstract class Auditable {
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime modifiedAt;
// Getters and Setters
}
@MappedSuperclass는 JPA의 추상 클래스에 사용됩니다. 이 어노테이션을 사용하면, 해당 클래스를 상속받는 엔티티 클래스에서 공통된 필드와 매핑 정보를 재사용할 수 있습니다.
생성 시간과 수정 시간과 같은 공통 필드를 정의하는 추상 클래스를 만들 때 사용됩니다.
@EntityListeners(AuditingEntityListener.class)
import javax.persistence.Entity;
import javax.persistence.Id;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@Entity
@EntityListeners(AuditingEntityListener.class)
public class User extends Auditable {
@Id
private Long id;
private String name;
// Getters and Setters
}
@EntityListeners는 엔티티 리스너를 지정하는 어노테이션입니다.
AuditingEntityListener.class를 사용하면, 엔티티에 대한 생성 및 수정 시간 자동 관리를 포함하는 Auditing 기능을 활성화합니다.
Auditing 기능을 포함할 @MappedSuperclass 클래스나 개별 엔티티 클래스에 추가하면 됩니다.
@CreatedDate
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdAt;
@CreatedDate는 엔티티가 처음 저장될 때 생성 시간을 자동으로 기록합니다. 이 필드는 객체가 생성될 때의 시간을 저장하며, 이후에는 변경되지 않습니다.
객체가 생성될 때의 시간은 처음 생성했을 때 이후에 변하면 안 되기 때문에 updatable = false 옵션을 추가하여 수정 불가능하도록 설정해야 합니다.
@LastModifiedDate
@LastModifiedDate
private LocalDateTime modifiedAt;
@LastModifiedDate는 엔티티가 수정될 때마다 변경 시간을 자동으로 기록합니다. 처음 생성된 시간 이후에 엔티티가 변경될 때마다 업데이트됩니다.
@Temporal
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Temporal(TemporalType.TIMESTAMP)
private Date createdAt;
@Temporal은 날짜와 시간을 데이터베이스와 매핑할 때 사용됩니다. JPA는 날짜 및 시간의 세 가지 주요 타입(DATE, TIME, TIMESTAMP)을 지원합니다.
- DATE: 날짜만 저장 (2023-01-01)
- TIME: 시간만 저장 (20:21:14)
- TIMESTAMP: 날짜와 시간 모두 저장 (2023-01-01 20:22:38.771000)
JPA Auditing 적용
위 데이터베이스를 보면 잘 상속되어서 DB Column이 존재하는 것을 볼 수 있습니다.
그리고 데이터를 저장하면 데이터 베이스에 TimStamp 형식이 잘 들어갔고, 실제 화면을 보더라도 undefined ➡️ TimeStamp 형식, TimStamp형식이 잘 적용된 것을 볼 수 있습니다.
'Framework > JPA' 카테고리의 다른 글
[JPA] @Lock 어노테이션이란 무엇일까❓: 다양한 LockModeType 잠금 모드 (0) | 2024.08.21 |
---|---|
[JPA] Query Method란 무엇일까 ❓ (0) | 2024.07.27 |
[JPA] JPA의 복잡함을 줄이는 Spring Data JPA (0) | 2024.07.27 |
[JPA] 트랜잭션 관리와 영속성 컨텍스트의 관계 (@Transaction, 트랜잭션 전파) (0) | 2024.07.27 |
[JPA] JPA Entity 상태 (비영속, 영속, 준영속, 삭제 상태의 이해) (0) | 2024.07.27 |