본문 바로가기
  • 실행력이 모든걸 결정한다
Spring 사전 준비/JPA Hibernate

[JPA] JPA 리스너

by 김코더 김주역 2022. 8. 24.
반응형

- 엔티티의 생명주기에 따른 이벤트를 처리할 수 있는 기능이다.

 

1. 생명 주기에 따른 이벤트

출처 : 자바 ORM 표준 JPA 프로그래밍 - 623p

1) PostLoad : DB로부터 엔티티가 영속성 컨텍스트에 조회된 직후 또는 refresh() 호출 직후

2) PrePersist : persist() 메소드를 호출하거나 새로운 인스턴스를 merge해서 엔티티를 영속성 컨텍스트에 저장하기 직전

3) PreUpdate : flush()를 호출해서 엔티티를 DB에 수정하기 직전

4) PreRemove : remove()를 호출해서 엔티티가 영속성 컨텍스트에서 삭제되기 직전

5) PostPersist : flush()를 호출해서 엔티티를 DB에 삽입한 직후

※ 식별자 생성 전략이 IDENTITY면 persist()를 호출한 직후에 호출됨. 자세한 내용은 https://kimcoder.tistory.com/356의 [3-3)-(1) IDENTITY]를 참고할 것

6) PostUpdate : flush()를 호출해서 엔티티를 DB에 수정한 직후

7) PostRemove : flush()를 호출해서 엔티티를 DB에 삭제한 직후

 

 

 

2. 이벤트 적용

- 이벤트를 받는 3가지 방법을 소개한다.

 

1) 이벤트를 엔티티에 직접 적용

- 엔티티에 이벤트가 발생할 때마다 어노테이션으로 지정한 메소드가 실행된다.

- 어노테이션의 이름은 [1. 생명 주기에 따른 이벤트]에서 살펴본 키워드와 동일하다.

@Entity
public class Member {

    ...
    @PrePersist
    public void prePersist() {...}
    
    @PostPersist
    public void postPersist() {...}
    
    @PreRemove
    public void preRemove() {...}
    
    @PostRemove
    public void postRemove() {...}
}

 

 

2) 리스너 클래스 생성

- 별도의 리스너를 등록하는 방법이다.

- 이벤트 메소드는 대상 엔티티를 파라미터로 받을 수 있으며, 반환 타입은 void여야 한다.

public class MemberListener {

    @PrePersist
    public void prePersist(Object obj) {...}
    
    @PostPersist
    public void postPersist(Object obj) {...}
}

- 만든 리스너 클래스는 @Entity 클래스에 @EntityListeners 어노테이션을 사용해서 추가하면 된다.

@Entity
@EntityListeners(MemberListener.class)
public class Member {
    ...
}

 

 

3) 기본 리스너로 사용

- 모든 엔티티의 이벤트를 처리하기 위한 방법이다.

- META-INF/orm.xml에 리스너 클래스를 등록하면 된다.

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="htt://xmlns.jcp.org/xml/ns/persistence/orm" version="2.1">
    <persistence-unit-metedata>
      <persistence-unit-defaults>
          <entity-listeners>
              <entity-listener class="com.example.demo.listener.DefaultListener"/>
          </entity-listeners>
      </persistence-unit-defaults>
    </persistence-unit-metedata>
</entity-mappings>

 

 

 

3. 리스너 호출 순서

기본 리스너 > 부모 클래스 리스너 > 리스너 > 엔티티

 

 

 

4. 세밀한 리스너 설정

세밀한 리스너 설정을 위해 아래 어노테이션을 @Entity 클래스에 추가할 수 있다. 모두 javax.persistence 패키지에 존재한다.

- @ExcludeDefaultListeners : 기본 리스너 무시

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

 

 

 

● 참고자료 : 자바 ORM 표준 JPA 프로그래밍

반응형

댓글