[Node.js] 페이지네이션

yellowbutter·2024년 6월 10일

NodeJs

목록 보기
6/8
post-thumbnail

1. 📌 1~5번째 글 가져오기

await db.collection('post').find().limit(5).toArray() 

2. 📌 [skip]: 6~10번째 글 가져오기

await db.collection('post').find().skip(5).limit(5).toArray() 
  • .skip(x) : 맨 앞에서 x개 스킵하고 가져와달라는 뜻

3. 📌 /list/:id로 접속하면 id에 해당하는 것부터 게시물 5개 보여주기

app.get('/list/:id', async (요청, 응답) => {
  let result = await db.collection('post').find()
    .skip( (요청.params.id - 1) * 5 ).limit(5).toArray() 
  응답.render('list.ejs', { 글목록 : result })
}) 

4. 📌skip() 의 단점

  • skip() 안에 100만 이상의 숫자를 넣으면 매우 오래걸린다.

  • document를 하나하나 세어서 수행해주기 때문

  • 페이지네이션 기능 만들 때 간단한 사이트에선 괜찮은데 너무 많은 게시물을 스킵하는 것은 if문 써서 금지시켜놓는 등 해야한다.

5. 📌find(조건식) : 페이지네이션 만드는 다른 방법

await db.collection('post').find({_id : {$gt : 방금본 마지막게시물_id}}).limit(5).toArray() 

방금 본 마지막 게시물_id보다 큰 것에서 5개 가져오기때문에
지금 보는 게시물에서 다음 게시물 5개를 가져올 수 있다.

단점은 페이지네이션 버튼을 다음버튼으로 바꿔야한다. 다음게시물만 가져올 수 있기 때문이다.

✔️ 버튼 생성

<a href="/list/next/<%= 글목록[글목록.length - 1]._id %>">다음</a>
  • 현재 페이지에 있는 맨 마지막 글의 _id 를 찾아야함.
app.get('/list/next/:id', async (요청, 응답) => {
 let result = await db.collection('post').find({_id : {$gt : new ObjectId(요청.params.id) }}).limit(5)
 응답.render('list.ejs', { 글목록 : result })
}) 

✔️ 유저가 1000번째 페이지를 보고싶어한다면..?

  • 1000번째 페이지도 가끔 보여줘야하고 속도도 빠르게 하고 싶으면
    글의 _id를 자동부여되는 _id를 쓰지 말고 정수로 직접 부여한다.
    첫 글은 { _id : 1 } , 둘째 글은 { _id : 2 } ...
  • 예를 들어 1001~1005번 글이 필요하면
    db.collection('post').find({_id : { $gt : 1000 }}).limit(5)

  • _id를 정수로 부여하려면 auto increment 해야한다.

  • 글의 정확한 순서나 번호가 크게 중요한 서비스는 거의 없다. 예를 들면 쇼핑몰을 운영하는데 10000번째 등록된 상품을 출력해달라고 요청하는 고객은 없을 것이다.

  • 글의 _id나 순서가 정수로 꼭 필요한지는 한 번 생각해볼 필요가 있다.

📌 6. auto increment

  • 글발행할 때 마다 정수로 글번호같은걸 부여하고 싶을때
    관계형 DB의 경우 auto increment 기능을 켜면 되는데
    MongoDB는 없어서 직접 만들어야한다.
  1. counter 라는 이름의 컬렉션을 만들기

  2. { _id : 자동부여된거, count : 0 } document 발행

  3. 게시물을 하나 발행할 때 마다
    counter 컬렉션에 있던 document 를 찾아와서 count : 에 기재된 값을 출력

  4. 그 값에 +1을 한 다음 그걸 _id란에 기입해서 새로운 글을 발행

  5. 성공적으로 발행된걸 확인하면 updateOne으로 counter 컬렉션의 document에 있던 count : 항목을 +1 해준다.

  6. trigger 기능을 쓰는게 더 정확하게 잘되기 때문에 (https://www.mongodb.com/basics/mongodb-auto-increment)
    시간이 많으면 이걸로 해보자.

profile
기록은 희미해지지 않는다 🐾🧑‍💻

0개의 댓글