본문 바로가기
DBMS

Jpa Audit

by Ahngyuho 2024. 10. 21.

Auditing 이란?

Spring Data는 엔티티를 만들고, 수정한 사람 및 날짜를 부여해주는 기능을 제공합니다.

엔티티에 메타 데이터 부여를 도와준다는 것인데 제공하는 방식은 애너테이션 혹은 인터페이스 입니다.

Audit 기능을 활용하기 위해선 3가지 과정이 필요합니다.

  1. 애너테이션을 통해 메타데이터 지정
  2. 사용자 인식을 위한 AuditAware 인터페이스 구현
  3. 해당하는 설정 클래스에 @EnableJpaAuditing 애너테이션 붙여주기

이제 구체적으로 어떻게 적용할 수 있는지 알아봅시다!

애너테이션

@Entity
public class UserAccount {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String userName;
    private String password;

    @CreatedBy private String createdBy;
    @CreatedDate private LocalDateTime createdDate;
    @LastModifiedBy private String lastModifiedBy;
    @LastModifiedDate private LocalDateTime lastModifiedDate;

    protected UserAccount() {

    }

    @Builder
    public UserAccount(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }
}

이런 애너테이션을 붙여주는 것으로 Audit 기능을 활용하기 위해 필요한 것 하나는 마무리 되었습니다.

인터페이스 AuditAware

생성한 시간, 수정한 시간 같은 경우는 요청이 일어난 시간을 기준으로 값을 넣어줄 수 있습니다.

하지만 생성한 사람, 수정한 사람 같은 경우는 인증 기능을 필요로 합니다.

이 요청을 정확히 누가 했는지 알아야 이 정보를 자동으로 넣어줄 수 있으니까요.

 

보통 스프링 개발 환경에서 인증은 Spring Security를 사용하기 때문에 Spring Security 프레임워크에 의존하는 방식으로

구현하는 것이 일반적입니다.

Spring Security의 Authenticaion 객체를 통해 요청한 사람을 인식할 수 있습니다.

@EnableJpaAuditing
@Configuration
public class JpaConfig {

    @Bean
    public AuditorAware<String> auditorAware() {
        return () -> Optional.ofNullable(SecurityContextHolder.getContext())
                .map(SecurityContext::getAuthentication)
                .filter(Authentication::isAuthenticated)
                .map(Authentication::getPrincipal)
                .map(BoardPrincipal.class::cast)
                .map(BoardPrincipal::getUsername);
    }

}

핵심은 인증 처리된 사용자를 리턴할 수 있도록 구현하면 된다는 것입니다.

설정 방법

이제 이 기능을 사용한다는 것을 Spring Data Jpa 에게 알려줘야 합니다.

Spring Data Jpa는 AuditingEntityListener  라는 리스너를 제공하고, 개발자는 이를 활성화 하여 Audit 기능을 사용할 수 있습니다.

@EnableJpaAuditing  
@Configuration  
public class JpaConfig {

    @Bean
    public AuditorAware<String> auditorAware(){

        return () -> Optional.ofNullable(SecurityContextHolder.getContext())
                .map(SecurityContext::getAuthentication)
                .filter(Authentication::isAuthenticated)
                .map(Authentication::getPrincipal)
                .map(BoardPrincipal.class::cast)
                .map(BoardPrincipal::getUsername);
    }
}

@EnableJpaAuditing 를 설정 클래스에 같이 붙여주면 Audit 기능을 활성화 할 수 있습니다.

AuditorAware 를 구현하는 클래스를 ApplicationContext에 노출함으로써 Audit 기능이 사용자 인식에 필요한 정보를 제공해 줄 수 있습니다.