- Proxy의 개념을 파악한다.
- 프록시 객체의 초기화 과정을 이해한다.
- 프록시의 특징을 파악한다.
- 프록시 객체란, 실제 객체와 겉 모양은 같으나 실제 객체를 대신하여 동작하는 객체를 의미한다.
- 실제 클래스를 상속받아서 만들어지며, 실제 객체의 참조(target)를 보관한다.
em.find() vs em.getReference()
em.find()
: DB를 통해 실제 엔티티를 조회한다.em.getReference()
: DB 조회를 미루고 프록시 엔티티를 조회한다.
- 아래와같이 동일한 객체가 아님을 알 수 있다.
프록시 객체는 참조하는 실제 객체에 접근하는 시점에 초기화된다.
- 프록시 객체가 초기화되면, 프록시 객체를 통해 실제 엔티티 객체에 접근이 가능하다. 즉, 실제 엔티티로 바뀌는 것이 아니다.
- 아래는 프록시 객체의 초기화 과정이다.
- 프록시 객체는 처음 사용되는 시점에 한 번만 초기화된다.
- 초기화를 통해 실제 엔티티로 바뀌는 것이 아닌, 초기화를 통해 실제 엔티티에 접근이 가능해진다.
- 프록시 객체와 실제 엔티티에 대한 비교는
==
이 아닌instance of
로 한다.
- 영속성 컨텍스트에 찾는 엔티티가 이미 존재하면,
em.getReference()
를 호출해도 실제 엔티티를 반환한다.
- 엔티티가 준영속 상태라면, 프록시를 초기화 할 수 없다.
org.hibernate.LazyInitializationException
예외가 발생한다.
그래서, 프록시를 언제 어디에서 써?
- JPA 즉시 로딩과 지연 로딩 에서 알아보자.