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);