- 엔티티의 생명주기에 따른 이벤트를 처리할 수 있는 기능이다.
1. 생명 주기에 따른 이벤트
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 프로그래밍
'Spring 사전 준비 > JPA Hibernate' 카테고리의 다른 글
[JPA] JPA 예외 처리 (0) | 2022.08.25 |
---|---|
[JPA] 엔티티 그래프 (0) | 2022.08.25 |
[JPA] Entity와 Table간의 데이터 타입 변환 (0) | 2022.08.24 |
[JPA] JPA와 컬렉션 (0) | 2022.08.24 |
[JPA] 웹 애플리케이션에서의 영속성 관리 (0) | 2022.08.22 |
댓글