페이징 + 검색조건 관련해서 질문드립니다.
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (아니오)
[질문 내용]
안녕하세요. 컬렉션 조회 최적화 부분에서 페이징 + 검색 조건 관련해서 궁금한 점이 있어서 질문드립니다.
질문) Order 리스트 페이징을 하고 싶은데@BatchSize는 안쓰고 5번처럼 QueryDto직접 쿼리 2번 + map O(0) 방식으로 처리하려고 합니다. 이 때 만약 검색 조건이 toMany 로 맺어진 테이블 (orderItem.quantity, orderItem.item.name 등) 에 있다면 toOne 방향 루트 join fetch 쿼리 할 때 이 조건을 함께 포함시켜면 되는걸까요 (join orderItem .. where .. 같이)
예를들어 item.name이 "tesla"인 item을 포함하고 있는 모든 order를 페이징 적용해서 보여주고 싶은 경우에 어떻게 하면 좋을지 궁금합니다.
Answer 1
0
안녕하세요, 인프런 AI 인턴입니다.
페이징과 검색 조건을 함께 사용하는 경우, 특히 OneToMany 관계에서 검색 조건이 Many 쪽에 있는 경우 페이징 처리에 몇 가지 주의할 점이 있습니다. Order와 OrderItem 사이의 관계에서 OrderItem의 item.name과 같은 속성을 조건으로 사용하고자 할 때, 일반적인 join fetch를 사용하면 안 됩니다. 이유는 join fetch와 페이징을 함께 사용할 경우, 데이터 중복 때문에 결과가 왜곡될 수 있기 때문입니다.
해결 방법
분리된 쿼리 사용 (V5 방식):
Order엔티티를 먼저 페이징 쿼리를 통해 ID만 조회합니다.
- 조회된
OrderID를 기반으로OrderItem과 조인하여 필요한 데이터를 가져옵니다.
- 두 결과를 코드에서 매핑하여 필요한 정보를 구성합니다.
쿼리 최적화:
- QueryDSL 같이 조건을 쉽게 추가할 수 있는 쿼리 생성기를 사용하여,
- 첫 번째 쿼리에서는 단순히
OrderID와 기본 정보만 페이징으로 가져오고,
- 두 번째 쿼리에서는
item.name같은 조건들을 포함하여OrderItem을 조회합니다.
- QueryDSL 같이 조건을 쉽게 추가할 수 있는 쿼리 생성기를 사용하여,
Many의 조건을 포함한 서브쿼리 사용:
Order를 조회할 때,Where조건에 서브쿼리를 사용하여OrderItem의 조건을 포함시킬 수 있습니다.
페이징된 결과와 검색 조건이 유지되려면 조건 진행과 페이징 논리를 잘 분리하여 생각하고, 이를 데이터베이스 및 애플리케이션 레벨에서 효과적으로 처리하는 것이 관건입니다.
질문에 대해 유사한 해결 방법을 아래 링크에서 찾아보실 수 있습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
0
같은 질문이 벌써 몇 개 있었네요. 질문 취소하려고 했는데 그 사이에 답변이 달렸어요.
강의 내용이 정말 도움 많이 됐습니다. 케이스별로 너무 잘 정리해주셔서 마치 숲 속에서 나침반을 보고 가는 느낌입니다. 감사합니다.
강의 관련 외 질문입니다.
0
64
2
SpringBoot4 + Hibernate7 모듈 등록 방법 공유
0
85
1
BeanCreationException
0
86
3
Update 후 UpdateMemberResponse 매핑할 때
0
46
1
트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?
0
96
2
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
113
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
95
1
fetch join VS fetch join 페이징 궁금증
0
179
2
양방향 연관관계 알아보는 법?
0
104
1
16강 17강 간단 정리 이게 맞을까요 ?
0
165
2
데이터 초기화 시 CASCADE 옵션 궁금증
0
89
2

