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로 혼자 구현하는 웹서비스
'Project > SpringBoot를 사용해서 웹 서비스를 만들어보자' 카테고리의 다른 글
템플릿 엔진이란 (0) | 2023.08.22 |
---|---|
Spring 웹 계층 (0) | 2023.08.18 |
자주 사용하는 Lombok 어노테이션 정리 (0) | 2023.08.17 |
springboot lombok symbol method builder() 에러 해결 (0) | 2023.08.14 |
mustache 한글 깨짐 오류 (0) | 2023.06.07 |