soduddl1 2023. 8. 17. 16:45

JPA Auditing 이란?

엔티티에는 해당 데이터의 생성시간과 수정시간을 포함한다. 생성시간과 수정시간은 유지보수에 있어서 굉장히 중요한 정보이기 때문이다. 엔티티의 생성, 수정 서비스 로직이 실행될 때 날짜 데이터를 등록/수정하는 코드가 반복적으로 들어가야한다. 반복 작업을 해결하고자 JPA Auditing을 사용한다.

 

Spring Data JPA는 Auditing이라는 기능을 제공한다. 엔티티가 생성되고 변경되는 그 시점을 감지하여 생성시각, 수정시각, 생성한 사람, 수정한 사람을 자동으로 기록할 수 있다. 

 

Auditing 사용 예제

BaseTimeEntity.java

생성시간과 수정시간은 대부분의 엔티티에서 사용되는 필드이기 때문에, 별개의 엔티티 클래스로 분리하고 다른 엔티티에서 상속받아서 사용한다. 그러면 중복 코드를 제거할 수 있다.

import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
    @CreatedDate
    private LocalDateTime createDate;
    @LastModifiedDate
    private LocalDateTime modifiedDate;
}

어노테이션 설명

@MappedSuperclass

  • 공통 매핑 정보가 필요할 때 부모 클래스에 선언된 필드를 상속받아서 그래도 사용할 때 사용한다. 이때 부모 클래스 테이블은 별도로 생성되지 않는다.
  • JPA Entity 클래스들이 BaseTimeEntity를 상속할 경우 createDate, modifiedDate 필드도 칼럼으로 인식한다.

@EntityListeners(AuditingEntityListener.class)

  • BaseTimeEntity 클래스에 Auditing 기능을 포함한다.
  • EntityListeners는 엔티티의 변화를 감지하여 엔티티와 매핑된 테이블의 데이터를 조작한다.
  • AuditingEntityListener.class는 Spring Data JPA에서 제공하는 이벤트 리스너로, 엔티티의 영속, 수정 이벤트를 감지하는 역할을 한다.

@CreatedDate

  • Entity가 생성되어 저장될 때 시간이 자동 저장된다.

@LastModifiedDate

  • 조회한 Entity의 값을 변경할 때 시간이 자동으로 저장된다.

Posts.java

Posts클래스가 @MappedSuperclass가 적용된 BaseTimeEntity 추상 클래스를 상속받도록 변경한다. JPA는 생성일자 수정일자 컬럼을 인식하게 된다. Posts 엔티티가 수정, 등록 서비스를 동작할 때 자동으로 필드 값이 등록된다.

 

import fintech_service.fintech_service_backend.domain.BaseTimeEntity;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@Entity
public class Posts extends BaseTimeEntity {

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

    @Column(length = 500, nullable = false)
    private String title;

    @Column(columnDefinition = "TEXT", nullable = false)
    private String content;

    private String author;

    @Builder
    public Posts(String title, String content, String author) {
        this.title = title;
        this.content = content;
        this.author = author;
    }

    public void update(String title, String content){
        this.title = title;
        this.content = content;
    }
}

JPA Auditing 활성화

JPA Auditing 어노테이션들을 모두 활성화할 수 있도록 Application 클래스에 활성화 어노테이션을 추가한다.

@EnableJpaAuditing 추가

package fintech_service.fintech_service_backend;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@EnableJpaAuditing
@SpringBootApplication
public class FintechServiceBackendApplication {

	public static void main(String[] args) {
		SpringApplication.run(FintechServiceBackendApplication.class, args);
	}

}

 

참고
스프링 부트와 AWS로 혼자 구현하는 웹서비스