Auditing 이란?
Spring Data는 엔티티를 만들고, 수정한 사람 및 날짜를 부여해주는 기능을 제공합니다.
엔티티에 메타 데이터 부여를 도와준다는 것인데 제공하는 방식은 애너테이션 혹은 인터페이스 입니다.
Audit 기능을 활용하기 위해선 3가지 과정이 필요합니다.
- 애너테이션을 통해 메타데이터 지정
- 사용자 인식을 위한 AuditAware 인터페이스 구현
- 해당하는 설정 클래스에 @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 기능이 사용자 인식에 필요한 정보를 제공해 줄 수 있습니다.