본문 바로가기
QueryDSL

QueryDsl 사용 시 CrossJoin 발생하는 경우와 해결 방법

by devLog by Ronnie's 2022. 7. 29.

들어가며


QueryDsl을 사용하던 도중 원치않게 CrossJoin이 발생하는 경우를 발견하여 해당 사항을 정리한다.

 

 

Cross Join


먼저 CrossJoin이 무엇인지에 대해서 알아본다.

CrossJoin은 교차조인이라고 말하여 두 테이블이 있을때 교차조인을 하게 되면 두 테이블의 데이터의 모든 조합을 나타내게 된다.

한쪽에 데이터가 n개이고 다른 한쪽에 데이터가 m개라고 한다면 총 n x m개의 경우의 수가 나타나게 되어 데이터가 많은 테이블이라면 사용할때 주의하지 않으면 성능상 큰 문제를 가져올 수 있다.

 

 

Cross Join 발생하는 경우


위에서도 설명을 했듯이 교차 조인이 필요하여 사용하는 경우는 상관없지만 원치않는 상황에서 교차조인이 발생하게 되면 성능상 문제가 될 수 있기에 원치 않는 교차 조인이 발생하게 되면 대응이 필요하다.

 

먼저 필자의 경우에는 QueryDsl을 사용하는 도중 별도의 Join절을 선언하지 않고 where문에서 바로 연관관계를 사용하게 되는 경우에 Cross Join 이 발생하였다. 

 

콘솔창에 찍히는 쿼리문을 항상 보는데 이때 Cross Join이 발견되었다. 

혹시 콘솔창에 쿼리문이 찍히지 않는다면 아래 옵션을 설정해주자.

이렇게 명시적으로 join절을 선언하지 않으면 QueryDsl-JPA에서는 JPQL의 내부 구현체인 하이버네이트가 가진 특성으로 암묵적으로 CrossJoin을 사용하는 경향이 있다고 한다.

 

 

해결방법


위에서보면 알겠지만 암묵적으로 사용했을때 교차조인이 발생하게 되므로 명시적으로 Join 절을 선언해주면 해결이 가능하다.

 

CrossJoin 발생하는게 문제가 아니라 원치 않는 상황에서 발생하는 것이 문제이므로 혹여나 원치 않는 상황에서 CrossJoin 발생하게 된다면 Join절을 통해 명시적으로 선언을 해주자.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'QueryDSL' 카테고리의 다른 글

Querydsl - CaseBuilder를 통한 Case When 사용 방법  (0) 2022.02.16

댓글