안드로이드/TalentHouse

MongoDB를 사용하여 android Pagination 구현

현재 진행중인 프로젝트는 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() 메소드

velopert.com/479

 

[MongoDB] 강좌 3편 Document Query(조회) – find() 메소드 | VELOPERT.LOG

이번 강좌에선 Document를 조회하는 메소드인 find() 메소드를 자세히 알아보도록 하겠습니다. Document 조회: db.COLLECTION_NAME.find(query, projection) 이 메소드에서 사용되는 매개변수에 대하여 알아봅시다

velopert.com

pro-self-studier.tistory.com/59

 

2. 검색하고자 하는 Document 를 조회하는 find() 메소드

안녕하세요, 프로독학러 입니다. 이번 포스팅에서는 Document 를 검색하는 find() 메소드에 대해서 자세히 알아보도록 하겠습니다. Document 를 조회하는 find() 메소드 find() 메소드의 표현식은 다음과

pro-self-studier.tistory.com

 

2. find() 메소드 활용 - sort(), limit(), skip() 

velopert.com/516

 

[MongoDB] 강좌 4편 find() 메소드 활용 – sort(), limit(), skip() | VELOPERT.LOG

이번 강좌에선 find() 메소드를 더욱 더 활용하기 위해 필요한 sort(), limit(), skip() 메소드에 대해 배워보겠습니다. 그냥 find() 메소드를 사용하면 criteria 에 일치하는 모든 document 들을 출력해주기

velopert.com