엔티티의 생명주기에 따른 이벤트를 처리하는데 사용된다.
이벤트를 잘 활용하면 대부분의 엔티티에 공통으로 적용하는 등록 일자, 수정 일자 처리와 해당 엔티티를 누가 등록하고 수정했는지에 대한 기록을 리스너 하나로 처리할 수 있다.
이벤트 종류
종류 | 설명 |
PostLoad | 엔티티가 영속성 컨텍스트에 조회된 직후 또는 refresh를 호출한 후 (2차 캐시에 저장되어 있어도 호출된다.) |
PrePersist | persist 메소드를 호출해서 엔티티를 영속성 컨텍스트에 관리하기 직전에 호출된다. 식별자 생성 전략을 사용한 경우 엔티티에 식별자는 아직 존재하지 않는다. 새로운 인스턴스를 merge할 때도 수행된다. |
PreUpdate | flush나 commit을 호출해서 엔티티를 데이터베이스에 수정하기 직전에 호출된다. |
PreRemove | remove 메소드를 호출해서 엔티티를 영속성 컨텍스트에서 삭제하기 직전에 호출된다. 또한 삭제 명령어로 영속성 전이가 일어날 때도 호출된다. orphanRemoval에 대해서는 flush나 commit 시에 호출된다. |
PostPersist | flush나 commit을 호출해서 엔티티를 데이터베이스에 저장한 직후에 호출된다. |
PostUpdate | flush나 commit을 호출에서 엔티티를 데이터베이스 수정한 직후에 호출된다. |
PostRemove | flush나 commit을 호출해서 엔티티를 데이터베이스에 삭제한 직후에 호출된다. |
이벤트 적용 위치
엔티티에 직접 적용
엔티티에 이벤트가 발생할 때마다 어노테이션으로 지정한 메소드가 실행된다.
@Entity
public class Duck {
@Id @GeneratedValue
public Long id;
private String name;
@PrePersist
public void prePersist(){...}
}
별도의 리스너 등록
리스너는 대상 엔티티를 파라미터로 받을 수 있다. 반환 타입은 void로 설정해야 한다.
@Entity
@EntityListeners(DuckListener.class)
public class Duck {...}
public class DuckListener {
@PrePersist
//특정 타입이 확실하면 특정 타입을 받을 수 있다.
private void prePersis(Object obj){...}
}
리스너 무시
@Entity
@EntityListerners(DuckListener.class)
@ExcludeDefaultListeners // 기본 리스너 무시
@ExcludeSuperclassListeners // 상위 클래스 이벤트 리스너 무시
public class Duck extends BaseEntity {...}
728x90
'JVM > JPA' 카테고리의 다른 글
JPA 예외 처리 (0) | 2023.07.03 |
---|---|
엔티티 그래프 (0) | 2023.07.03 |
@Converter (0) | 2023.07.02 |
컬렉션 (0) | 2023.07.02 |
스프링 데이터 JPA와 QueryDSL 통합 (0) | 2023.07.02 |