인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

h0ch1님의 프로필 이미지
h0ch1

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

주문 조회 V3.1: 엔티티를 DTO로 변환 - 페이징과 한계 돌파

OneToMany속의 ManyToOne 조회시 질문

작성

·

34

·

수정됨

1

OneToMany 관계에서 페치조인을 하게되면 페이징이 불가하다고 하셨는데

 

OneToMany는 batchSize를 조절하여 해결한뒤

OneToMany안의 ManyToOne 관계는 어떻게 페치조인 할수있을까요?

 

예를 들어서

테이블 A, B, C가 있을경우

A와 B는 OneToMany관계

B와 C는 ManyToOne관계

 

class A {
    @OneToMany
    private List<B> b = new ArrayList<>();
}
class B {
    @ManyToOne // Lazy
    private A a;
  
    @ManyToOne // Lazy
    private C c;
} 
class C {
    
}

 

A를 조회하고 C까지 끌고와야하는경우

A와 B는 OneToMany 관계이기 때문에 페치조인이 불가능하지만

B와 C는 페치조인이 가능하다고 이해하였습니다

BatchSize를 설정하여 A에서 B를 가져올시 IN 쿼리로 가져온뒤

B에서 C를 페치 조인하는 방법은 없나요?

 

아니면 이런경우 특수하게 B에서 C를 Eager로 설정 해야할까요

애초에 B를 통해서 A와 C를 가져와야할까요

답변 1

1

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

안녕하세요. h0ch1님

페이징이 필요한 경우 이 문제를 해결할 수 있는 방법은 크게 2가지가 있습니다.

실전 스프링 부트와 JPA 활용 2편을 모두 들었다고 가정하고 답변을 드리겠습니다.

 

첫 번째 BatchSize를 활용하는 방법

이 경우 A를 조회하고, B를 한번에 조회하고, C를 한번에 조회하게 됩니다. 결과적으로 1 + 1 + 1의 쿼리가 발생합니다.

 

두 번째 DTO로 조회하는 방법

A를 DTO로 조회한 다음에 A의 아이디를 기반으로 필요한 B와 C를 조인해서 한번에 조회합니다. 그리고 필요한 내용을 조립합니다. 이 경우 1(A) + 1(B + C)의 쿼리가 실행됩니다.

 

감사합니다.

h0ch1님의 프로필 이미지
h0ch1

작성한 질문수

질문하기