현재 진행중인 프로젝트는 SNS기반의 앱 이라서 NoSQL을 사용하였고, 메인피드에서 게시글들을 보여주기 위해서 pagination을 사용해야했다. 오늘 작업한 내용을 까먹지 않기 위해 본 글을 작성한다.
먼저 서버(node.js) 코드부터 설명하겠다.
router.get('/:page', async (req, res, next) => {
const offset = 6;
const posts = await Post.find({}, {})
.sort({
update_time: -1,
})
.skip(req.params.page * offset)
.limit(offset);
const retval = {
data: posts,
};
res.status(200).send(retval);
});
해당하는 API는 "http://localhost:3000/post" APP에서 해당 API로 GET 요청을 보냈을 때 동작하는 라우터이다.
Post.find().sort().skip().limit() 의 형태를 띈다. 하나 씩 상세히 설명하겠다.
1. cursor.find()
- db.Post.find({}, {})
-> 기본 형으로, 모든 도큐먼트를 조회한다.
-> " {},{} " 는 생략해도 된다.
-> 첫 번째 파라미터는 query, 두 번째 파라미터는 projection이다.
-> query는 조회 기준을 정한다 / projection은 조회할 때 보여질 필드를 정해준다.
- db.Post.find({"_id":"testman"})
-> _id 필드 값이 "testman"인 것들을 조회한다.
- db.Post.find({},{"_id":false,"title":true})
-> Post의 title만 조회한다.
2. cursor.sort()
- .sort{ KEY: value}
-> 기본형으로 KEY는 데이터의 field이고, value는 1 또는 -1이다.
-> 1은 오름차순, -1은 내림차순이다.
-> KEY는 여러개 입력할 수 있고, 먼저 입력한 KEY가 우선권을 갖는다.
-> 위 코드에서는 "update_time"이라는 field를 기준으로 내림차순 정렬한다. (최신 글 순서로 보여주기 위함)
3. cursor.skip()
- .skip(value)
-> value에 값 개수 만큼 데이터를 생략하고 그 다음부터 출력한다.
4. cursor.limit(value)
- .limit(value)
-> value에 값 개수 만큼 데이터를 출력한다.
위의 코드를 보면, offset에는 6이라는 값을 넣어주었다. 또한 "page"를 APP에서 파라미터로 받아온다. 이 "page"는 게시글로 치자면 몇번 째 페이지 인지와 같은 의미를 가진다.
limit(offset)을 하여서 한 페이지. 즉 요청 한번에 6개의 데이터를 보내준다.
skip(page * offset)을 함으로써, APP에서 요청한 페이지 이전 것들은 전부 건너뛰게 된다.
APP에서 차례로 page를 늘려서 요청하면, 이것이 곧 pagination이 된다.
참고링크
1. find() 메소드
pro-self-studier.tistory.com/59
2. find() 메소드 활용 - sort(), limit(), skip()
'안드로이드 > TalentHouse' 카테고리의 다른 글
이틀 헤매고 정리하는 AWS <-> S3 Android image upload 방법 (1) | 2021.04.19 |
---|---|
Login page 뼈대 만들기 (0) | 2021.04.06 |