체인의정석

SQL) Paging 처리하기, 페이징 API 만들기 본문

개발/backend

SQL) Paging 처리하기, 페이징 API 만들기

체인의정석 2021. 11. 2. 10:41
728x90
반응형

검색할때 결과값으로 오는 데이터의 양이 많을 시에는 페이징 처리를 통해서 나누어서 불러 올 수 있다.

 

페이징 처리는 쿼리문에서 

 

select * from Chain 
LIMIT 10 OFFSET 1

이런식으로 마지막에 limit에는 한번에 가져올 데이터의 양 offset은 어디서부터 가져오지? 하는 기준점을 잡아주게 된다.

 

이때 limit에 들어오는 값과 OFFSET에 들어오는 값을 넣어주어야 한다.

 

limit에 들어오는 값은 보통 요청 파라미터에서 rpp로 두고 OFFSET 부분은 page로 둔다.

 

따라서 설계서에서도 request 부분에 모두 rpp와 page를 두기로 하였다.

 

또한 만약 페이징 처리가 없는 부분이 있다면 이 부분은 0으로 하여

 

페이징 처리가 있는 경우의 쿼리문과 페이징 처리가 없는 부분의 쿼리문으로 백엔드에서 분기하여 상황별로 다르게 처리해 준다.

 

예시로 쿼리문 몇개만 만들어 봤다.

SELECT *
FROM transactions 
WHERE 
from_address = "0x8155d83e45da988580e77d89e1be6803e94ac1e4" 
and to_address = "0xdef1c0ded9bec7f1a1670819833240f027b25eff"
LIMIT 100 OFFSET 0

이렇게하면 0번 인덱스부터 100번까지만 쭉 나오게 된다.

 

넘기는값을 바꿔주는 식으로 프로그래밍하면 페이징도 의외로 간단하게 완성!

 

페이징 api의 경우 QuerySelector를 사용하였다. 생각보다 직관적이고 쉽게 사용할 수있어서 좋은것 같다.

근데 홈페이지를 보니 limit과 offset대신 skip과 take를 사용하라고 한다. 

쿼리 빌더는 여기서 자세하게 나와있으니 여길 보고 참고하면 된다.

 

https://typeorm.io/#/select-query-builder/

 

TypeORM - Amazing ORM for TypeScript and JavaScript (ES7, ES6, ES5). Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server,

 

typeorm.io

 

따라서 입력값을 받아오는 dto 에 rpp와 page를 추가하고

  @IsNumber()
  rpp: number;

  @IsNumber()
  page: number;

이렇게 추가한 내용을 service 에서 가져와서 다음과 같이 써주면 된다. (실제 코드에서 대부분의 내용을 생략한 코드)

      const transactions = await this.transactionsRepository
        .createQueryBuilder()
        .select('hash')
        .addSelect('COUNT(*)', 'totalTxCount')
        .where('transaction.fromAddress = :fromAddress', {
          fromAddress: from_address,
        })
        .andWhere('transaction.toAddress = :toAddress', {
          toAddress: to_address,
        })
        .groupBy('묶을칼럼값')
        .orderBy('정렬값', 'DESC')
        .skip(page)
        .take(rpp)
        .getRawOne();

skip이랑 take를 공식문서에서 강력히 권고하니 이렇게 하는게 일단은 좋을것 같다.

728x90
반응형
Comments