Reference. 자바 ORM 표준 JPA 프로그래밍
책 목차 및 이전 글
더보기
들어가기 전 JPA 특징, Q&A
1. JPA 소개
3. 영속성 관리
4. 엔티티 매핑
4.1 - 4.3 @Entity, @Table, 다양한 매핑
4.4 - 4.5 데이터베이스 스키마 자동 생성, DDL 생성 기능
5. 연관관계 매핑 기초
6. 다양한 연관관계 매핑
7. 고급매핑
8. 프록시와 연관관계 관리
9. 값 타입
9.3~5 값 타입과 불변 객체, 값 비교, 값 타입 컬렉션
10. 객체지향 쿼리 언어
11. 웹 애플리케이션 제작
11.1 프로젝트 환경설정
11.2 도메인 모델과 테이블 설계
11.3 애플리케이션 구현
12. 스프링 데이터 JPA
12.1~3 스프링 데이터 JPA 소개, 공통 인터페이스 기능
12.5~10 명세, 사용자 정의 리포지토리, Web 확장...
13. 웹 애플리케이션과 영속성 관리
14. 컬렉션과 부가기능
- JPA 리스너 기능을 사용하면 엔티티의 생명주기에 따른 이벤트 처리가 가능
14.3.1 이벤트 종류
- 이벤트의 종류와 발생 시점 예시
PostLoad
:- 엔티티가 영속성 컨텍스트에 조회딘 직후 또는
refresh
를 호출한 후
- 엔티티가 영속성 컨텍스트에 조회딘 직후 또는
PrePersist
:persist()
메소드를 호출 후 영속성 컨텍스트에 관리하기 직전에 호출
- 식별자 생성 전략을 사용하면 엔티티에 식별자는 존재X, 새로운 인스턴스 merge할 때 수행
PreUpdate
:flush
나commit
을 호출해서 엔티티를 DB에 수정하기 직전에 호출
PreRemove
:remove()
를 호출해서 엔티티를 영속성 컨텍스트에서 삭제하기 직전에 호출
- 삭제 명령어로 영속성 전이가 일어날때도 호출,
orphanRemoval
는flush
,commit
때 호출
PostPersist
:- flush나 commit을 호출해서 엔티티를 DB에 저장한 직후에 호출
- 식별자가 항상 존재
- 식별자 생성 전략이 IDENTITY면 식별자를 생성하기 위해
persist()
를 호출하면서 DB에 엔티티를 저장하므로persist()
호출한 직후에PostPersist
호출
PostUpdate
- flush나 commit을 호출해서 엔티티를 DB에 수정한 직후에 호출
PostRemove
- flush나 commit을 호출해서 엔티티를 DB에 삭제한 직후에 호출
14.3.2 이벤트 적용 위치
- 이벤트는 엔티티에서 직접 받거나 별도의 리스너를 등록해서 받는것이 가능
- 엔티티에 직접 적용
- 별도의 리스너 등록
- 기본 리스너 사용
엔티티에 직접 적용
- 엔티티에 직접 적용 예시
@Entity public class Duck { @Id @GeneratedValue public Long id; private String name; @PrePersist public void prePersist() { System.out.println("Duck.prePersist id=" + id); } @PostPersist public void postPersist() { System.out.println("Duck.postPersist id=" + id); } @PostLoad public void postLoad() { System.out.println("Duck.postLoad"); } @PreRemove public void preRemove() { System.out.println("Duck.preRemove"); } @PostRemove public void postRemove() { System.out.println("Duck.postRemove"); } }
//엔티티를 저장할 때 결과 Duck.prePersist id=null Duck.postPersist id=1
별도의 리스너 등록
- 별도의 리스너 사용 예시
@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에 기본 리스너로 등록
<?xml version"1.0" encoding="UTF-8" ?> <entity-mappings ...> <persistence-unit-metadata> <persistence-unit-defaults> <entity-listeners> <entity-listener class="jpabook.jpashop.domain. listener.DefaultListner" /> </entity-listeners> </persistence-unit-defaults> </persistence-unit-metadata> </entity-mappings>
- 여러 리스너를 등록했을 경우 이벤트 호출 순서
- 기본 리스너
- 부모 클래스 리스너
- 리스너
- 엔티티
더 세밀한 설정
- 더 세밀한 설정을 위한 어노테이션을 제공
javax.persistence.ExcludeDefaultListeners
: 기본 리스너 무시
javax.persistence.ExcludeSuperclassListeners
: 상위 클래스 이벤트 리스너 무시
@Entity @EntityListeners(DuckListener.class) @ExcludeDefaultListeners @ExcludeSuperclassListeners public class Duck extends BaseEntity { ... }
- 이벤트를 잘 활용하면 공통으로 적용하는 등록 일자, 수정 일자, 등록자, 수정자 처리가 가능
'개발서적 > 자바 ORM 표준 JPA' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 15.1 예외 처리 (0) | 2021.10.25 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 14.4 엔티티 그래프 (0) | 2021.10.25 |
[자바 ORM 표준 JPA 프로그래밍] 14.2 @Converter (0) | 2021.10.25 |
[자바 ORM 표준 JPA 프로그래밍] 14.1 컬렉션 (0) | 2021.10.25 |
[자바 ORM 표준 JPA 프로그래밍] 13.4 너무 엄격한 계층 (0) | 2021.09.21 |