<aside> 🌴

프록시

엔티티를 조회할 때 연관된 엔티티가 항상 조회되는 것은 아니다.

public void printUserAndTeam(String memberId) {
		Member member = em.find(Member.class, memberId);
		Team team = member.getTeam();
		
		System.out.println(member.getUsername());
		System.out.println(team.teamName());}

member.getUsername() 은 회원만 조회하므로 연관된 팀 엔티티까지 DB에서 함께 조회하는 건 효율적이지 않다!

→ 이를 해결하기 위해 JPA 는 지연로딩을 제공함!!

<aside> 🌴

지연로딩

엔티티가 실제 사용될 때까지 DB 조회를 지연한다.

ex) team.getName() 처럼 실제 사용할 때 DB에서 팀 엔티티에 필요한 데이터를 조회한다.

</aside>

지연 로딩은 어떻게 사용할까?

지연 로딩을 사용하려면 실제 엔티티 객체 대신에 DB 조회를 지연할 수 있는 가짜 객체가 필요하다. 이 가짜 객체를 프록시 객체라 한다.

📍 참고로 JPA 표준 명세는 지연로딩 구현방법은 JPA 구현체에 위임했다. 따라서 지금부터 설명할 내용은 하이버네이트 구현체에 대한 내용이다. 하이버네이트는 프록시 사용법과 바이트코드 수정방법을 제공한다. 바이트코드 수정방법은 복잡하므로 프록시만 알아보자!

프록시 기초

em.find() 처럼 엔티티를 직접 조회하면 조회한 엔티티 사용유무와 상관없이 DB를 조회한다.