본문 바로가기
JPA

Spring data jpa Lazy N+1 query / querydsl join 적용하기

by Gil Granger 2019. 10. 12.

 

일반적으로 불필요하게 리소스를 낭비를 하지 않기 위해 N : 1 or 1: N 관계에 LAZY로 설정합니다.

이에 대한 예시로 Member Entitiy 와 Group Entity로 나누었고, 서로 양방으로 참조하고 있다고 가정하겠습니다. 

 

 

 

여기서 Member의 테이블명은 cmember로 하였습니다. 새로 설치한 mysql 버전(8.0.17)에서 member테이블이  예약어로 잡혀있었기 때문에 ..ㅜ)

https://dev.mysql.com/doc/refman/8.0/en/keywords.html 보면 8.0.17 부터 예약어가 추가된것을 알수 있습니다.

 

여기서 간단하게 두개의 테이블을 inner join 하여 select 하는 메소드를 만들었습니다.

 

다음은 테스트 할 데이터를 넣기 위해 만든 메소드 입니다.

 

 

각 멤버들을 조회하는 테스트를 작성해 보겠습니다.

아시다시피 LAZY로 설정된 Entity들은 실제 pk id를 제외한 데이터에 접근해야 쿼리가 실행됩니다.

각 멤버의 그룹은 LAZY로 설정되어 있기 때문에 각 쿼리를 실행하기 위하여 멤버들을 순회하여 팀의 이름을 리스트로 가져와 봅니다.

 

자 이렇게 실행하면 

멤버들을 조회한 후 각 순회하면서 매번 팀을 조회하게 되면서 N+1 쿼리가 실행하게 됩니다.

from(member).innerJoin(member.team.team).fetch()

여기서 select로 강제로 member와 team를 조회해도 될것이라고 생각할 수 있지만 각 team 데이터가 매핑되지 않습니다.

 

 


(방법)

fetchJoin 을 사용하는 것입니다.

 

 

댓글