데이터베이스의 데이터가 언제 수정,생성 되었고 누구에 의해 수정되었는지 확인이 필요한 상황이 발생한다
예를 들어 특정 데이터가 변경되었는데 해당 변경이 잘못된 경우 누구에 의해서 변경되었고 언제 변경되었는지를 확인해 처리하는 상황, 또는 데이터 변경 이력을 기록할 목적
이 경우 데이터를 변경할때마다 직접 시간을 추가하거나 변경한 사용자를 기록하는 일은 번거로운 일이다 따라서 JPA Auditing 기능을 이용해 생성일,수정일,생성자등 정보를 추적해 관리하여 해당 엔티티가 언제 누구에 의해 수정되었는지에 대한 정보를 자동으로 기록할 수 있다
Spring Data JPA에서는 Auditiong 에 대한 애노테이션을 제공한다
@SpringBootApplication
@EnableJpaAuditing
public class testServiceApplication {
public static void main(String[] args) {
SpringApplication.run(testServiceApplication.class, args);
}
}
JPA Auditing을 사용하려면 Spring Boot Application에 @EnableJpaAuditing 애노테이션을 추가해 Auditing 기능을 활성화 한다
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
@CreatedDate
@Column(updatable = false)
private LocalDateTime createAt;
@LastModifiedDate
private LocalDateTime updateAt;
@CreatedBy
@Column(update = false)
private Long createdById;
@LastModifiedBy
private Long modifiedById;
}
@EntityListeners(AuditiongEntityListener.class) 는 엔티티 클래스에 적용해 엔티티가 생성되거나 수정될때 Auditing 기능을 적용하도록 하는 애노테이션이다
엔티티가 생성되거나 수정되면 자동으로 수정된 날짜와 생성된 날짜를 기록한다
@CreatedBy나 @LastModifiedBy는 사용자의 정보를 알 수 있어야 하므로 AuditorAware 인터페이스를 구현해 사용자 정보를 제공하는 빈을 설정해야한다
@Configuration
public class JpaConfig {
@Bean
public AuditorAware<Long> auditorProvider() {
return () -> Optional.ofNullable([사용자 아이디]);
}
}
스프링 시큐리티를 사용해 로그인 한 사용자 정보를 얻어 설정할 수 도 있다
@Configuration
public class JpaConfig {
@Bean
public AuditorAware<Long> auditorProvider() {
return () -> {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null && authentication.isAuthenticated()) {
UserDetails userDetails = authentication.getPrincipal();
return Optional.ofNullable(userDetails.getId());
}
return Optional.empty();
};
}
}