작성
·
268
0
안녕하세요. 지난 번에 하나의 엔티티에 oneToMany 연관관계가 있는 두 개의 엔티티를 패치조인 하는 방식을 여쭤어보았습니다.
https://www.inflearn.com/questions/999265
답변은 NamedEntityGraph를 활용하여 두 개의 엔티티를 패치조인 하는 방식으로 알려주셨는데요. 조언 주신 방법을 적용해보니 다음과 같은 에러가 나왔습니다.
org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags: [com.project.kftcCenter.domain.securityMedia.model.KftcSecurityMedia.kftcSecurityMediaHistoryList, com.project.kftcCenter.domain.securityMedia.model.KftcSecurityMedia.kftcToken]
....
'cannot simultaneously fetch multiple bags'를 키워드로 검색해보니 2개 이상에 OneToMany 자식 테이블에 패치조인을 선언했을 때 나는 에러라고 하는데.. 딱 제가 조인 하려는 케이스 같은데요. 이럴 때 대안으로 하나만 패치조인을 하고 나머지는 lazy 조인을 하라는게.. 인터넷 서치를 해본 솔루션인데... 이거 말고 다른 방법으로 해결 할 수 있는 방법은 없을까요? 올바른 솔루션이 무엇일지 궁금합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴이에요.
@NamedEntityGraph
를 사용하여 여러 개의 엔티티를 패치조인할 때 발생하는 MultipleBagFetchException
에러는 일반적으로 한 엔티티에 여러 개의 컬렉션 속성이 있는 경우 발생합니다. Hibernate에서 컬렉션을 패치 조인할 때는 쿼리 내에서 한 번에 모든 컬렉션을 로드하려고 하기 때문에 이런 에러가 발생합니다.
이 문제를 해결하기 위한 일반적인 방법은 패치 조인 대신 batch-size
를 설정하여 일괄 조인하는 것입니다. batch-size
설정은 hibernate에서 컬렉션을 로딩할 때 일괄로 로딩하는 크기를 설정하는 옵션입니다. 컬렉션 크기별로 batch-size 값을 설정하여 일괄 로드되도록 조정할 수 있습니다.
예를 들어, kftcSecurityMediaHistoryList
컬렉션의 크기가 작고 kftcToken
컬렉션의 크기가 크다고 가정해보겠습니다. 이 경우, kftcSecurityMediaHistoryList
에 대해서는 패치 조인을 사용하고, kftcToken
에 대해서는 LAZY로 설정하여 필요할 때만 로드하도록 변경해볼 수 있습니다.
하지만, 이 방법은 모든 상황에 적용될 수 있는 완벽한 솔루션이 아닐 수 있습니다. 실제로 사용하는 엔티티와 어떻게 관리하느냐에 따라 상황에 맞는 최적의 방법이 달라질 수 있습니다. 따라서, 데이터 모델과 요구사항에 따라 최선의 결정을 해야 합니다.
더 나은 방법을 찾기 위해 다른 해결책을 탐색하고 싶다면, Hibernate의 성능 튜닝 옵션들을 활용하거나, JPA의 fetch 전략을 바꿔보는 등 다양한 시도를 해볼 수 있습니다. 또한, 엔티티 간의 관계를 재설계하여 발생 가능한 MultipleBagFetchException
을 피할 수도 있습니다.
그러나 상세한 구현이나 코드를 알 수 없으므로, 미리 정해진 규칙은 없습니다. 구체적인 코드와 데이터 모델에 대한 정보가 있으면 더 정확한 도움을 드릴 수 있을 것 같아요.
이런 상황에서는 보다 구체적이고 정확한 도움을 받기 위해서는 개발자분의 코드나 엔티티 및 관계에 대한 정보가 필요합니다. 만약 개발과 관련된 질문이 있으시다면 언제든지 도움을 주세요. 감사합니다.