Sequelize

Sequelize:: 페이지네이션 기능 (limit, order, Op.lt)

비오스터딩 2021. 1. 2. 14:43

페이지네이션 만들기

 

앞서 피드를 구현할 때, infinite scrolling 방식으로 게시글을 가져오도록 만들었다.

 

서버를 만들었으니 더미데이터말고 실제 서버에서 게시글을 가져오도록 할텐데,

게시글을 순차적으로 가져오도록 하는 설정이 필요하다.

 

이 기능은 시퀄라이즈에서 제공해주는 기능인 limit과 offset 방법으로 설정가능하다.

 

  Post.findAll({  //모든 포스트를 가져옴.                                         

  limit: 숫자,   // 한번에 (숫자)개 가져오기.                        

  offset: 숫자 // (숫자 + 1) ~ (숫자 + 11) 까지의 게시글을 가져옴.

  order: [['createdAt', 'DESC']]  // 최신 게시글부터 가져옴

(ASC: 오름차순, DESC:내림차순)

  });  

 

 

하지만 offset 방식에는 치명적인 단점이 있다.

중간에 유저가 게시글을 삭제하거나 추가한다고하자.

20개의 게시글이 있어서, 처음에 20~11번째 게시글을 불러온다.

어떤 유저가 게시글 하나를 쓰면, 그 다음 로딩때는 (21~12번째를 뛰어넘어서, 11 ~ 2번째 게시글을 불러온다.

누가 삭제하거나 추가하면 limit과 offset순서가 꼬인다.

 

그래서 offset보다는 lastId 방식을 많이 사용한다.

lastId는 DB에서 제공하는건 아니고, 사용자가 구현한 거.

where: {id: lastId } 이런식으로 사용한다.

 

 

-

 

 

페이지네이션기능은 posts.js 라우터를 만들어 여기에 구현했다.

 

order: [

['createdAt', 'DESC'],  // 이 부분은 포스트정렬부분

[Comment, 'createdAt', 'DESC']  // 이 부분은 Comment의 정렬부분이다.

아래쪽에서 order을 만들어서 정렬하는 방법이 아닌,

전체 order부분에서 첫번째 인수를 모델로 주고 정렬해야한다.

]

 


 

lastId 구현하기

 

프론트에서 lastId값 넘겨주기

dispatch

최상위 컴포넌트에서 lastId값을 넘겨준다.

onScroll === 스크롤 시 게시글을 로드해오는 함수

  mainPosts[mainPosts.length - 1]?.id;  

mainPosts(서버에서 받아온 게시글들이 들어가는 state)의 마지막 요소의 id를 lastId에 넣어준다.

-

saga

GET요청은 data를 보낼 수 없으므로, 쿼리스트링방식으로 서버에 데이터를 넘겨준다.

  URI + ?key=value  

value뒤에는 &로 구분하여 limit이나 offset같은 옵션을 적을 수도 있다.

 

 

route

** 쿼리스트링의 value값은 req.query 안에 전달된다.

req.query.key를 사용해 value를 사용할 수 있다.**

GET /post 요청은 페이지를 로딩할 때 사용된다.

 

처음에 웹페이지에 접속했을 때 사용되고(초기로딩),

스크롤을 내려 게시글을 불러와야할 때도 사용이 된다.

 

이 둘을 다른 로직으로 불러와주어야한다.

초기로딩은 where값이 없고, 이후부터는 id값이 lastId보다 작은 포스트에서부터 불러와한다.

비교연산자기능이 시퀄라이즈에 내장되어있다.

 

우선 Op를 시퀄라이즈에서 불러온다.(import)

  [Op.lt]: 기준 숫자  

를 사용하면 된다.

 

 

 


 

 

😄😄

스크롤할때마다, 게시글을 5개씩 불러온다.

반응형