inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

OneToMany속의 ManyToOne 조회시 질문

172

h0ch1

작성한 질문수 3

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를 가져와야할까요

java spring spring-boot jpa

답변 1

1

김영한

안녕하세요. h0ch1님

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

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

 

첫 번째 BatchSize를 활용하는 방법

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

 

두 번째 DTO로 조회하는 방법

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

 

감사합니다.

강의 관련 외 질문입니다.

0

80

2

SpringBoot4 + Hibernate7 모듈 등록 방법 공유

1

97

1

BeanCreationException

0

96

3

Update 후 UpdateMemberResponse 매핑할 때

0

56

1

트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?

0

102

2

페이징 + 검색조건 관련해서 질문드립니다.

0

74

1

Query Dsl Q파일 질문입니다.

0

86

1

루트 쿼리라는것은

0

62

1

메서드를 분리하는 기준

0

70

1

findAllWithMemberDelivery 메서드 질문드립니다.

0

116

3

연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략

0

92

2

fetch join과 영속화와 OSIV의 관계

0

90

2

Distinct 사용 전 결과에 대한 의문

0

118

2

레포지토리 계층에서의 트랜잭션에 대한 의문

0

61

1

영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.

0

79

2

dto 필드 속 엔티티 여부

0

63

1

뷰템플릿 사용 시

0

82

2

Result 클래스 관련 질문

0

56

1

@PostConstruct 프록시 관련 질문드립니다

0

88

1

DTO 대신 Form 사용은 안되나요?

0

140

1

OSIV ON 상태일 때

0

99

1

fetch join VS fetch join 페이징 궁금증

0

189

2

양방향 연관관계 알아보는 법?

0

109

1

16강 17강 간단 정리 이게 맞을까요 ?

0

168

2