BatchSize 조회 관련건
안녕하세요. 먼저 항상 좋은 강의 감사드립니다.
realworld라는 프로젝트를 JPA로 구현하는 도중에 궁금한 점이 생겨서 질문 드립니다.
@OneToMany
List<ArticleTagEntity> articleTagsArticleEntity는 위의 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
감사합니다.
강의 관련 외 질문입니다.
0
85
2
SpringBoot4 + Hibernate7 모듈 등록 방법 공유
1
102
1
BeanCreationException
0
99
3
Update 후 UpdateMemberResponse 매핑할 때
0
59
1
트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?
0
104
2
페이징 + 검색조건 관련해서 질문드립니다.
0
74
1
Query Dsl Q파일 질문입니다.
0
86
1
루트 쿼리라는것은
0
63
1
메서드를 분리하는 기준
0
72
1
findAllWithMemberDelivery 메서드 질문드립니다.
0
116
3
연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략
0
92
2
fetch join과 영속화와 OSIV의 관계
0
92
2
Distinct 사용 전 결과에 대한 의문
0
121
2
레포지토리 계층에서의 트랜잭션에 대한 의문
0
63
1
영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.
0
79
2
dto 필드 속 엔티티 여부
0
64
1
뷰템플릿 사용 시
0
83
2
Result 클래스 관련 질문
0
58
1
@PostConstruct 프록시 관련 질문드립니다
0
88
1
DTO 대신 Form 사용은 안되나요?
0
141
1
OSIV ON 상태일 때
0
100
1
fetch join VS fetch join 페이징 궁금증
0
191
2
양방향 연관관계 알아보는 법?
0
110
1
16강 17강 간단 정리 이게 맞을까요 ?
0
169
2





