JPA/Fetch join

JPQL 페치 조인 (fetch join) - ①

수달하나 2021. 7. 23. 21:46

JPQL fetch join

  • SQL 조인 종류가 아니다.
  • JPQL에서 성능 최적화를 위해 제공하는 기능으로 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능이다.
  • join fetch 명령어를 사용한다.

 

ex) 회원을 조회하면서 연관된 팀도 같이 조회하고 싶다.

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

 

 

 

컬렉션 페치 조인

일대다 관계, 컬렉션 페치 조인

 

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'

 

*다대일 관계와는 다르게 일대다 관계일 때는 데이터가 중복 되는 부분을 조심해야 한다.

따라서 중복을 DISTINCT 로 제거해야 한다.

단 주의 할점은 완전히 똑같은 상태일 경우에만 중복 제거가 되기 때문에 일반 DISTINCT가 아닌 JPQL에서 제공하는 DISTINCT를 사용 해야 한다. (사용 방법은 똑같기 때문에 distinct 를 추가로 넣어주면 됨)

 

 

JPQL의 DISTINCT 2가지 기능

  1. SQL에 DISTINCT 기능
  2. 애플리케이션에서 엔티티 중복을 제거

 

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

일반 조인 실행시 연관된 엔티티를 함께 조회하지 않음

 

JPQL join 쿼리 → select t from Team t join t.members m where t.name = ‘팀A'

실제 동작하는 SQL 쿼리 → SELECT T.* FROM TEAM T INNER JOIN MEMBER M ON T.ID=M.TEAM_ID WHERE T.NAME = '팀A'

 

JPQL join fetch 쿼리 → 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'

 

 

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

 

join은 결과를 반환할 때 연관관계 고려하지 않고 단지 SELECT 절에 지정한 엔티티만 조회한다.

fetch join은 연관된 엔티티도 함께 조회한다. 결국 객체 그래프를 SQL 한 번에 조회하는 개념이다.