JVM/JPA

리스너

kyoulho 2023. 7. 2. 21:05

엔티티의 생명주기에 따른 이벤트를 처리하는데 사용된다.

이벤트를 잘 활용하면 대부분의 엔티티에 공통으로 적용하는 등록 일자, 수정 일자 처리와 해당 엔티티를 누가 등록하고 수정했는지에 대한 기록을 리스너 하나로 처리할 수 있다.

 

이벤트 종류

종류 설명
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 {...}

'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