Hello

[JPA] JPA Auditing이란 (+Spring Data JPA Auditing) 본문

java

[JPA] JPA Auditing이란 (+Spring Data JPA Auditing)

nari0_0 2023. 11. 17. 18:03
728x90

Auditing는 '감사하다' 의미를 갖고 있습니다. 엔티티의 시간 데이터가 변경돨 때마다 입력/수정 코드를 구현해야한다. 하지만, JPA Auditing를 사용해 공통으로 처리할 수 있습니다.

1. 표준 JPA를 사용해 구현하는 방법

2. Spring Data JPA를 사용해 구현하는 방법

표준 JPA를 사용

JPA에는 Auditing(감사) API가 명시적으로 포함되어 있지 않지만, 엔터티 수명 주기 이벤트를 사용하여 이 기능을 구현할 수 있습니다. + https://www.baeldung.com/jpa-entity-lifecycle-events

 

 

@PrePersist, @PreUpdate 등 jpa 엔티티 수명 주기 이벤트를 목적에 맞게 사용할 수 있습니다.

콜백 메서드는 항상 void를 반환해야 하며 인수를 받으면 안됩니다. 모든 이름과 액세스 수준을 가질 수 있지만 static 이어서는 안 됩니다.

import jakarta.persistence.*;
import java.time.LocalDateTime;

@Entity
@Table(name = "tb_test_date")
public class TestDate {
    private Integer id;
    private LocalDateTime createDate;
    private LocalDateTime modifiedDate;

...

    @PrePersist
    @PreUpdate
    public void onRegDate() {
        LocalDateTime now = LocalDateTime.now();
        this.createDate = now;
        this.modifiedDate = now;
    }
}

 

JPA는 콜백 리스너 클래스를 지정하기 위해 @EntityListeners 어노테이션을 제공합니다.

auditing을 여러 클래스에 추가해야하는 경우 @EntityListeners를 사용해 코드를 중앙 집중화 할 수 있습니다.

@EntityListeners(AuditListener.class)
@Entity
public class TestDate { ... }

public class AuditListener {
    @PrePersist
    @PreUpdate
    @PreRemove
    private void onAudit(Object object) { ... }
}

 

Spring Data JPA를 사용

Spring Data JPA는 표준 JPA에 추가 추상화 계층을 추가하여 JPA를 확장하는 프레임워크입니다. 이 계층은 Spring JPA 저장소 인터페이스를 확장하여 JPA 저장소 생성을 지원합니다.

 

CRUD 작업을 위한 인터페이스 인 CrudRepository<T, ID>를 확장할 수 있습니다. 저장소를 생성하고 다른 구성 요소에 주입해 Spring Data는 자동으로 구현을 제공하고 감사 기능을 추가할 준비가 됩니다. 엔티티의 생성시각, 수정시각, 생성한 사람, 수정한 사람을 기록할 수 있습니다.

 

@EntityListeners에 Spring Data JPA가 제공하는 엔터티 리스너 클래스인 AuditingEntityListener를 지정해 auditing을 등록할 수 있습니다.

Spring Data JPA 1.5이후 버전부터는 Java 구성을 통해 auditing을 활성하는 방법. +spring docs

@SpringBootApplication
@EnableJpaAuditing
public class TestDateApplication {
    public static void main(String[] args) {
        SpringApplication.run(TestDateApplication.class, args);
    }
}

 

@CreatedDate, @LastModifiedDate를 사용해 등록일, 수정일을 자동으로 설정합니다.

import jakarta.persistence.*;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.time.LocalDateTime;

@Entity
@Table(name = "tb_test_date")
@EntityListeners(AuditingEntityListener.class)
public class TestDate {
    private Integer id;
    private LocalDateTime createDate;
    private LocalDateTime modifiedDate;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Column(name = "create_date")
    @CreatedDate
    public LocalDateTime getCreateDate() {
        return createDate;
    }

    public void setCreateDate(LocalDateTime createDate) {
        this.createDate = createDate;
    }

    @Column(name = "modified_date")
    @LastModifiedDate
    public LocalDateTime getModifiedDate() {
        return modifiedDate;
    }

    public void setModifiedDate(LocalDateTime modifiedDate) {
        this.modifiedDate = modifiedDate;
    }
}

 

@CreatedBy, @LastModifiedBy를 사용하는 방법은 추후 Spring Security를 적용해 정리하도록 할 예정입니다.

 

참고 :

baeldung에는 hibernate auditing사용 방법도 정리 되어 있습니다.

https://www.baeldung.com/database-auditing-jpa

728x90