일반적으로 불필요하게 리소스를 낭비를 하지 않기 위해 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 을 사용하는 것입니다.
'JPA' 카테고리의 다른 글
N + 1 Query, 쿼리 호출 증가 JPA Batch Fetch Size로 방지하자 (0) | 2020.09.23 |
---|---|
Spring Data JPA 에서 getOne 과 findById 차이점 (0) | 2019.10.25 |
JPA Lazy Loading (0) | 2019.08.06 |
댓글