목차
참고
https://be-senior-developer.tistory.com/292
[NestJs] 커서 기반 페이지네이션을 구현해보자
목차 페이지네이션을 위한 더미 데이터 만들기페이지네이션을 위해서 임시로 더미데이터를 만들어 주자async generatePosts(userId: number) { for (let i = 0; i // POST /posts/random @Post('random') @UseGuards(AccessT
be-senior-developer.tistory.com
위의 커서 기반 페이지네이션을 이어 하는 것이므로 참고하면 도움이 될 것 같다.
커서 기반의 페이지네이션에 비해 훨씬 간단하다.
페이지 기반 페이지네이션
page라는 프로퍼티를 추가해 페이지 기반과 커서 기반을 구분해 주었다.
import { IsIn, IsNumber, IsOptional } from 'class-validator';
export class paginatePostDto {
@IsNumber()
@IsOptional()
page?: number;
@IsNumber()
@IsOptional()
where__id_less_than?: number;
//이전 마지막 데이터의 id
//이 프로퍼티에 입력된 id보다 높은 id부터 값을 가져오기
//쿼리 파라미터는 무조건 string이기 때문에 변환이 필요
@IsNumber()
@IsOptional()
where__id_more_than?: number;
//정렬
//createAt -> 생성된 시간의 내림차/오름차 순으로 정렬
@IsIn(['ASC', 'DESC'])
@IsOptional()
order__createdAt?: 'ASC' | 'DESC' = 'ASC';
//몇개의 테이터를 입력으로 받을지
@IsNumber()
@IsOptional()
take: number = 20;
}
페이지 기반은 개수를 기준으로 하기때문에 skip을 사용해 주면 된다.
페이지 기반의 페이지네이션을 위해 있는 findAndCount 함수를 사용해 주면 total값이 반환된다.
그 값을 기반으로 페이지네이션에 활용하면 좋을 것 같다.
async paginationPosts(dto: paginatePostDto) {
if (dto.page) {
return this.pagePaginationPosts(dto);
} else {
return this.cursorPaginationPosts(dto);
}
}
async pagePaginationPosts(dto: paginatePostDto) {
/**
* data: Data[],
* total: number,
* next: ??
*
* (1) (2) (3) (4)
*/
const [posts, count] = await this.postsRepository.findAndCount({
take: dto.take,
skip: dto.take * (dto.page - 1),
order: {
createdAt: dto.order__createdAt,
},
});
return { data: posts, total: count };
}
강의출처
[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core 강의 | 코드팩토리 -
코드팩토리 | 자바스크립트, 타입스크립트 다음은 백엔드 개발! NestJS를 이용한 REST API 백엔드 개발, Socket IO 개발 및 배포를 할 수 있게 됩니다., 백엔드가 처음이어도 누구나 OK! 트렌디한 NestJS로
www.inflearn.com
'코딩 정보 > NestJs' 카테고리의 다른 글
[NestJs] 환경변수 세팅을 해보자 (0) | 2025.02.03 |
---|---|
[NestJs] 페이지네이션 일반화하기 (0) | 2025.02.02 |
[NestJs] 커서 기반 페이지네이션을 구현해보자 (0) | 2025.01.29 |
[NestJs] Class Transformer를 사용해 보자 (0) | 2025.01.28 |
[NestJs] DTO란 무엇이고 사용방법에 대해 알아보자 (0) | 2025.01.27 |