인프런 커뮤니티 질문&답변

김정훈님의 프로필 이미지
김정훈

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

1:N 계층구조 테이블들 간에 Fetch 조인 사용 질문 드립니다.

작성

·

222

·

수정됨

0

안녕하세요. 열심히 강의를 듣고 있는 수강생입니다!

궁금한게 있습니다.

현재 실무에서 사용하고 있는 구조를 좀더 개선시키고 싶어서 열심히 노력중인데요.

현재 상황을 말씀 드리겠습니다.

A, B, C, D 테이블이 있습니다.

각 entitiy 클래스 별로 OneToMany로 A-B, B-C, C-D 이런식으로 Relation이 걸려 있습니다.

현재 기준으로는 각 OneToMany 별로 BatchSize=1000 & FetchType=Eager로 적용이 되어있는데요.

이렇다 보니, A 테이블 조회시 조회된 ID 기준으로 하위 테이블들에 대해서 IN쿼리가 몇개씩 불려지게 됩니다.

 

그래서 Fetch 조인을 통해서 한번에 가져오는 방식으로 바꿔보려고 개선을 하려고 했는데요.

예를 들면

select a.* from A a

left fetch join a.B b

left fetch join b.C c

left fecth join c.D d

이런식으로 하려고했더니 컴파일 단계에서 MultipleBagFetchException이 발생 하였습니다.

그래서 찾아보니 fecth 조인 사용할 경우에는 oneToMany로 걸리는 대상이 2개 이상이면

위와같은 Exception을 떨군다고 하더라구요..(카티션 곱 이슈로 인한 하이버네이트에서 사전에 미리 막는..)

 

그래서 결국에는 A-B까지만 Fetch로 빼고 나머지 B-C, C-D는 기존 그대로 Eager 전략으로

기존과 동일하게 조회되도록 조금이나마 개선은 했는데요..

B-C, C-D를 lazy로 바꾸니 N+1이 발생했구요.. N+1해소 하는 방법으로 Fecth조인을 쓰자니

위와같은 Exception이 발생을 하구요..

어떻게 하면 좋을까요.. 도와주세요!

 

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 김정훈님

궁금해하시는 내용이 이번 강의에서 다루는 내용들입니다 🙂

이번 강의를 끝까지 들어보시면 궁금한 내용이 자연스럽게 해결되실거에요.

감사합니다.

김정훈님의 프로필 이미지
김정훈
질문자

그렇군요, 현재 절반정도 수강했는데

완강하고 다시 고민 해보겠습니다. 감사합니다.

김정훈님의 프로필 이미지
김정훈

작성한 질문수

질문하기