[Spring Boot]패치조인?

SeoYoung Jung·2022년 4월 1일
0

Spring

목록 보기
7/7

패치조인이 도대체 뭘까?

어쨋든 JPA에서 많이 얘기가 나오고 다루는 N+1의문제.
@XtoOne(fetch=LAZY)

  • 매번하기 너무 귀찮지않음? => 해결 : 패치조인 (지연로딩을 해도 loop돌때 결국 n+1이 발생한다.) or @BatchSize(Sizee=숫자)하면 post갯수의 쿼리 X 정해진 숫자 만큼의 쿼리가 돈다.

일단 일반조인과 패치조인의 차이는?

일반 조인은 기본적으로 지연 로딩이기 때문에 연관된 엔티티를 함께 조회하지 않는다.
일반 조인 > SELECT 절에 지정한 엔티티만 조회한다.
패치 조인> 객체 그래프를 SQL 한 번에 조회하는 개념

그럼 여기 나오는 객체 그래프는 뭘까?

-객체는 자유롭게 객체 그래프를 탐색할 수 있어야 한다.
-'.'을 찍어서 연관된 객체를 탐색하는 것을 객체 그래프 탐색이라 한다.
-객체 그래프 탐색은 처음 실행하는 SQL에 따라 탐색 범위 결정

패치 조인(fetch join)

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

*엔터티 패치 조인

SELECT m FROM Member m join fetch m.team SELECT M.*, T.* FROM MEMBER M INNER JOIN TEAM T ON M.TEAM_ID=T.ID

*컬렉션 패치 조인

select t from Team t join fetch t.members select T.*, M.* from TEAM T inner join MEMBER M ON T.ID=M.TEAM_ID- =결과가 중복되는 것을 막기위해 SQL과 JPQL은 DISTINCT를 제공한다. (모든 속성 값이 같아야 중복이 제거됨) JPQL은 어플리케이션 레벨에서 엔티티의 중복 제거를 함께 해준다.

BUT패치 조인의 한계

패치 조인은 기본적으로 모든 연관 그래프를 가지고 온다는 개념이다.
패치 조인 대상에는 별칭을 줄 수 없다. (where m.~ 이런 것 쓰면 안 됨)
둘 이상의 컬렉션은 패치 조인 할 수 없다.
컬렉션을 패치 조인하면 페이징 API를 사용할 수 없다.

profile
뚱땅뚱땅개발자

0개의 댓글