- Spring Boot 쇼핑몰 프로젝트 진행 중 JPA Auditing 기능을 적용시킬 때 사용되는 @EntityListeners(value = {AuditingEntityListener.class}) 코드 등에 대한 궁금증
Auditing
엔티티에 공통으로 들어가는 멤버변수들 (등록시간, 수정시간, 등록자, 수정자 등등)을 추상클래스로 만들고, 해당 추상 클래스를 상속받아 엔티티에 공통적인 기능을 수행하도록 하며 엔티티의 생성과 수정을 감시하는 기법
@EntityListeners
JPA Entity에 Persist, Remove, Update, Load 에 대한 event 발생 시 전과 후에 대한 커스텀 콜백 메서드를 수행하도록 지원
1. 커스텀 콜백 수행 시점
어노테이션 | 설명 |
---|
@PrePersist | manager persist 의해 처음 호출될 때 실행 |
@PostPersist | manager persist 에 의해 실행되고 수행, SQL INSERT 이후 |
@PostLoad | 로드 이후에 수행, SQL SELECT 이후 |
@PreUpdate | SQL UPDATE 이전에 수행 |
@PostUpdate | SQL UPDATE 이후에 수행 |
@PreRemove | SQL DELETE 이전에 수행 |
@PostRemove | SQL DELETE 이후에 수행 |
2. 사용법
- Entity 클래스에 커스텀 콜백 클래스를 value 값으로 지정
@EntityListeners(value = {AuditingEntityListener.class})
3. AuditingEntityListener.class
- Auditing 기능을 수행하는 클래스
- 내부를 살펴보면 @PrePersist, @PreUpdate 어노테이션을 지정하여 엔티티의 등록 및 수정 시에 동작
AuditorAware 인터페이스
등록자 및 수정자를 처리하는 인터페이스
1. AuditorAware 인터페이스 구현
- 현재 로그인한 사용자의 정보를 추출하여 등록자 및 수정자로 등록하는 구현 클래스
@EnableJpaAuditing
- Application 에 Auditing 기능을 활성화하는 어노테이션
- 위에서 만든 AuditorAware 인터페이스 구현체를 @Bean 등록
동작 원리
- @EntityListeners 기능을 이용해서 Entity 등록 및 수정 시에 Auditing 기능을 수행하는 원리
- @MappedSuperclass - 해당 클래스를 상속 받는 Entity 들이 공통되는 필드를 사용할 수 있도록 부모 클래스에 지정
① AuditorAware 인터페이스를 구현한 클래스 생성
② @Configuration, @EnableJpaAuditing 을 통해서 JPA Auditing 기능 활성화
③ ②와 동시에 AuditorAware 인터페이스 구현체 @Bean 등록
④ Auditing 활성화 상태에서는 AuditorAware 구현체 @Bean 을 자동으로 찾아서
AuditingEntityListener 와 매핑
⑤ 이제 원하는 엔티티에 @EntityListeners, @MappedSuperclass 지정
⑥ 엔티티 등록 및 수정 시에 관련된 해당 필드 insert 및 update 됨