inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

BatchSize 조회 관련건

해결된 질문

336

쌉고수갓영한

작성한 질문수 1

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절에 데이터가 바인딩 되는 것이 아니라 하이버네이트 내부적으로 조정할 수도 있다고 하는데 해당 말이 맞는건지, 제가 무언가를 잘못한건지 궁금합니다.

 

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)

 

감사합니다.

spring JPA spring-boot java

답변 1

0

y2gcoder

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

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

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


감사합니다.

0

쌉고수갓영한

감사합니다.

강의 관련 외 질문입니다.

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