JAVA/JPA
@EntityGraph
gracelove91
2020. 2. 11. 02:49
@EntityGraph
fetch join
fetch가 LAZY로 되어있어도 연관된 객체를 즉시 조회한다.
위와 같이 Member -> Team 관계를 맺고 있을 때 fetch 옵션이 LAZY라면 Member 엔티티를 조회할 때, 연관된 Team 엔티티는 프록시 객체로 조회된다.
이때 셀렉트 쿼리는 Member만을 찾는 셀렉트쿼리 한번이 나가고,
Member.getTeam().getName();
같이 프록시 객체의 실제값을 호출할 때 그제서야 Team에 대한 쿼리도 나간다.만약 Team이 두 개라면 N + 1문제가 터진다. 1은 Member, N(2)은 Team.
다음과 같이 fetch 조인으로 Member와 Team을 조인시켜 한방쿼리로 해결한다.
@Query("select m from Member as m left join fetch m.team") List<Member> findMemberFetchJoin(); @EntityGraph(attributePaths = {"team"}) List<Member> findEntityGraphByUsername(@Param("username") String username);