프록시 객체는 주로 연관된 엔티티를 지연 로딩할 때 사용된다.
//member1이 team1에 소속해 있다고 가정Member member = em.find(Member.class, "member1");Team team = member.getTeam(); //객체 그래프 탐색team.getName(); //팀 엔티티 사용
회원 엔티티를 조회할 때 연관된 팀 엔티티도 함께 DB에서 조회할지
아니면 회원 엔티티만 조회해 두고 팀 엔티티는 실제 사용하는 시점에 DB에서 조회할지
JPA는 개발자가 연관된 엔티티의 조회 시점을 선택할 수 있도록 두가지 방법을 제공한다.
em.find(Member.class, "member1)을 호출할 때 회원 엔티티와 연관된 팀 엔티티도 함께 조회한다. - 설정 방법 : @ManyToOne(fetch = FetchType.EAGER) - 지연 로딩 : 연관된 엔티티를 실제 사용할 때 조회 - 예) member.getTeam().getName()처럼 조회한 팀 엔티티를 실제 사용하는 시점에 JPA가 SQL을 호출해 팀 엔티티를 조회한다. - 설정 방법 : @ManyToOne(fetch = FetchType.LAZY)즉시 로딩(EAGER LOADING)을 사용하려면 @ManyToOne의 fetch 속성을 FetchType.EAGER로 지정한다.
//즉시 로딩 설정@Entitypublic class Member{ ... @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "TEAM_ID") private Team team; ...}//즉시 로딩 실행Member member = em.find(Member.class, "member1");Team team = member.getTeam();

회원과 팀을 즉시 로딩으로 설정했다.
em.find(Member.class, "member1")로 회원을 조회하는 순간 팀도 함께 조회한다.(즉시 로딩)
회원과 팀 두 테이블을 조회해야 하므로 쿼리를 2번 실행한 것 같지만,
대부분의 JPA 구현체는 즉시 로딩을 최적화하기 위해 가능하면 조인 쿼리를 사용한다.
--즉시 로딩 실행 SQLSELECT M.MEMBER_ID AS MEMBER_ID, M.TEAM_IA AS TEAM_ID, M.USERNAME AS USERNAME, T.TEAM_ID AS TEAM_ID, T.NAME AS NAMEFROM MEMBER M LEFT OUTER JOIN TEAM T ON M.TEAM_ID=T.TEAM_IDWHERE M.MEMBER_ID='member1'