인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

화이팅님의 프로필 이미지
화이팅

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

OneToOne 즉시 로딩에 대한 조언을 구합니다.

작성

·

317

0

안녕하세요.

선생님 강의를 듣고 실무에서 JPA를 활용하고 있는 학생입니다.

현재 엔테티 구조가 OneToMany가 여러개가 있어서 동시에 fetch join을 2개 이상을 사용할 수 없는 상황입니다.[bag exception]

그래서 지연 로딩과 batch_size를 활용하고 있습니다.

여기서 문제가 발생했습니다. 지연 로딩으로 불러오는 부분에서 연관 관계의 주인이 아닌 NftProduct 엔티티에 OneToOne 관계가 있어 Membership 엔티티를 즉시 로딩[n+1 발생]합니다.

이런 경우에는 어떤식으로 풀어가는게 좋은 방법일지 궁금하여 질문드립니다.

구글링 했을 때는 MixFormula 엔티티의 List<MixMaterialFormula>의 결과 값을 조회하는 별도의 fetch join[MixMaterial, NftProduct, Membership] 쿼리를 호출하여 해결하는 방법도 있던데 어떤 방법이 좋은 방법일 지 궁금하여 문의드립니다.

iShot_2022-10-11_13.55.10.png

답변 2

1

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

안녕하세요. 정민영님

이런 경우 상황에 따라서 다른데요.

1,2 번 방법 모두 고려해야 합니다. 그런데 보통 1번 방법이 DB에서 조회할 수 있는 데이터를 최소화 하기 때문에 가급적 1번 방법을 선택하게 됩니다. 필터링 할 데이터가 적거나 전체 데이터가 크지 않은 경우에는 2번 방법도 사용합니다.

1번 방법을 사용하면서 또 활용2편에서 설명드린 최적화를 적용하시길 바랍니다.

추가로 둘다 어려운 상황에서는 네이티브 쿼리도 고려하셔야 합니다. JdbcTemplate 사용 등등

감사합니다.

화이팅님의 프로필 이미지
화이팅
질문자

감사합니다!

선생님의 답변이 정말 큰 도움이 됬습니다!

강의를 정독했는데 최적화 부분을 까먹었네요ㅜ 다시 한번 들어야 겠네요!!

0

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

안녕하세요. 정민영님

다음을 참고해주세요.

https://www.inflearn.com/questions/40670

감사합니다.

화이팅님의 프로필 이미지
화이팅
질문자

선생님 보내주신 링크는 잘 읽어봤습니다.

제가 궁극적으로 궁금한 점은 하나의 jpql에서 OneToMany인 fetch join이 2개 이상일 경우 발생하는 MultipleBagFetchException을 해결하기 위한 default_batch_fetch_size을 사용했을 때 where 조건을 어떻게 넣는게 효율적인가를 고민하고 있습니다.

GrandParent란 메인 엔티티가 있고 그 밑에 OneToMany 연관 관계인 Parent 엔티티가 있고 또 그 밑에 OneToMany 연관 관계인 Child 엔티티가 있을 때 GrandParent와 Parent는 하나의 jpql로 가져오고 Child는 default_batch_fetch_size를 활용하여 지연 로딩으로 가져왔을 때 Child의 대한 where 조건을 어떻게 넣는게 좋을까 고민이 됩니다.

개인적으로 고민했을 때

  1. Parent의 Id를 in 절에 넣고 다른 where 조건을 추가 후 자바 코드 상에서 조립을 하는 방법..[직접 코드로 짜야할지.. 하이버네이트에서 지연 로딩 시 where 조건을 추가할 수 있을까요?]

  2. 그냥 일반 적인 지연 로딩을 활용 후 자바 코드 상에서 조건들을 필터링 하는 방법

 

실무에서는 어떻게 해결하며, 더 좋은 방법이 있을지 궁금합니다.

화이팅님의 프로필 이미지
화이팅

작성한 질문수

질문하기