Spring - QueryDSL(+Paging, OrderSpecifier)

김상엽·2024년 4월 5일
0

Spring

목록 보기
23/26
post-thumbnail

TIL

QueryDSL로 Paging, 정렬 구현하기

  • 최종프로젝트 11일차, 어제는 QueryDSL을 통해 동적쿼리로 상품의 검색을 구현했다면,
    오늘은 QueryDSL을 통한 페이징과 정렬을 구현했다.
  • 이전에 구현했던 상품 검색 쿼리에 페이징과 정렬을 추가하고자 한다.
  • 페이징 요소는 페이지, 사이즈, 정렬할 기준, 오름차순/내림차순이 있다.
    • 정렬할 요소에는 입찰자수(bitCount), 현재가격(highestPrice), 조회수(viewCount)가 있다.
    • 이전의 구현했던 상품 검색에 상태값이 추가되었다.
  • 그리고 메인페이지에서 접속한 시간대에 추천 게시물을 노출해주는 API를 추가하였다.

구현한 코드

  • .offset을 통해 몇번째 페이지를 반환할지 결정하고,
  • .limit를 통해 한 페이지에 몇개의 상품을 반환할지 결정한다.
  • .orderBy를 통해 정렬을 진행한다.

Pageable

  • option(정렬할 기준)direction(오름차순/내림차순)으로 Sort객체를 만들고,
  • 페이지사이즈Sort객체로 위 함수에서 사용되는 Pageable을 만든다.
  • 사실상 정렬과 페이징에 필요한 모든것을 포함하고있다.

OrderSpecifier

  • 얼핏 봐서는 Pageable이 정렬과 페이징에 필요한 모든것을 포함하고 있기에 바로 페이징과 정렬을 할 수 있을것같지만, 정렬을 하기위해서는 한번 더 가공이 필요하다.
  • pageable에서 direction정렬할 기준(여기서는 property)OrderSpecifier를 만든다.
    • 정렬할 기준이 없거나 설계하지 않은 값인겨우는 조회수로 정렬하도록 구현하였다.
  • 이후 OrderSpecifier.orderBy()를 사용하여 정렬을 수행한다.

구현을 하며 발생한 문제

  • 로직을 성공적으로 구현을 했다고 생각했는데, 문제가 발생했다.
    • 입력한 오름차순/내림차순 값과 상관없이, 항상 내림차순으로 정렬을 하는 문제였다.
  • 처음에는 Paging과 정렬을 처음 구현해보기에 정렬과 페이징로직에 문제가 있는줄알고 한참을 헤맸다.
  • GPT에게도 물어봤지만, 답을 찾지 못했다.


  • 열심히 디버깅을 하던중에 한가지 실마리를 찾았다.
    • isASC 필드에 true/false 어떠한 값을 입력하던 false로 저장되는것을 발견했다.
  • 그렇다, isASC 필드에 계속하여 false가 저장되어서 오름차순의 반대, 즉, 내림차순으로만 정렬이 이루어 진것이었다.

왜 값이 들어가지 않았을까? (JSON 바인딩)

  • 그렇다면 왜 제대로된 값이 들어가지 않았을까?
  • 부트캠프의 튜터님께 여쭤보았고, 원인과 해답을 얻었다.
  • 바로 필드명인 isASC가 문제였다.
  • 요청값인 JSON값을 바인딩하여 optionRequest객체를 생성하는데, is라는 접두사 때문에 바인딩이 이루어 지지 않은것이었다.
  • 정말 생각치도 못한 원인이었어서 굉장히 신선하면서도 화가났다. 그래도 로직이 틀리지 않았다는것에 행복했다.

추천 게시물 보여주기

  • 새로운 기능으로 접속 시간대에 따른 추천 상품을 보여주는 기능을 추가하였다.
  • 시간대와 추천 로직은 다음과 같다.
  • 경매는 매일 오전9시 ~ 오후 6시에 진행된다.
  • 경매전(0시~9시)
    • 당일 경매가 진행될 상품
  • 경매중(9시~18시)
    • 당일 경매가 진행중인 상품
  • 경매후(18시~0시)
    • 당일 경매가 종료된 상품
  • LocalDateTime을 통해 API가 호출된 시점에서 연산을 통해 조회 condition을 만들고,
    이를 QueryDSL을 통해 조회에 적용시켰다.
  • 바뀐 로직에 맞춰서 캐시는 날짜와, condition을 key로 구성하였다.

오늘의 회고

QueryDSL이라는걸 처음 시도할때만해도,
JPA에서 함수 이름만 잘 구성해주면 알아서 해주는데, 왜 굳이 QueryDSL을 사용하지?
했었는데, 한번 써보니까 훨씬 내가 원하는 방향으로 만들 수 있어서 굉장히 마음에 든다
오늘 QueryDSL에 대해 찾아보다가 보았던 유튜브 영상이다.
평소에 유튜브 알고리즘에 많이 나와서 즐겨보던 유튜버의 강의인줄 알았는데, 유튜버가 아니라 배달의 민족 개발자셨다.. 굉장히 당황을 많이했다.
영상에서 기억에 남는건 ORM 과 QueryDSL을 적재적소에 활용하자는 말이 기억에 남는다.
그리고 이분의 말중에 인상깊었던 말을 인용하면서 오늘 글을 마치도록 하겠다.
기억보다는, 기록으로.
[우아콘2020] 수십억건에서 QUERYDSL 사용하기

profile
개발하는 기록자

0개의 댓글