[JPA] Fetch Join

호호빵·2023년 5월 2일
0

JPA

목록 보기
8/8

Fetch Join


카테시안 곱

  • 카테시안 곱 (Cartesian Product) - 수학적
    {데카르트 곱 (Cartesian Product) 또는 곱 집합 (Product Set)}
    ㅇ 두 집합 A,B의 원소들로 만들어지는 모든 순서쌍 (a,b)들의 집합
    - a∈A 이고 b∈B 인 모든 순서쌍 (a,b)들의 집합

     例 1)  A = {1,2}, B = {c,d} 이면,
     -  A x B = {(1,c),(1,d),(2,c),(2,d)}, | A x B | = 2·2 = 4
     -  B x A = {(c,1),(d,1),(c,2),(d,2)}, | A x B | = 2·2 = 4
     -  A x A = {(1,1),(2,1),(2,1),2,2)}, | A x A | = 2·2 = 4

  • 카테시안 곱 - DB
    - union(교집합)/ interction(합집합)
    - From절에 2개 이상의 Table이 있을때 두 Table 사이에 유효 join 조건을 적지 않았을때 해당 테이블에 대한 모든 데이터를 전부 결합하여 Table에 존재하는 행 갯수를 곱한 만큼의 결과값이 반환되는 것


fetch join

  • SQL의 조인 종류가 아닌 JPQL에서 성능 최적화를 위해 제공하는 기능
  • 연관된 엔티티나 컬렉션을 SQL 한번에 함께 조회하는 기능
  • 조회의 주체가 되는 Entity 이외에 Fetch Join이 걸린 연관 Entity도 함께 SELECT 하여 모두 영속화
  • Fetch Join이 걸린 Entity 모두 영속화하기 때문에 FetchType이 Lazy인 Entity를 참조하더라도 이미 영속성 컨텍스트에 들어있기 때문에 따로 쿼리가 실행되지 않은 채로 N+1문제가 해결됨
  • 카테시안 곱이 발생하여 중복 발생 가능
JPQL - select m from Member m join fetch m.team
SQL - SELECT M.*, T.* FROM MEMBER M 
	  INNER JOIN TEAM T ON M.TEAM_ID=T.ID
      
// Querydsl

 Member findMember = queryFactory
          .selectFrom(member)
          .join(member.team, team).fetchJoin()
          .where(member.username.eq("member1"))
          .fetchOne();




Reference

카테시안 곱 - http://www.ktword.co.kr/test/view/view.php?m_temp1=6201
https://devlogofchris.tistory.com/29
join과 FetchJoin의 차이 - https://cobbybb.tistory.com/18
ORM 표준 JPA - JPQL 기본
QueryDSL - 기본문법

profile
하루에 한 개념씩

0개의 댓글

관련 채용 정보