728x90

데이터의 생성 시간수정 시간은 포스팅, 게시글, 댓글 등 다양한 데이터에서 매우 자주 활용됩니다.

 

이러한 시간 정보를 통해 데이터의 유효성, 최신 상태를 확인할 수 있으며, 데이터를 추적하거나 감사(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형식이 잘 적용된 것을 볼 수 있습니다.