인프런 영문 브랜드 로고

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

yebon2002님의 프로필 이미지
yebon2002

작성한 질문수

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

페치 조인 1 - 기본

fetch join 시 paging 문제

작성

·

1.6K

9

fetch join시에 distinct를 해도 JPA의 어플리케이션 레벨에서 distinct를 해준다고 하셨는데, paging을 할 경우 제대로 paging이 되는지 궁금합니다~

답변 1

12

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

안녕하세요 yebon2002님^^

좋은 질문입니다. distinct를 하면 데이터 수가 의도하지 않게 줄어들 수 있으니 paging 수가 안맞을까 염려하시는 것 같습니다.

우선 두가지 상황으로 나눌 수 있습니다.

1. JPA에서 paging을 하더라도, ManyToOne, OneToOne 관계는 마음껏 fetch join을 사용할 수 있습니다. 이 경우 테이블을 조인해도 데이터 수가 변하지 않기 때문에 paging도 잘 되고, 데이터도 완전히 다르기 때문에(식별자는 항상 다르니) distinct가 영향을 주지 않습니다.

질문하신 부분은 컬렉션을 페치조인하면 똑같은 데이터가 증가하게 되고, 여기에 distinct까지 추가되면 중복 데이터가 줄어드니 paging 숫자가 안맞을 것 같다고 염려하신 것 같습니다.

2. 그런데 JPA에서 paging을 하게되면, OneToMany, ManyToMany 같은 컬렉션 관계는 fetch join이 불가능합니다. 왜냐하면 이렇게 일대다 테이블을 조인하면 데이터의 수가 변하기 때문입니다. 그래서 JPA에서는 paging을 하면서 컬렉션 관계를 fetch join 하는 것 자체를 동작하지 않도록 막아두었습니다. 따라서 이 경우 distinct를 적용하는 것이 성립하지 않습니다. (혹시 컬렉션에 fetch join을 적용하더라도 경고 로그를 남기면서 모든 데이터를 메모리에 불러와서 페이징을 적용합니다! 그래서 매우 위험합니다.)

참고로 paging까지 고려한 실무 성능 최적화는 활용편 2탄에서 열심히 준비하고 있으니 기대해주세요^^

감사합니다.

도움되었습니다. 감사합니다.

안녕하세요 강사님! 강의 잘 듣고 있습니다!
paging이랑 fetchjoin 함께 사용할 때,
크게 countQuery를 쓰는 방식과, batch size 를 이용한 방식, 또는 paging과 fetchjoin 작업 분리해서 2개의 JPQL 작성 이렇게 3가지가 있던데
어떤 방법이 가장 성능 상으로 좋고 실무에서 선호되는 방식일까요?
김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. jayjoy05님

실무에서는 각 상황에 맞는 최적화 방법이 다릅니다.

어떤 경우에는 batch size를 사용한 방식이 좋고, 어떤 경우에는 작업을 분리하는게 좋습니다.

결국 두 방법을 다 알아두어야 유연하게 대응할 수 있습니다 🙂

감사합니다.

yebon2002님의 프로필 이미지
yebon2002

작성한 질문수

질문하기