Loading...
본문 바로가기
👥
총 방문자
📖
0개 이상
총 포스팅
🧑
오늘 방문자 수
📅
0일째
블로그 운영

여러분의 방문을 환영해요! 🎉

다양한 개발 지식을 쉽고 재미있게 알려드리는 블로그가 될게요. 함께 성장해요! 😊

코딩 정보/NestJs

[NestJs] 페이지 기반 페이지네이션을 만들어 보자

by 꽁이꽁설꽁돌 2025. 1. 29.
728x90
반응형
     

목차

     

    참고

    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 };
      }

     

    이런식으로 total과 함께 잘 나오는 것을 볼 수 있다.

     

     

    강의출처

     

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

    코드팩토리 | 자바스크립트, 타입스크립트 다음은 백엔드 개발! NestJS를 이용한 REST API 백엔드 개발, Socket IO 개발 및 배포를 할 수 있게 됩니다., 백엔드가 처음이어도 누구나 OK! 트렌디한 NestJS로

    www.inflearn.com

     

     

    반응형