해결된 질문
작성
·
279
0
안녕하세요. 먼저 항상 좋은 강의 감사드립니다.
realworld라는 프로젝트를 JPA로 구현하는 도중에 궁금한 점이 생겨서 질문 드립니다.
@OneToMany
List<ArticleTagEntity> articleTags
ArticleEntity는 위의 ArticleTagEntity를 갖고 있습니다. (Lazy 설정 되어있습니다.) 저는 application.yml에 default_batch_fetch_size를 500으로 설정해놓고
... ArticleEntity 조회 로직 ...
List<ArticleTagEntity> articleTagList = articleEntity.getArticleTags();
articleTagList.forEach(articleTag -> ....);
다음 부분에서 WHERE IN 절 쿼리가 나가는데요, ArticleEntity 조회 로직에서 조회된 ArticleEntity의 개수는 총 12개입니다. 그렇다면 batch_size를 500으로 설정해놨으니 WHERE IN 절에서 article_id가 12개가 모두 바인딩되서 나가는 것을 기대했는데 실제로는 그렇지 않고 10개 나간뒤 반복문을 돌다가 2개가 다시 나가는 쿼리가 발생했습니다.
Hibernate:
select
articletag0_.article_id as article_4_1_1_,
articletag0_.uid as uid1_1_1_,
articletag0_.uid as uid1_1_0_,
articletag0_.created_at as created_2_1_0_,
articletag0_.updated_at as updated_3_1_0_,
articletag0_.article_id as article_4_1_0_,
articletag0_.tag_id as tag_id5_1_0_
from
article_tag articletag0_
where
articletag0_.article_id in (
?, ?, ?, ?, ?, ?, ?, ?, ?, ?
)
....
....
... for문을 쭉 돌다가...
Hibernate:
select
articletag0_.article_id as article_4_1_1_,
articletag0_.uid as uid1_1_1_,
articletag0_.uid as uid1_1_0_,
articletag0_.created_at as created_2_1_0_,
articletag0_.updated_at as updated_3_1_0_,
articletag0_.article_id as article_4_1_0_,
articletag0_.tag_id as tag_id5_1_0_
from
article_tag articletag0_
where
articletag0_.article_id in (
?, ?
)
구글링을 해보니 batch_size를 큰 값으로 설정했어도 반드시 그 사이즈로 WHERE IN절에 데이터가 바인딩 되는 것이 아니라 하이버네이트 내부적으로 조정할 수도 있다고 하는데 해당 말이 맞는건지, 제가 무언가를 잘못한건지 궁금합니다.
TRACE 로그를 확인해봤는데 ArticleEntity 조회 로직에서
2022-09-17 22:38:32.511 TRACE 8458 --- [ Test worker] org.hibernate.type.CollectionType : Created collection wrapper: [springboot.domain.entity.ArticleEntity.articleTagEntities#88]
..........................................
..........................................
2022-09-17 22:38:32.515 TRACE 8458 --- [ Test worker] org.hibernate.type.CollectionType : Created collection wrapper: [springboot.domain.entity.ArticleEntity.articleTagEntities#1]
이러한 로그가 총 12개 찍혔는걸로 봐서는 조회 시점에 프록시 객체는 모두 정상적으로 만들어 진 것으로 보입니다.
이전 질문을 찾아보니 요분과 테이블 구조는 거의 같다고 보시면 될 것 같습니다. (https://www.inflearn.com/questions/591443)
감사합니다.
답변 1
0
안녕하세요. 쌉고수갓영한님, 공식 서포터즈 y2gcoder입니다.
해당 부분은 BatchSize 기본 전략과 관련된 부분인데요, 해당 부분은 아래 링크를 참고해주십시오:)
https://www.inflearn.com/questions/34469
감사합니다.
감사합니다.