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

감바스님의 프로필 이미지
감바스

작성한 질문수

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

주문 조회 V3.1: 엔티티를 DTO로 변환 - 페이징과 한계 돌파

안녕하세요 프로젝트를 진행하다가 MultipleBagFetchException 예외를 만나 질문 합니다.

작성

·

17

·

수정됨

0

프로젝트를 진행하면서 MultipleBagFetchException 예외를 만나 예전에 영한님 강의에서 해결법 같은게 생각나서 다시 강의를 듣고 아래와 같이 default_batch_fetch_size 옵션으로 문제를 해결하려 했으나 여전히 MultipleBagFetchException 예외가 발생해 질문합니다.

jpa:
  hibernate:
    ddl-auto: update
  properties:
    hibernate:
      default_batch_fetch_size: 1000

 

2개 이상의 OneToMany 엔티티에 Fetch Join을 선언했을때 MultipleBagFetchException가 발생함을 인지했고 이러한 문제를 해결하기 위해 default_batch_fetch_size 옵션도 추가 했으나 여전히 MultipleBagFetchException가 발생합니다. 혹시 몰라 SELECT 쪽에 DISTINCT도 추가했으나 여전히 예외가 발생합니다.

 

 

 

답변 2

1

감바스님의 프로필 이미지
감바스
질문자

2개 이상의 컬렉션 페치 조인에 default_batch_fetch_size 옵션은 아무 상관이 없고 2개 이상의 컬렉션 페치 조인 자체가 불가능 하군요... 제가 잘못알고 있었습니다.

0

안녕하세요, 감바스님. 인프런 AI 인턴입니다.

MultipleBagFetchException은 JPA 프로바이더인 하이버네이트가 여러 개의 컬렉션에 대해 페치 조인을 허용하지 않아 발생하는 예외입니다. 이 예외의 원인은 JPA가 카티션 곱을 피하기 위해 이러한 제한을 두고 있기 때문입니다.

default_batch_fetch_size 옵션은 Lazy 로딩을 최적화하기 위한 것이고, 페치 조인 다중 문제와는 직접적으로 관계가 없습니다. 또, 페치 조인을 사용할 때는 DISTINCT를 추가해도 에러가 해결되지 않습니다. 이는 데이터베이스 쿼리 단에서의 중복 제거기 때문에 JPA에서 발생하는 문제를 해결하지 않기 때문입니다.

이 문제를 해결하는 몇 가지 방법이 있습니다:

  1. 컬렉션을 SET으로 변경: 현재 사용 중이신 ListSet으로 변경하는 것도 방법입니다. 하지만 이 경우, 데이터 정렬이 중요하다면 고려해야 할 부분이 있습니다.

  2. 두 번에 나누어 가져오기: 관련된 엔티티들을 두 개의 쿼리로 나누어 각각 가져온 후, 로직에서 수동으로 병합하는 방법도 있습니다.

  3. DTO Projection 사용: SQL 쿼리의 결과를 직접 특정한 DTO로 매핑하여 관련 데이터를 험상하게 가져오는 방법입니다.

기술적으로 가장 이상적인 해결책은 프로젝트 상황과 요구사항에 따라 다르므로, 위 방법들을 고려해보시기 바랍니다. 다음은 관련된 기존 질문을 참고할 수 있는 링크입니다:

이 질문들이 감바스님에게 좋은 참고가 될 것입니다. 추가적으로 정말 적합한 방법을 찾기 위해 강의를 끝까지 들어보시는 것도 좋은 선택입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

감바스님의 프로필 이미지
감바스

작성한 질문수

질문하기