Member member = em.find(Member.class, "member1");
Team team = member.getTeam(); // 객체 그래프 탐색
System.out.println(team.getName()); // 팀 엔티티 사용
JPA는 위와 같은 코드를 사용할 때 조회 시점을 선택할 수 있도록 두 가지 방법을 제공한다.
즉시 로딩: 엔티티를 조회할 때 연관된 엔티티도 함께 조회한다.
Member member = em.find(Member.class, "member1");
로 멤버를 호출할 때 연관된 팀 엔티티도 함께 조회한다.
@ManyToOne(fetch = FetchType.EAGER)
지연 로딩: 연관된 엔티티를 사용할 때 조회한다.
Member 객체를 조회할 때 Member 조회 쿼리가 한번 발생하고 Team은 프록시 객체로 내려받는다.
System.out.println(team.getName());
에서 team의 데이터를 실제로 사용할 때 쿼리가 발생
@ManyToOne(fetch = FetchType.LAZY)
그렇다면 Member와 Team을 함께 사용하는 일이 많다면 즉시 로딩으로 설정하고 Member만 사용하는 일이 많다면 지연 로딩을 사용하면 되겠구나!
노노 그렇지 않다. 가급적이면 전부 다 즉시 로딩으로 설정해놓고 N+1이 발생하는 경우는 Fetch Join으로 해결하는 것이 좋다.
이유는 아래와 같다.
다음은 N+1 문제와 패치 조인에 대해서 Araboza