토리맘의 한글라이즈 프로젝트 logo 토리맘의 한글라이즈 프로젝트

스프링 데이터 R2DBC 공식 레퍼런스를 한글로 번역한 문서입니다.

전체 목차는 여기에 있습니다.

목차


스프링 데이터는 누가, 언제 엔티티를 생성하고 변경했는지를 투명하게 추적해 주는 정교한 감사(auditing) 기능을 지원한다. 감사 기능을 활용하려면, 엔티티 클래스에 메타데이터가 필요하다. 메타데이터는 어노테이션이나 인터페이스를 구현해서 정의할 수 있다.


15.1. Basics

15.1.1. Annotation-based Auditing Metadata

누가 엔티티를 만들고 생성했는지 추적하려면 @CreatedBy, @LastModifiedBy를, 언제 발생했는지를 추적하려면 @CreatedDate, @LastModifiedDate를 선언해라.

Example 80. An audited entity

class Customer {

  @CreatedBy
  private User user;

  @CreatedDate
  private DateTime createdDate;

  // … further properties omitted
}

보다시피 추적하고 싶은 정보에 따라 원하는 어노테이션만 적용할 수 있다. 변경 시점을 잡아내는 어노테이션은 Joda-Time, DateTime, 자바 레거시 Date/Calendar, JDK8 date/time 타입, long, Long 타입 프로퍼티에 사용할 수 있다.

15.1.2. Interface-based Auditing Metadata

어노테이션으로 감사 메타데이터를 정의하는 게 싫다면, 도메인 클래스가 Auditable 인터페이스를 구현하면 된다. 이 인터페이스는 모든 감사 프로퍼티를 위한 setter 메소드를 노출한다.

직접 인터페이스 메소드를 구현하는 대신에 간편하게 베이스 클래스 AbstractAuditable을 상속해도 된다. 하지만 클래스를 상속하면, 도메인 클래스와 스프링 데이터의 결합도가 높아지기 때문에 피하고 싶은 방법일 수 있다. 보통은 어노테이션으로 감사 메타데이터를 정의하는 게 덜 침습적이면서도 좀 더 유연하기 때문에 어노테이션을 선호한다.

15.1.3. AuditorAware

@CreatedBy@LastModifiedBy를 사용한다면, 감사 인프라는 어떻게든 현재 주체(principal)가 누구인지를 알아내야 한다. 따라서 스프링 데이터는 AuditorAware<T> SPI 인터페이스를 제공한다. 어플리케이션과 상호 작용하는 현재 사용자 또는 시스템이 누구인지 인프라에 알리려면 이 인터페이스를 구현해야 한다. 제네릭 타입 T@CreatedBy 또는 @LastModifiedBy 어노테이션이 달린 프로퍼티 타입을 정의한다.

다음은 스프링 시큐리티의 Authentication 객체를 사용하는 인터페이스 구현체 예시다:

Example 81. Implementation of AuditorAware based on Spring Security

class SpringSecurityAuditorAware implements AuditorAware<User> {

  @Override
  public Optional<User> getCurrentAuditor() {

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

이 구현체는 스프링 시큐리티가 제공하는 Authentication 객체에 접근해서, UserDetailsService 구현체에서 만들었던 커스텀 UserDetails 인스턴스를 조회한다. 여기에선 UserDetails로 도메인 사용자를 확인다고 가정하지만, 조회한 Authentication을 기반으로 어디에서나 사용자를 확인할 수 있다.

15.1.4. ReactiveAuditorAware

리액티브 인프라를 사용한다면, 컨텍스트 정보를 통해 @CreatedBy, @LastModifiedBy 정보를 제공할 수 있다. 스프링 데이터는 ReactiveAuditorAware<T> SPI 인터페이스를 제공한다. 어플리케이션과 상호 작용하는 현재 사용자 또는 시스템이 누구인지 인프라에 알리려면 이 인터페이스를 구현해야 한다. 제네릭 타입 T@CreatedBy 또는 @LastModifiedBy 어노테이션이 달린 프로퍼티 타입을 정의한다.

다음은 리액티브 스프링 시큐리티의 Authentication 객체를 사용하는 인터페이스 구현체 예시다:

Example 82. Implementation of ReactiveAuditorAware based on Spring Security

class SpringSecurityAuditorAware implements ReactiveAuditorAware<User> {

  @Override
  public Mono<User> getCurrentAuditor() {

    return ReactiveSecurityContextHolder.getContext()
                .map(SecurityContext::getAuthentication)
                .filter(Authentication::isAuthenticated)
                .map(Authentication::getPrincipal)
                .map(User.class::cast);
  }
}

이 구현체는 스프링 시큐리티가 제공하는 Authentication 객체에 접근해서, UserDetailsService 구현체에서 만들었던 커스텀 UserDetails 인스턴스를 조회한다. 여기에선 UserDetails로 도메인 사용자를 확인다고 가정하지만, 조회한 Authentication을 기반으로 어디에서나 사용자를 확인할 수 있다.


15.2. General Auditing Configuration for R2DBC

스프링 데이터 R2DBC 1.2 부터는 다음 예제처럼 설정 클래스에 @EnableR2dbcAuditing 어노테이션을 추가해 감사(auditing)를 활성화할 수 있다:

Example 83. Activating auditing using JavaConfig

@Configuration
@EnableR2dbcAuditing
class Config {

  @Bean
  public ReactiveAuditorAware<AuditableUser> myAuditorProvider() {
      return new AuditorAwareImpl();
  }
}

ApplicationContextReactiveAuditorAware 타입 빈을 정의하면, 감사 인프라가 자동으로 이 빈을 선택하고 도메인 타입에 설정할 현재 사용자를 결정한다. ApplicationContext에 구현체를 여러 개 등록했다면, @EnableR2dbcAuditingauditorAwareRef 속성으로 사용할 구현체를 선택할 수 있다.


전체 목차는 여기에 있습니다.

<< >>