(3) 리스너
Last update: 9 months ago by nowwaterReading time: 2 min
JPA 리스너 기능을 사용하면 엔티티의 생명주기에 따른 이벤트를 처리할 수 있다.
이벤트를 잘 활용하면 대부분의 엔티티에 공통으로 적용하는 등록 일자, 수정 일자 처리와 해당 엔티티를 누가 등록하고 수정했는지에 대한 기록을 리스너 하나로 처리할 수 있다.
14.3.1 이벤트 종류
- PostLoad : 엔티티가 영속성 컨텍스트에 조회된 직후 또는
refresh
를 호출한 후
- PrePersist :
persist()
메소드를 호출해서 엔티티를 영속성 컨텍스트에 관리하기 직전에 호출. 새로운 인스턴스를merge
할 때도 수행
- PreUpdate :
flush
나commit
을 호출해서 엔티티를 데이터베이스에 수정하기 직전에 호출
- PreRemove :
remove()
메소드를 호출해서 엔티티를 영속성 컨텍스트에서 삭제하기 직전에 호출. 또는 영속성 전이가 일어날 때도 호출
- PostPersist :
flush
나commit
을 호출해서 엔티티를 데이터베이스에 저장한 직후 호출된다.
- PostUpdate :
flush
나commit
을 호출해서 엔티티를 데이터베이스에 수정한 직후에 호출
- PostRemove :
flush
나commit
을 호출해서 엔티티를 데이터베이스에 삭제한 직후에 호출
14.3.2 이벤트 적용 위치
엔티티에 직접 적용
위의 어노테이션들을 메소드에 직접 붙여서 사용@Entitypublic class Duck {...@PrePersistpublic void prePersist() {...}@PostRemovepublic void postRemove() {...}}
별도의 리스너 등록
@Entity@EntityListeners(DuckListener.class)public class Duck {...}public class DuckListener {@PrePersist// 특정 타입이 확실하면 특정 타입을 받을 수 있다.private void prePersist(Object obj){System.out.println("DuckListener.prePersist obj = [" + obj + "]");}@PostPersist// 특정 타입이 확실하면 특정 타입을 받을 수 있다.private void postPersist(Object obj){System.out.println("DuckListener.postPersist obj = [" + obj + "]");}}
리스너는 대상 엔티티를 파라미터로 받을 수 있다.반환 타입은
void
로 설정해야 한다.
기본 리스너 사용
모든 엔티티의 이벤트를 처리하려면
META-INF/orm.xml
에 기본 리스너로 등록하면 된다.
이벤트 호출 순서
- 기본 리스너
- 부모 클래스 리스너
- 리스너
- 엔티티
세밀한 설정
@ExcludeDefaultListeners
: 기본 리스너 무시
@ExcludeSuperclassListeners
: 상위 클래스 이벤트 리스너 무시
이벤트를 잘 활용하면 대부분의 엔티티에 공통으로 적용하는 등록 일자, 수정 일자 처리와 해당 엔티티를 누가 등록하고 수정했는지에 대한 기록을 리스너 하나로 처리할 수 있다.