인프런 커뮤니티 질문&답변

leech2479님의 프로필 이미지
leech2479

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

페치 조인 2 - 한계

Batch size의 작동 순서가 궁금합니다.

작성

·

159

0

=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (/아니오)

[질문 내용]
프록시 부분도 있어 조금 복합적이긴 한데 Batch size의 작동 순서가 궁금합니다.

제가 이해하기로는 예를 들어 수업과 같이 Member 엔티티는

public class Member {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private int age;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "TEAM_ID")
    Team team;

}


Team 엔티티는

public class Team {
    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @BatchSize(size = 100)
    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();
}

위와 같다고 할때

select t from Team t

해당 JPQL로 Team 엔티티들을 조회한다면 t.members의 객체들은 프록시로 존재하여 id 값만을 가지게 되고

for (Team result : resultList) {
    System.out.println("result = " + result.getMembers().size());
    for (Member member : result.getMembers()) {
        System.out.println("member = " + member);
    }
}

이 처럼 실행하면서 result.getMembers()가 처음 호출 될때

select
        m1_0.TEAM_ID,
        m1_0.id,
        m1_0.age,
        m1_0.name 
    from
        Member m1_0 
    where
        m1_0.TEAM_ID in (?, ?...)

다음과 같은 쿼리를 호출해 Member 프록시들의 target에 알맞게 주입 해주게 되나요?

이 부분이 궁금하여 질문 드립니다.

답변 2

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. leech2479님

정확히는 result.getMembers()를 호출하는 시점이 아니라 result.getMembers().size(), result.getMembers().get(xxx)과 같이 해당 컬렉션을 실제 사용하는 시점에 말씀하신 초기화가 이루어집니다.

감사합니다.

leech2479님의 프로필 이미지
leech2479
질문자

답변 감사합니다!

-1

안녕하세요, 인프런 AI 인턴입니다.

질문주신 내용과 관련하여 default_batch_fetch_size 설정을 사용하는 방식과 @BatchSize 어노테이션을 사용한 경우에 대한 예시와 설명을 제공하는 자료를 찾았습니다. 이 정보들은 질문하신 batch size의 작동 순서와 관련하여 이해를 돕는데 도움이 될 것입니다.

  1. hibernate.default_batch_fetch_size 적용 안되는 경우: 이 질문은 default_batch_fetch_size 설정을 다루며, 프록시 객체를 get 할 때 간혹 in 쿼리가 정상적으로 동작하지 않는 사례에 대해 다루고 있습니다. @BatchSize 어노테이션과는 조금 다르지만, 배치 사이즈와 관련된 문제 해결의 예시가 될 수 있습니다.

  2. 페치조인의 hibernate sql 보다가..: 이 질문과 답변은 페치 조인과 함께 BatchSize 설정이 어떻게 동작하는지 궁금해하는 사용자의 질의에 대한 답변을 포함하고 있습니다. 비록 직접적인 @BatchSize 어노테이션 사용에 대한 설명은 없지만, 관련된 JPA의 쿼리 최적화 작동 방식에 대한 이해를 돕습니다.

이 정보들이 batch size의 작동 순서에 대한 궁금증을 조금이나마 해소하는데 도움이 되길 바랍니다. @BatchSize 어노테이션이나 default_batch_fetch_size 설정은 엔티티를 로딩할 때 지정된 사이즈만큼의 Id를 in 쿼리로 한 번에 조회함으로써 성능을 최적화하는 방법입니다. 이는 특히 한 번에 많은 양의 연관 엔티티를 로딩해야 할 때 유용하며, Batch 사이즈의 크기에 따라 쿼리 호출 수를 줄일 수 있어 성능 향상에 기여합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

leech2479님의 프로필 이미지
leech2479

작성한 질문수

질문하기