사용 이유
- 엔티티에는 다양한 연관관계가 걸려있다. → 하지만 당장 쓰지도 않는 연관관계 걸린 객체가 우수수 딸려온다면 성능상 문제가 될거다.
- 이때 프록시 객체를 사용하여 데이터베이스 조회를 미루는 가짜 객체를 만들고,
- 연관관계 걸린 해당 객체가 필요할 때 프록시 객체가 실제 객체를 호출하면 해결!
특징
- em.find()가 아닌, em.getReference()로 조회된다.
- 영속성 컨텍스트에 찾는 엔티티 이미 있으면 em.getReference()는 em.find()랑 똑같은 효과가 난다.
- 실제 클래스(원본 엔티티)를 상속받아서 만들어진다.
- ==로 비교하면 안되고 instance of를 사용하자.
- 사용자 입장에서는 진짜 객체인지 구분하지 않고 쓰면 된다.
- 실제 객체의 참조를(target) 보관한다.
- 프록시 객체 호출하면 실제 객체의 메소드를 호출한다.
- 처음 사용시 한 번 초기화된다.
- 초기화 된다고 실제 엔티티로 바뀌는 건 아니고, 실제 엔티티에 접근 가능한거다.
- 준영속 상태일 때(영속성 컨텍스트 도움 못받는 상황) 프록시 초기화하면 예외 터진다.
- 하이버네이트의 경우 org.hibernate.LazyInitializationException
Member member = em.getReference(Member.class, “id1”);
member.getName(); // 사용

REFERENCE
인프런 JAVA ORM 표준 JPA 프로그래밍 - 기본편