inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

페치 조인 2 - 한계

jpa batchsize 관련 문의입니다

131

이호준

작성한 질문수 1

0


=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)


2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)

3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
이해가 잘 되었는 지 확인하고 싶어서 질문 드립니다

팀마다 100개의 맴버가 있고 팀이 400개가 있다고 가정하고 다음 명령을 실행 한다면

String jpql = "select t from Team t";
List<Team> result = em.createQuery(jpql, Team.class)
        .setFirstResult(0)
        .setMaxResults(3)
        .getResultList();
result.forEach(team -> {
    System.out.println("teamname = " + team.getName() + ", team = " + team);
    team.getMembers().forEach(member -> {
        //페치 조인으로 팀과 회원을 함께 조회해서 지연 로딩 발생 안함
        System.out.println("-> username = " + member.getName() + ", member = " + member);
    });
});



1.배치 사이즈를 적용하지 않은 경우
em.createQuery 실행으로 400개의 팀이 영속성 컨텍스트에 로딩된다
스트림에서 팀 내부의 맴버에 접근시
멤버를 영속성 컨텍스트에 로딩 하기위한 쿼리가 날아간다. 이 쿼리는 한 팀당 팀에 소속된 멤버를 로딩한다
따라서 1+400개의 쿼리가 날아간다

2. 배치 사이즈(100)을 적용한 경우
em.createQuery 실행으로 400개의 팀이 영속성 컨텍스트에 로딩된다
스트림에서 팀 내부의 멤버에 접근 하면 해당 팀의 멤버가 로딩되지 않은 것을 확인한다
영속성 컨텍스에 존재하는, 멤버가 로딩되지 않은 팀들의 id를 배치 사이즈 즉 100개 만큼 수집한다.
수집된 팀 ID들을 사용하여 하나의 IN 쿼리를 날려 해당 팀들의 멤버들을 한 번에 로딩한다
이후 다른 팀의 getMembers()가 호출되면, 아직 멤버가 로딩되지 않은 팀들의 ID를 다시 수집하여 IN 쿼리를 날리는 과정을 반복한다
총 1+4 만큼 쿼리가 날아간다

이 시나리오가 정확한지 알고 싶습니다!

java jpa

답변 1

0

김영한

안녕하세요. 이호준님

바로 정답을 말씀드리면 좋겠지만, 개발자는 본인이 의심되는 부분을 스스로 확인하고 테스트 해 볼 때 공부한 내용을 진짜 자신의 지식으로 만들 수 있습니다.

확인하고 싶은 시나리오 대로 가상의 데이터를 DB에 저장하고, 실행되는 SQL의 수를 확인해보시겠어요? 그리고 추가로 관련된 결과를 남겨주시면 다른 분들께도 도움을 주실 수 있을거에요 🙂

참고로 .setMaxResults(3) 부분은 제거하셔야 정확한 테스트를 하실 수 있을거에요.

감사합니다.

벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?

0

32

2

inheritance startegy 선택시 고려사항

0

24

1

Entity 동등성 비교

0

23

1

실무 조언 관련 질문입니다.

0

48

1

H2데이터베이스 파일 생성

0

58

2

서브쿼리 강의에서 ALL 예시 관련 질문드립니다.

0

55

2

수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?

0

57

1

JPQL 메소드와 락

0

55

1

Delivery @OneToOne

0

61

1

17강 4~5분대 테이블 값 조회가 안됩니다.

0

96

2

UnsupportedOperationException 발생

0

86

3

H2 Database 연결이 안됩니다.

0

97

2

연관관계 매핑 질문드립니다.

0

87

2

h2데이터베이스 실행오류

0

109

2

persistence.xml

0

111

2

양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?

0

83

1

영속성 컨텍스트

0

69

1

JPA 프록시

0

98

1

Native Query와 MyBatis

0

71

1

영속성 컨텍스트는 어떤 메모리에 저장되는건가요?

0

90

1

임베디드 타입 예시 코드 관련 질문

0

121

3

명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요

0

96

3

인텔리제이 패키지 커서 단축키 질문

0

109

2

혹시 현재는 ID 데이터 타입이 String이면 안되나요?

0

149

1