💿 즉시 로딩과 지연 로딩

프록시 객체는 주로 연관된 엔티티를 지연 로딩할 때 사용된다.

//member1이 team1에 소속해 있다고 가정Member member = em.find(Member.class, "member1");Team team = member.getTeam(); //객체 그래프 탐색team.getName(); //팀 엔티티 사용

회원 엔티티를 조회할 때 연관된 팀 엔티티도 함께 DB에서 조회할지

아니면 회원 엔티티만 조회해 두고 팀 엔티티는 실제 사용하는 시점에 DB에서 조회할지

JPA는 개발자가 연관된 엔티티의 조회 시점을 선택할 수 있도록 두가지 방법을 제공한다.

1. 즉시 로딩

즉시 로딩(EAGER LOADING)을 사용하려면 @ManyToOnefetch 속성을 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'