강의

멘토링

커뮤니티

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

jinw0909님의 프로필 이미지
jinw0909

작성한 질문수

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

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

해결된 질문

작성

·

15

0

[질문 템플릿]
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를 페이징 적용해서 보여주고 싶은 경우에 어떻게 하면 좋을지 궁금합니다.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

페이징과 검색 조건을 함께 사용하는 경우, 특히 OneToMany 관계에서 검색 조건이 Many 쪽에 있는 경우 페이징 처리에 몇 가지 주의할 점이 있습니다. OrderOrderItem 사이의 관계에서 OrderItemitem.name과 같은 속성을 조건으로 사용하고자 할 때, 일반적인 join fetch를 사용하면 안 됩니다. 이유는 join fetch페이징을 함께 사용할 경우, 데이터 중복 때문에 결과가 왜곡될 수 있기 때문입니다.

해결 방법

  1. 분리된 쿼리 사용 (V5 방식):

    • Order 엔티티를 먼저 페이징 쿼리를 통해 ID만 조회합니다.
    • 조회된 Order ID를 기반으로 OrderItem과 조인하여 필요한 데이터를 가져옵니다.
    • 두 결과를 코드에서 매핑하여 필요한 정보를 구성합니다.
  2. 쿼리 최적화:

    • QueryDSL 같이 조건을 쉽게 추가할 수 있는 쿼리 생성기를 사용하여,
    • 첫 번째 쿼리에서는 단순히 Order ID와 기본 정보만 페이징으로 가져오고,
    • 두 번째 쿼리에서는 item.name 같은 조건들을 포함하여 OrderItem을 조회합니다.
  3. Many의 조건을 포함한 서브쿼리 사용:

    • Order를 조회할 때, Where 조건에 서브쿼리를 사용하여 OrderItem의 조건을 포함시킬 수 있습니다.

페이징된 결과와 검색 조건이 유지되려면 조건 진행과 페이징 논리를 잘 분리하여 생각하고, 이를 데이터베이스 및 애플리케이션 레벨에서 효과적으로 처리하는 것이 관건입니다.

질문에 대해 유사한 해결 방법을 아래 링크에서 찾아보실 수 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

jinw0909님의 프로필 이미지
jinw0909
질문자

같은 질문이 벌써 몇 개 있었네요. 질문 취소하려고 했는데 그 사이에 답변이 달렸어요.

강의 내용이 정말 도움 많이 됐습니다. 케이스별로 너무 잘 정리해주셔서 마치 숲 속에서 나침반을 보고 가는 느낌입니다. 감사합니다.

jinw0909님의 프로필 이미지
jinw0909

작성한 질문수

질문하기