inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

페치 조인 1 - 기본

fetch join 시 paging 문제

1860

yebon2002

작성한 질문수 3

9

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

JPA java

답변 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탄에서 열심히 준비하고 있으니 기대해주세요^^

감사합니다.

0

ad ad

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

0

jayjoy05

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

0

김영한

안녕하세요. jayjoy05님

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

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

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

감사합니다.

inheritance startegy 선택시 고려사항

0

3

0

Entity 동등성 비교

0

11

1

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

0

41

1

H2데이터베이스 파일 생성

0

51

2

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

0

49

2

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

0

48

1

JPQL 메소드와 락

0

52

1

Delivery @OneToOne

0

57

1

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

0

89

2

UnsupportedOperationException 발생

0

82

3

H2 Database 연결이 안됩니다.

0

89

2

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

0

82

2

h2데이터베이스 실행오류

0

105

2

persistence.xml

0

103

2

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

0

77

1

영속성 컨텍스트

0

62

1

JPA 프록시

0

90

1

Native Query와 MyBatis

0

63

1

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

0

83

1

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

0

112

3

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

0

91

3

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

0

106

2

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

0

136

1

양방향 연관관계 시 연관관계 주인을 설정하는 이유

0

68

1