[데이터베이스]/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
반응형