JPA 심화 2-4

5w31892p·2023년 2월 3일
0

JPA 심화

목록 보기
9/19

엔티티의 이벤트를 감시하는 Auditing

  • Auditing 을 사용하면 엔티티를 누가 언제 생성/마지막 수정 했는지 자동으로 기록
    • 방명록처럼 ~~왔다감

:: 적용 방법

  • 메인 애플리케이션 위에 @EnableJpaAuditing 추가
  • 해당 엔티티 클래스 위에 @EntityListeners(AuditingEntityListener.class) 추가

:: AuditorAware 구현체

  • createdAt, modifiedAt 은 구현체 없이 동작하지만 createdBy, modifiedBy 는 구현체가 필요
  • SpringSecurity 의 SecurityContextHolder 에서 인증정보안에 담긴 UserDetailsImpl 을 사용하여 user 객체를 가져와서 주면 동작
@Service
public class UserAuditorAware implements AuditorAware<User> {
    @Override
    public Optional<User> getCurrentAuditor() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();		
        if (authentication == null || !authentication.isAuthenticated()) {
            return Optional.empty();
        }
        return Optional.of(((UserDetailsImpl) authentication.getPrincipal()).getUser());
    }
}

위와 같이 만든 후 메인 애플리케이션 위 @EnableJpaAuditing에 AuditorAware 빈 이름 설정

@EnableJpaAuditing(auditorAwareRef = "userAuditorAware") // auditorAware 의 빈이름을 넣어준다.

:: Auditing 구현하기

  • 생성일시, 생성자, 수정일시, 수정자는 결국 엔티티의 영속성이 변경될때 저장한다.
  • 엔티티의 영속성이 변경되는 생성 > 수정 > 삭제 이 흐름을 엔티티 라이프 사이클 이벤트라고 한다.
  • Auditing 도 이러한 엔티티의 라이프 사이클 이벤트를 통해 구현하고있다.
  • 우린 엔티티 라이프 사이클을 직접 관리하여 구현할 수 있다.
  • 객체가 생성되면 자동으로 실행하도록 메소드에 붙이는 @PostConstruct 의 원리와 같다.

엔티티 저장 이벤트

전 : @PrePersist : EntityManager 가 엔티티를 영속성상태로 만들기 직전에 메소드 수행

후 : @PostPersist : EntityManager 가 엔티티를 영속성상태로 만든 직후에 메소드 수행

엔티티 수정 이벤트

전 : @PreUpdate : EntityManager 가 엔티티를 갱신상태로 만들기 직전에 메소드 수행

후 : @PostUpdate : EntityManager 가 엔티티를 갱신상태로 만든 직후에 메소드 수행

엔티티 삭제 이벤트

전 : @PerRemove : EntityManager 가 엔티티를 삭제상태로 만들기 직전에 메소드 수행

후 : @PostRemove : : EntityManager 가 엔티티를 삭제상태로 만든 직후에 메소드 수행


과제
ContextHolder + 엔티티 라이프 사이클 이벤트(@PrePersist, @PreUpdate) 사용해서 createdBy, modifiedBy 구현


GitHub 실습 코드

0개의 댓글