-
8장. 프록시와 연관관계 관리JPA 2022. 2. 12. 12:55
프록시
지연 로딩
- 엔티티가 실제 사용될 때까지 데이터베이스 조회를 지연하는 방법
프록시 객체
- 지연 로딩 기능을 사용하려면 실제 엔티티 객체 대신에 데이터 베이스 조회를 지연할 수 있는 가짜 객체가 필요하다. 그걸 프록시 객체라고 한다.
EntitiyManager.getReference()
- 엔티티를 실제 사용하는 시점까지 데이터베이스 조회를 미룰 때 사용한다.
- 데이터 베이스 조회 x
- 실제 엔티티 객체 생성 x
- 데이터 베이스 접근을 위임한 프록시 객체를 반환 o
프록시 객체 초기화
- 실제 엔티티가 생성되어 있지 않으면 영속성 컨텍스트에 실제 엔티티 생성을 요청한다.
- 한 번만 가능
- 준영속 상태의 프록시 초기화 x
프록시와 식별자 값
- 프록시 객체는 식별자 값을 저장한다.
- @Access(AccessType : PROPERTY) : 초기화 x
- @Access(AccessType : FIELD) : 초기화 o
- 프록시 확인
- PersistenceUtil.isLoaded(Object entity)
- true : 초기화 or 프록시 인스턴스 x
- false : 초기화 x
- PersistenceUtil.isLoaded(Object entity)
- 프록시의 강제 초기화
- 하이버네이트의 initialize()
즉시 로딩과 지연 로딩
즉시 로딩
- 엔티티를 조회할 때 연관된 엔티티도 함께 조회한다.
- 즉시 로딩을 최적화하기 위해 가능하면 조인 쿼리를 사용한다.
- @ManyToOne(fetch=FetchType.EAGER)
지연 로딩
- 연관된 엔티티가 실제 사용할 때 조회한다.
- @ManyToOne(fetch=FetchType.LAZY)
- 프록시 객체가 주로 사용됨
- 프록시 객체는 실제 사용될 때까지 데이터 로딩을 미룬다.
nullable 설정에 따른 조인 전략
- @JoinColum(nullable = true)
- null 허용(기본값)
- 외부 조인 사용
- @JoinColum(nullable = false)
- null 허용 x
- 내부 조인 사용
- @ManyToOne(fetch=FetchType.EAGER, optional = false)
조회 대상이 영속성 컨텍스트에 이미 있으면 프록시가 아닌 실제 객체를 사용한다.
지연 로딩 활용
컬렉션 래퍼
- 엔티티를 영속 상태로 만들 때 엔티티에 컬렉션이 있으면 컬렉션을 추적하고 관리할 목적으로 원본 컬렉션을 하이버네이트가 제공하는 내장 컬렉션으로 변경하는데 이것을 컬렉션 래퍼라 한다. (프록시 역할)
JPA 기본 패치 전략
- @ManyToOne , @OneToOne : 즉시 로딩 (FetchType.EAGER)
- @OneToOne, @ManyToMany : 지연 로딩(FetchType.LAZY)
모든 연관관계에 지연로딩 사용 추천
컬렉션에서 즉시 로딩 사용 시 주의점
- 컬렉션을 하나 이상 즉시 로딩하는 것을 권장 x
- 컬렉션 즉시 로딩은 항상 외부 조인을 권장
영속성 전이 : CASCADE
정의
- 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속상태로 만들 수 있다.
저장
- CascadeType.PERSIST
- 연관된 엔티티도 함께 저장된다.
- CascadeType.ALL
- 모든 상황에서 영속성 전이된다.
삭제
- CascadeType.REMOVE
- 부모, 자식 같이 삭제된다.
영속성 전이란 엔티티를 영속화할 때, 연관된 엔티티도 같이 영속화하는 편리함을 제공하지만, 매핑에 관련되지는 않는다.
고아 객체
- OrphanRemoval = true
- 부모 엔티티의 컬렉션에서 자식 엔티티의 참조만 제거하면 자식 엔티티가 자동 삭제된다.
- 영속성 컨텍스트를 플러시 할 때 적용된다.
- 참조가 제거된 엔티티는 다른 곳에서 참조하지 않는 고아 객체로 보고 삭제하는 기능
- 참조하는 곳이 하나일 때만 사용한다.
- @OneToMany, @OneToOne
- 참조하는 곳이 하나일 때만 사용한다.
영속성 전이 + 고아 객체, 생명 주기
- CascadeType.All + OrphanRemoval = true
- 두 옵션을 모두 활성화하면 부모 엔티티를 통해서 자식의 생명 주기를 관리한다.
- 자식 저장 : 부모에 등록 / 자식 삭제 : 부모에서 제거
- 지연 로딩
'JPA' 카테고리의 다른 글
10장. 객체지향 쿼리 언어 (0) 2022.02.14 9장. 값 타입 (0) 2022.02.13 4장. 엔티티 매핑 | 5장. 연관관계 매핑 | 6장. 다양한 연관관계 매핑 | 7장. 고급 매핑 (0) 2022.02.11 3장. 영속성 (0) 2022.02.10 1장. JPA 소개 | 2장. JPA 시작 (0) 2022.02.09