inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

OneToMany Many쪽의 페이지네이션 질문입니다

860

Sunny

작성한 질문수 8

0

안녕하세요? 섹션 4 강의 컬렉션 조회 페이징을 보고 질문 드립니다. 주문 조회 V3.1에서 페이징을 위해

jpa.properties.hibernate.default_batch_fetch_size=100, @BatchSize를 사용하거나 또는

V5에서 Map, groupBy를 이용하여 DTO 직접 조회Order에 대하여 페이징이 가능하다는 것을 알았습니다.

그런데 만약 Order 페이징 + OrderItem 페이징(예를 들어 주문을 10건 중 비싼 아이템 2건만 조회하기)같은 경우에는 어떻게 적용이 가능한가요?

public List<OrderQueryDto> findAllOpt(){
		List<OrderQueryDto> result = findOrders(); // 기존의 ToOne 쿼리

		List<Long> orderIds = result.stream()      // in 쿼리를 위한 id 뽑기
							.map(o -> o.getOrderId())
							.collect(Collectors.toList());
		
		List<OrderItemQueryDto> orderItems = findMap(orderIds);

		Map<Long, List<OrderItemQueryDto>> orderItemMap = orderItems.stream()
							.collect(Collectors.groupingBy(OrderItemQueryDto::getOrderId));	
		
		result.forEach(o -> o.setOrderItems(orderItemMap.get(o.getOrderId())));
		return result;
}

public List<OrderItemQueryDto> findMap(List<Long> orderIds) {
		return em.createQuery(
					"select new queryDto(파라미터들)" +
					" from OrderItem oi" +
					" join oi.item i" +
					" where oi.order.id in :orderIds", OrderItemQueryDto.class)
                                           .setFirstResult(0)
                                           .setMaxResults(2)
					.setParameter("orderIds", orderIds)
					.getResultList();
		)
}

이렇게 Limit를 걸었을 때 UserA 2건 뜨고 UserB는 null 이 뜨더군요. 

다른 방법을 찾아본 결과 https://bottom-to-top.tistory.com/45 처럼 방향을 반대로 하여 ManyToOne으로 조회하는 방법도 있다는것을 알았습니다.

결국엔 Order 페이징 + OrderItem 페이징 까지 접목시키려면 ManyToOne으로 조회하는 방법밖에 없을까요?

OneToMany pagination spring-boot 페이지네이션 JPA java spring

답변 2

1

Sunny

아 그런 마법의 코드 같은건 없군요 감사합니다 어떻게 해야할지 확실히 정해졌어요!

1

김영한

안녕하세요. Sunny님

이 부분은 JPA의 문제라기 보다는 관계형 데이터베이스의 한계입니다. OneToMany 관계를 조인하면 데이터가 증가해서 정확한 페이징이 불가능합니다.

반대로 ManyToOne 관계를 조인하면 데이터수가 증가하지 않기 때문에 정확한 페이징이 가능합니다.

감사합니다.

강의 관련 외 질문입니다.

0

62

2

SpringBoot4 + Hibernate7 모듈 등록 방법 공유

0

85

1

BeanCreationException

0

86

3

Update 후 UpdateMemberResponse 매핑할 때

0

46

1

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

0

96

2

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

0

70

1

Query Dsl Q파일 질문입니다.

0

81

1

루트 쿼리라는것은

0

58

1

메서드를 분리하는 기준

0

61

1

findAllWithMemberDelivery 메서드 질문드립니다.

0

108

3

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

0

83

2

fetch join과 영속화와 OSIV의 관계

0

83

2

Distinct 사용 전 결과에 대한 의문

0

112

2

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

0

55

1

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

0

77

2

dto 필드 속 엔티티 여부

0

58

1

뷰템플릿 사용 시

0

76

2

Result 클래스 관련 질문

0

56

1

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

0

85

1

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

0

133

1

OSIV ON 상태일 때

0

94

1

fetch join VS fetch join 페이징 궁금증

0

178

2

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

0

102

1

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

0

161

2