Entity에서 생성일, 수정일, 생성자, 수정자를 자동으로 기입하기 위해서는 어플리케이션 위에 @EnableJpaAuditing을 사용하여 활성화를 시켜 사용한다.
@CreatedDate
@CreatedBy
@LastModifiedBy
@LastModifiedDate
하지만 막상 사용된걸 본다면
@CreatedDate
@LastModifiedDate
위 두개의 어노테이션만 동작하는걸 확인할 수 있다.
@EntityListeners(AuditingEntityListener.class)
AuditingEntityListener에 대해서 간략하게 설명하자면 다음과 같다.
- Spring Data JPA에서 Auditing 기능을 활성화하는 데 사용되는 JPA 이벤트 리스너이다.
- 이 리스너는 엔티티의 상태 변화(생성, 수정 등) 이벤트를 감지하여, Auditing 관련 필드(@CreatedDate, @LastModifiedDate, @CreatedBy, @LastModifiedBy)를 자동으로 업데이트하는 역할을 한다.
즉 기능자체만 본다면 당연히 생각이 드는게 그러면 추가적인 구현없이 애너테이션만 설정하면 당연하게 구현이 되어야하는거 아닌가? 라고 생각할 수있다. 하지만 작동의 차이가있다.
@CreatedDate, @LastModifiedDate는 이벤트 감지시 자동으로 JVM 시스템 시간을 기반으로 날짜/시간 값을 설정한다.
하지만 @CreatedBy와 @LastModifiedBy는 인증된 사용자의 정보를 필요로한다.
Spring Security에 인증된 사용자의 정보가 필요하다는 말과 같다.
그러면 인증된 사용자의 정보를 어디서 가저올까?
그건바로 AuditorAware 구현체가 등록되어 있어야한다.
AuditorAware는 Spring Data JPA의 Auditing 기능에서 현재 인증된 사용자를 제공하는 인터페이스이다.
엔티티의 persist 또는 update 이벤트 발생 시, @EntityListeners(AuditingEntityListener.class)가 AuditingEntityListener를 호출하고, AuditorAware를 통해 현재 사용자 정보를 가져온다.
아래의 코드는 그 정보를 가저오는 코드이다. SecurityContextHolder를 통해 실제로 인증된 정보를 가저와
@EntityListeners(AuditingEntityListener.class)의 기능을 활성화한 Entity의 생성자 및 수정자에 업데이트 하는데 사용된다.
@Component
public class AuditorAwareImpl implements AuditorAware<UUID> {
@Override
public Optional<UUID> getCurrentAuditor() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null
|| !authentication.isAuthenticated()
|| !(authentication.getPrincipal() instanceof UserDetailsImpl)) {
return Optional.empty();
}
UserDetailsImpl userDetails = (UserDetailsImpl)authentication.getPrincipal();
return Optional.of(userDetails.getUser().getId());
}
}
'심화 캠프 정리' 카테고리의 다른 글
ModelAttribute (0) | 2024.11.20 |
---|---|
PageableArgumentResolver (0) | 2024.11.20 |
동적쿼리 BooleanExpression (0) | 2024.11.20 |
동적쿼리 OrderSpecifier (0) | 2024.11.20 |
PreAuthorize (2) | 2024.11.19 |