BACKEND/SPRING

Spring Data JPA 활용 - JPA Auditing 적용

우진하다 2023. 8. 13. 22:39

Spring Data JPA의 Auditing 기능은 엔터티의 변경시점에 언제, 누가 엔터티를 생성, 변경했는지에 대한 정보를 자동으로 등록할 수 있게 도와줍니다.

JPA Auditing의 주요 기능

@CreatedBy, @LastModifiedBy: 엔터티가 생성 또는 수정될 때의 수정자 정보를 기록
@CreatedDate, @LastModifiedDate: 엔터티가 생성 또는 수정된 시간을 기록
@EnableJpaAuditing: Spring Data JPA의 Auditing 기능을 활성화

JPA Auditing 적용 방법

Auditing을 활성화
메인 애플리케이션 클래스 또는 설정 클래스에 @EnableJpaAuditing 애노테이션을 추가합니다.

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

 

Base 엔터티 클래스 생성
모든 엔터티에서 공통적으로 사용될 Auditing 관련 필드를 가진 부모 클래스를 생성합니다.

import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
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 BaseEntity {
    
    @CreatedDate
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime lastModifiedDate;

    @CreatedBy
    private String createdBy;

    @LastModifiedBy
    private String lastModifiedBy;

    // getters and setters
}

 

엔터티에 Auditing 적용
Auditing 기능을 적용하려는 엔터티는 위에서 생성한 BaseEntity를 상속받아 사용합니다.

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Post extends BaseEntity {

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

    private String title;

    private String content;

    // ... other fields, getters, setters, etc.
}

 

AuditorAware 구현 (선택사항)
@CreatedBy 및 @LastModifiedBy로 엔터티의 수정자 정보를 기록하려면, 
현재 접속한 사용자 정보를 제공할 수 있는 AuditorAware 인터페이스를 구현해야 합니다.

@Component
public class AuditorAwareImpl implements AuditorAware<String> {

    @Override
    public Optional<String> getCurrentAuditor() {
        // 현재 사용자의 정보를 반환한다. 
        // 예: Spring Security의 경우 SecurityContextHolder를 사용할 수 있다.
        return Optional.of("username"); // 예시로 "username"을 사용했습니다.
    }
}

 

AuditorAware 빈 등록
위에서 정의한 AuditorAwareImpl을 빈으로 등록해야 합니다. 
@Component 애노테이션을 사용하면 자동 등록됩니다.