• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

BatchSize 조회 관련건

22.09.19 09:31 작성 조회수 239

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님의 프로필

y2gcoder

2022.09.19

안녕하세요. 쌉고수갓영한님, 공식 서포터즈 y2gcoder입니다.

해당 부분은 BatchSize 기본 전략과 관련된 부분인데요, 해당 부분은 아래 링크를 참고해주십시오:)

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


감사합니다.

감사합니다.