• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

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

21.07.04 21:31 작성 조회수 606

3

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

답변 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 개발과 성능 최적화에서 예제 코드로 자세히 풀어서 설명드립니다.

도움이 되셨길 바래요.