JPA [기본] 페치조인 중요!!

신재원·2023년 2월 3일
0

JPA 기본

목록 보기
28/31

📌 페치조인 (Fetch Join)

  • SQL의 조인 종류가 아니다.
  • JPQL에서 "성능 최적화"를 위해 제공하는 기능
  • 연관된 엔티티나 컬렉션을 SQL 한번에 함께 조회하는 기능이다
  • join fetch 명령어 사용
  • 페치 조인 ::= [LEFT [OUTER] | INNER] JOIN FETCH 조인경로

엔티티 페치 조인

  • 예시 ) 회원을 조회하면서 연관된 팀도 함께 조회하고싶을경우
    (@ManyToOne 관계)

✔ 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

  • INNER JOIN 실행 팀의 NAME을 조인
  • INNER JOIN 임으로 회원4 인 NULL 값은 조인 되지않는다.
  • fetch join을 사용해 회원을 조회하면서 동시에 연관된 팀을 함께 조회한다.

컬렉션 페치 조인

  • 일대다 관계 (@OneToMany), 컬렉션 페치조인

✔ JPQL
select t from Team t join fetch t.members where t.name ='팀A'
✔ SQL 쿼리 반환
SELECT T.*,M.* FROM TEAM T INNER JOIN MEMBER M ON T.ID = M.TEAM_ID WHERE T.NAME = '팀A'

  • 컬렉션 페치 조인시 주의할점
  • 팀 A를 조회하면 DB입장에서는 일대다 관계임으로 MEMBER에 해당되는 값의 갯수만큼 반환하게 된다.
  • 이처럼 로그가 해당 되는 갯수만큼 찍히게된다.
  • 해결
    : DISTINCT을 사용하면 같은식별를 가진 중복 엔티티를 제거해 주지만,

    참고 : SQL의 DISTINCT를 추가해도 데이터가 완전히 일치하지않으면 ""SQL결과"" 에서 중복제거가 실패한다

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

  • 일반 조인 실행시 연관된 엔티티를 함께 조회하지 않는다.
  • JPQL은 결과를 반환할때 연관관계를 고려하지 않는다.
  • 단지 SELECT 절에 지정한 엔티티만 조회할 뿐이다.

0개의 댓글