inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

페치 조인 2 - 한계

@BatchSize 와 컬렉션 페치조인 관련해서 질문이 있습니다.

861

danaldanalcom2

작성한 질문수 1

3

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
.
안녕하세요. 김영한 강사님. 김영한님 강의를 열심히 수강하는 학생입니다.
.
다름이 아니라 제가 "페치조인 2 - 한계" 챕터의 13분 부터 19분까지 진행되는 강의 내용중 이해가 안되는 부분이 있어서 이렇게 질문을 하려합니다.
.
분명 강의 내용에서는 컬렉션을 페치조인 한 후 페이징 API를 사용할 수 없다고 하였습니다.
.
그리고 이를 극복하기 위하여 @BatchSize를 이용하는 방법이 소개되는데, 이 방법이 어떤 면에서 해결에 도움이 되는지 모르겠습니다.
.
컬렉션을 페치조인 한 후 페이징 API를 사용할 수 없는 이유는
1대다 조인으로 뻥튀기된 데이터들을 페이징API로 DB에서 잘라올 경우 JPA가 잘려진 데이터만 받기 때문에 이를 기반으로 잘못된 정보를 내보낼 수 있기 때문이었습니다.
.
그리고 @BatchSize는 LazyLoading 된 데이터들을 사용할때마다 가져오지 않고 한꺼번에 가져오는 역할을 담당하여 Lazyloading의 성능을 개선하는 역할을 하고 있습니다.
.
이것만 놓고 보면 @BatchSize가 컬렉션 페치조인의 페이징과 어느 면에서 관련있는지 모르겠습니다. 한꺼번에 가져오는 기능은 데이터가 잘려들어오는 것과 관련이 없어 보이거든요. 혹시 제가 잘못알고 있는걸까요? 답변 부탁드립니다.

jpa java batchsize 컬렉션페치조인 JPA 페이징

답변 1

6

김영한

안녕하세요. danaldanalcom2님

(Team)1:(User)N을 페치조인 한 상황에서는 페이징이 불가능합니다.

결국 페이징을 하려면 Team만 대상으로 조회해야 합니다.

Team을 10명 조회했으면 여기에서 문제가 발생합니다.

각 Team의 User들을 찾기 위해 지연로딩에서 추가 쿼리가 발생합니다. 그런데 Team이 10명이니 10개의 추가 쿼리가 나가게 됩니다.

결과적으로 1+N(10) 번 쿼리가 발생하는 것이지요.

여기에서 1은 처음 Team 10명을 조회하는 쿼리이고

N은 10명의 팀에 소속된 User들을 각각 조회하는 추가 쿼리가 됩니다.

@BatchSize를 사용하면 이 상황에서 1+N(10) -> 최대 1+1로 최적화 할 수 있습니다.

직접 코드로 돌리면서 테스트를 해보시면 이해가 되실거에요.

추가로 이 부분은 JPA 성능최적화에서 너무 중요한 부분입니다.

관련해서 더 자세한 내용은 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화에서 예제 코드로 자세히 풀어서 설명드립니다.

도움이 되셨길 바래요.

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

0

28

2

inheritance startegy 선택시 고려사항

0

22

1

Entity 동등성 비교

0

21

1

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

0

47

1

H2데이터베이스 파일 생성

0

56

2

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

0

53

2

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

0

52

1

JPQL 메소드와 락

0

55

1

Delivery @OneToOne

0

60

1

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

0

94

2

UnsupportedOperationException 발생

0

86

3

H2 Database 연결이 안됩니다.

0

95

2

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

0

85

2

h2데이터베이스 실행오류

0

108

2

persistence.xml

0

108

2

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

0

80

1

영속성 컨텍스트

0

66

1

JPA 프록시

0

96

1

Native Query와 MyBatis

0

70

1

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

0

87

1

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

0

115

3

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

0

95

3

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

0

108

2

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

0

145

1