코드 그라데이션

fetch join (페치 조인) (3) 페치 조인 vs 일반 조인, 페치 조인의 한계 본문

Database/JPQL

fetch join (페치 조인) (3) 페치 조인 vs 일반 조인, 페치 조인의 한계

완벽한 장면 2023. 9. 2. 18:42

페치 조인과 일반 조인의 차이 

 

JPQLMain

public class JpqlMain {

  public static void main(String[] args) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
    EntityManager em = emf.createEntityManager();

    EntityTransaction tx = em.getTransaction();
    tx.begin();

    try {
      Team teamA = new Team();
      teamA.setName("팀A");
      em.persist(teamA);

      Team teamB = new Team();
      teamB.setName("팀B");
      em.persist(teamB);

      Member member1 = new Member();
      member1.setUsername("회원1");
      member1.setTeam(teamA);
      em.persist(member1);

      Member member2 = new Member();
      member2.setUsername("회원2");
      member2.setTeam(teamA);
      em.persist(member2);

      Member member3 = new Member();
      member3.setUsername("회원3");
      member3.setTeam(teamB);
      em.persist(member3);


      em.flush();
      em.clear(); // 비움


      String query = "select t from Team t join t.members m";
      List<Team> result = em.createQuery(query, Team.class)
          .getResultList();

      System.out.println("result = " + result.size());

      for (Team team : result) {
        System.out.println("team = " + team.getName() + ", 인원수 : "+ team.getMembers().size());

        for (Member member : team.getMembers()) {
          System.out.println(" -->  member = " + member);
        }

      }

      tx.commit();
    } catch (Exception e) {
      tx.rollback();
      e.printStackTrace();
    } finally {
      em.close();
    }
    emf.close();
  }
}

 

쿼리에서 팀을 조회했고, 분명히 멤버와 조인도 했다.

그런데 보면, select 절에서 팀만 가져오고 있다.

당연하다.

그냥 조인은 join을 한 join문만 SQL에서 실행되는 거지 실제 데이터를 퍼올리는 건 t에 대한 것만 올린다.

 

그냥 조인도 데이터 뻥튀기 되어서 result = 3이 출력됨.

 

컬렉션은 무조건 프록시는 아니지만 데이터가 로딩 시점에 로딩이 다 안 되어서

쿼리가 계속 나가는 모습이 보임.

 


정리

페치 조인과 일반 조인의 차이

 

 

 

페치 조인 실행 예시

 


 

페치 조인의 특징과 한계

 

페치 조인 - 정리

728x90

'Database > JPQL' 카테고리의 다른 글

엔티티 직접 사용  (0) 2023.09.03
JPQL - 다형성 쿼리  (0) 2023.09.02
fetch join (페치 조인) (2) 컬렉션 페치 조인, DISTINCT  (0) 2023.09.02
fetch join (페치 조인) (1) 기본  (0) 2023.09.02
경로 표현식  (0) 2023.09.01
Comments