엔티티를 조회할 때 연관된 엔티티들이 항상 사용되는 것은 아니다.
ex) 회원 엔티티를 조회할 때 연관된 팀 엔티티는 비즈니스 로직에 따라 사용될 때도 있지만 아닐 때도 있다.
회원과 팀 정보를 출력하는 로직
회원 정보만 출력하는 로직
왼쪽과 같은 로직일 경우, 단순히 회원만 조회하는 로직에서 참조하는 팀까지 조회한다면? → 비효율적임.
JPA에서는 이런 문제를 해결하기 위해 엔티티가 실제 사용될 때까지 데이터베이스 조회를 지연한다! → 이것이 *지연 로딩!!
지연 로딩을 사용하려면 실제 엔티티 객체 대신에 데이터베이스 조회를 지연할 수 있는 각자 객체가 필요 → 프록시 객체!!*
JPA에서 식별자로 엔티티 하나를 조회할 때는
EntityManager.find()
를 사용한다. → 이 메소드는 영속성 컨텍스트에 엔티티가 없으면 데이터베이스를 조회한다.
사용 예제
Member member = em.find(Member.class, "member1");
엔티티를 실제 사용하는 사용하는 시점까지 데이터베이스 조회를 미루고 싶다면? gerReference()
사용!
Member member = em.getReference(Member.class, "member1");
이 메소드를 호출할 때 JPA는 데이터베이스를 조회하지 않고 실제 엔티티 객체도 생성하지 않는다.
대신에 데이터베이스 접근을 위임한 프록시 객체를 반환한다.