일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- vue기초
- 프록시배포구조
- SBT표준
- 스마트 컨트렉트 함수이름 중복
- 머신러닝기초
- 체인의정석
- Vue.js
- 스마트컨트렉트프록시
- git rebase
- Vue
- ethers type
- 스마트컨트렉트테스트
- ethers websocket
- ethers v6
- nestjs 튜토리얼
- 스마트컨트렉트 예약어 함수이름 중복
- rust 기초
- 러스트기초
- ethers typescript
- ethers
- 컨트렉트 동일한 함수이름 호출
- 러스트 기초 학습
- 컨트렉트 배포 자동화
- chainlink 설명
- 깃허브명령어
- nest.js설명
- ambiguous function description
- multicall
- 스마트컨트렉트 함수이름 중복 호출
- 러스트 기초
- Today
- Total
체인의정석
SQL) Paging 처리하기, 페이징 API 만들기 본문
검색할때 결과값으로 오는 데이터의 양이 많을 시에는 페이징 처리를 통해서 나누어서 불러 올 수 있다.
페이징 처리는 쿼리문에서
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/
따라서 입력값을 받아오는 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를 공식문서에서 강력히 권고하니 이렇게 하는게 일단은 좋을것 같다.
'개발 > backend' 카테고리의 다른 글
class validator 사용하기, 다중 validation 처리하기 (0) | 2021.11.09 |
---|---|
TypeORM & NestJS) Query Selector 사용하여 다수의 데이터를 가져오고 Response 구조로 다수의 데이터 응답 보내기 (0) | 2021.11.03 |
리팩토링) nest.js 기본 구조 체계화 하기 (0) | 2021.10.26 |
TypeORM - query builder/ find 함수로 쿼리기능 구현 (0) | 2021.10.25 |
nest.js) 예외처리 - 이더리움 주소값인지 확인하고 아닐 시 에러리턴 (0) | 2021.10.22 |