Close
Close full mode
logo만렙 개발자 키우기

(3) 리스너

Git RepositoryEdit on Github
Last update: 9 months ago by nowwaterReading time: 2 min

JPA 리스너 기능을 사용하면 엔티티의 생명주기에 따른 이벤트를 처리할 수 있다.

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

14.3.1 이벤트 종류

image

  • PostLoad : 엔티티가 영속성 컨텍스트에 조회된 직후 또는 refresh를 호출한 후
  • PrePersist : persist() 메소드를 호출해서 엔티티를 영속성 컨텍스트에 관리하기 직전에 호출. 새로운 인스턴스를 merge할 때도 수행
  • PreUpdate : flushcommit을 호출해서 엔티티를 데이터베이스에 수정하기 직전에 호출
  • PreRemove : remove() 메소드를 호출해서 엔티티를 영속성 컨텍스트에서 삭제하기 직전에 호출. 또는 영속성 전이가 일어날 때도 호출
  • PostPersist : flushcommit을 호출해서 엔티티를 데이터베이스에 저장한 직후 호출된다.
  • PostUpdate : flushcommit을 호출해서 엔티티를 데이터베이스에 수정한 직후에 호출
  • PostRemove : flushcommit을 호출해서 엔티티를 데이터베이스에 삭제한 직후에 호출

14.3.2 이벤트 적용 위치

  • 엔티티에 직접 적용


    위의 어노테이션들을 메소드에 직접 붙여서 사용
    @Entity
    public class Duck {
    ...
    @PrePersist
    public void prePersist() {
    ...
    }
    @PostRemove
    public 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 에 기본 리스너로 등록하면 된다.

이벤트 호출 순서

  1. 기본 리스너
  1. 부모 클래스 리스너
  1. 리스너
  1. 엔티티

세밀한 설정

@ExcludeDefaultListeners : 기본 리스너 무시

@ExcludeSuperclassListeners : 상위 클래스 이벤트 리스너 무시

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

🚀 JPA — Previous
(2) Converter
Next — 🚀 JPA
(4) 엔티티 그래프