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

백성현님의 프로필 이미지

작성한 질문수

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

Override Options 사용해보기

정렬에 대한 질문

24.01.04 02:29 작성

·

179

1

안녕하세요,

postman으로 테스트해보다가 궁금한것이 있어 질문 올려요.

 

질문 전에 base-pagination.dto.ts 에서

order__createdAt의 기본값은 없앤 상태일 때

 

likeCount DESC 같은것으로 정렬한다면, where__id__... 를 어떻게 해야할지.. 테스트해보니 생각한것처럼 나오지 않아서요.

커서 페이지네이션은 이렇게 쓰면 안되는것인지.. 궁금합니다.

 

예) 배달비 순으로 정렬, 금액 순으로 정렬 이런것들이요.

 

감사합니다.

답변 1

1

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

2024. 01. 05. 18:26

안녕하세요!

개념은 똑같습니다.

저희는 order id를 기반으로 현재 정렬을 하고 있습니다.

만약에 likeCount로 정렬을 하고싶다면 likeCount를 asc 또는 desc로 정렬 해주시면 됩니다.

다만 여기서의 문제는 likeCount가 같은 값이 여러개 있을 경우입니다. (강의에서 ID 말고 다른 값으로 정렬하면 복잡해진다는 이야기가 여기부터 시작됩니다.)

같은 값이 여러개 존재하면 특정 row의 unique함을 보장해줄만한 장치가 필요합니다.

이때 ID를 복합으로 사용하게되면 절대적으로 unique함이 보장됩니다.

두 값을 사용해서 정렬 및 페이지네이션을 한다면 SQL pseudo code로 아래와 같은 형태가 나옵니다.

가장 마지막 페이지네이션 아이템을 last_item이라고 불러보겠습니다.

ORDER BY created_at ASC, id ASC

위와 같은 정렬을 했다는 가정하에

WHERE (created_at > @last_item_created_at)

OR (created_at = @last_item_created_at AND id > @last_item_id)

이런식으로 쿼리를 해주면 됩니다.

처음 보면 복잡하게 느껴질 수 있지만 하나하나 시간을 두고 읽어보면 상당히 논리적입니다.

만약에 하나의 필터가 더 있었다면

OR (created_at = @last_item_created_at AND id = @last_item_id AND another > @last_item_another)

이런식으로 추가됩니다.

postgresql은 감사하게도 위 쿼리를 쉽게 작성 가능합니다.

WHERE (created_at, id) > (@last_item_created_at, @last_item_id)

감사합니다!

백성현님의 프로필 이미지
백성현
질문자

2024. 01. 08. 22:10

마냥 커서라는 이름때문에 id에만 집착해서 생각을 못했었네요.

감사합니다.