작성
·
317
0
안녕하세요.
선생님 강의를 듣고 실무에서 JPA를 활용하고 있는 학생입니다.
현재 엔테티 구조가 OneToMany가 여러개가 있어서 동시에 fetch join을 2개 이상을 사용할 수 없는 상황입니다.[bag exception]
그래서 지연 로딩과 batch_size를 활용하고 있습니다.
여기서 문제가 발생했습니다. 지연 로딩으로 불러오는 부분에서 연관 관계의 주인이 아닌 NftProduct 엔티티에 OneToOne 관계가 있어 Membership 엔티티를 즉시 로딩[n+1 발생]합니다.
이런 경우에는 어떤식으로 풀어가는게 좋은 방법일지 궁금하여 질문드립니다.
구글링 했을 때는 MixFormula 엔티티의 List<MixMaterialFormula>의 결과 값을 조회하는 별도의 fetch join[MixMaterial, NftProduct, Membership] 쿼리를 호출하여 해결하는 방법도 있던데 어떤 방법이 좋은 방법일 지 궁금하여 문의드립니다.
답변 2
1
안녕하세요. 정민영님
이런 경우 상황에 따라서 다른데요.
1,2 번 방법 모두 고려해야 합니다. 그런데 보통 1번 방법이 DB에서 조회할 수 있는 데이터를 최소화 하기 때문에 가급적 1번 방법을 선택하게 됩니다. 필터링 할 데이터가 적거나 전체 데이터가 크지 않은 경우에는 2번 방법도 사용합니다.
1번 방법을 사용하면서 또 활용2편에서 설명드린 최적화를 적용하시길 바랍니다.
추가로 둘다 어려운 상황에서는 네이티브 쿼리도 고려하셔야 합니다. JdbcTemplate 사용 등등
감사합니다.
0
선생님 보내주신 링크는 잘 읽어봤습니다.
제가 궁극적으로 궁금한 점은 하나의 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 조건을 어떻게 넣는게 좋을까 고민이 됩니다.
개인적으로 고민했을 때
Parent의 Id를 in 절에 넣고 다른 where 조건을 추가 후 자바 코드 상에서 조립을 하는 방법..[직접 코드로 짜야할지.. 하이버네이트에서 지연 로딩 시 where 조건을 추가할 수 있을까요?]
그냥 일반 적인 지연 로딩을 활용 후 자바 코드 상에서 조건들을 필터링 하는 방법
실무에서는 어떻게 해결하며, 더 좋은 방법이 있을지 궁금합니다.
감사합니다!
선생님의 답변이 정말 큰 도움이 됬습니다!
강의를 정독했는데 최적화 부분을 까먹었네요ㅜ 다시 한번 들어야 겠네요!!