이 학습 자료는 김영한님의 인프런 강의를 참고해서 만들었습니다.
1. 프록시
- 가짜 엔티티로써 실제 클래스를 상속 받아서 만들어 진다. → 겉 모양이 같음(
==
대신에instanceof
사용) em.find()
vsem.getReference()
em.find()
: 데이터베이스를 통해서 실제 엔티티 객체 조회em.getReference()
: 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회
1.1 프록시 특징
- 프록시 객체는 실제 객체의 참조(
target
)를 보관 - 호출시 실제 객체의 메소드 호출
- 처음 사용할 때 한번만 초기화 →
target
을 통해서 실제 엔티티에 접근이 가능, 실제 엔티티가 되는것X - 영속성 컨텍스트에 찾는 엔티티가 이미 존재하면, 실제 엔티티 객체를 반환
- 단,
getReference()
를 통해 조회를 한 후에,find()
로 조회하면 프록시 객체로 반환 - 준영속 상태일 때, 프록시를 초기화 하면 예외(
org.hibernate.LazyInitializationException
)발생
1.2 프록시 객체의 초기화
1.3 프록시 확인 메서드
PersistenceUnitUtil.isLoaded(Object entity)
: 프록시 인스턴스의 초기화 여부 확인entity.getClass().getName()
: 프록시 클래스 확인 방법Hibernate.initialize(entity)
: 프록시 강제 초기화- JPA 표준에서는 강제 초기화가 없으므로 메서드를 호출해서 초기화한다.
2. 즉시 로딩과 지연 로딩
2.1 지연 로딩
@XToX(fetch = FetchType.LAZY)
로 사용- 프록시로 조회(한 엔티티의 객체를 자주 사용하지 않을 때)
- 실제 객체를 사용(메서드 사용)하는 시점에 초기화
- 실무에서 가급적 지연 로딩을 사용
2.2 즉시 로딩
@XToX(fetch = FetchType.EAGER)
로 사용@ManyToOne
,@OneToOne
은 기본이 즉시 로딩이기 때문에 LAZY로 변경하여 사용- 실제 객체로 조회(한 엔티티의 객체를 자주 사용할 때)
- 즉시 로딩을 사용시 예상치 못한 SQL 발생할 수 있다.
- JPQL에서 N+1 문제 발생
- 해결 방법
- fetch, join을 사용하여 해결
- 엔티티 그래프 기능을 사용
- 해결 방법
3. 영속성 전이(CASCADE)와 고아 객체
3.1 영속성 전이(CASCADE)
- 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용
- 연관관계를 매핑하는 것과 관계X
@XTOX(cascade = CascadeType.XXX
)로 사용ALL
: 모두 적용PERSIST
: 영속
- 하나의 부모가 여러 자식을 관리할 때 사용하기 좋음.
3.2 고아 객체
- 부모 엔티티와 연관 관계가 끊어진 자식 엔티티 객체
orphanRemoval = true
: 부모와의 연관 관계가 끊기면, 자동으로 삭제- 부모가 제거되면 자식도 같이 제거 됨
- 참조하는 곳이 하나일 때 사용해야함
- 특정 엔티티가 개인 소유할 때 사용
3.3 영속성 전이 + 고아 객체
CascadeType.ALL
과orphanRemoval = true
을 사용한다면 부모 엔티티가 자식 엔티티의 생명 주기를 관리할 수 있음- 도메인 주도 설계(DDD)의 Aggregate Root개념을 구현할 때 유용
'ORM > JPA' 카테고리의 다른 글
자바 ORM 표준 JPA 프로그래밍 - 객체지향 쿼리 언어 (0) | 2021.08.22 |
---|---|
자바 ORM 표준 JPA 프로그래밍 - 값 타입 (0) | 2021.08.21 |
자바 ORM 표준 JPA 프로그래밍 - 고급 매핑 (0) | 2021.08.16 |
자바 ORM 표준 JPA 프로그래밍 - 다양한 연관관계 매핑 (0) | 2021.08.15 |
자바 ORM 표준 JPA 프로그래밍 - 연관관계 매핑 기초 (0) | 2021.08.12 |