페이지 나눠보자

gotcha!!·2024년 1월 30일
0

Nodejs

목록 보기
7/11

이전에 글들을 나열하는 페이지를 만들었다.
만약 게시글이 많아지게 되면 한 페이지에 모든 게시물들을 보여주기엔 좀 한계점이 존재한다.
그래서 페이지를 나눠볼꺼다

페이지네이션

우선 기존 코드에서
밑 코드와 같이 수정해서 /list 페이지에 게시글들을 5개씩 보여주도록 했다.

server.js

app.get('/list', async (req, resp) =>{
    let result = await db.collection('post').find().toArray();
    resp.render('list.ejs', {posts : result })
})

// 수정

app.get('/list', async (req, resp) =>{
    let result = await db.collection('post').find().limit(5).toArray();
    resp.render('list.ejs', {posts : result })
})

일단 페이지를 나누는 방법은 2가지다
한 가지는 skip()을 사용하는 것이고, 또 한가지는 find()에 조건식을 두어서 페이지를 나누는 방법이다.

await db.collection('post').find().limit(5).toArray() // 1 ~ 5번 게시글 가져오기
await db.collection('post').find().skip(5).limit(5).toArray()  // 6 ~ 10번 게시글 가져오기

이렇게 skip(x)은 x개를 스킵하고 가져와달라는 뜻이다.
일반적인 페이지네이션과 같이 1페이지 2페이지 3페이지 4페이지 5페이지 이렇게 나눌 수 있다.
하지만 skip()에서 숫자가 더 커지게 되면 나중에 데이터를 조회하는 시간이 오래 걸릴것이다.
그래서 나는 find()에 조건을 두어 찾아오도록 했다.

server.js

app.get('/list/next/:id', async (req, resp) =>{
    let result = await db.collection('post')
    .find({_id : {$gt : new ObjectId(req.params.id)}})
    .limit(5)
    .toArray();
    resp.render('list.ejs', {posts : result })
})

list.ejs

<div class="white-bg">
       <% for(let i = 0; i < posts.length; i++){ %>
            <div class="list-box" id="post_<%= posts[i]._id %>">
                <h4>
                    <a href="/detail/<%= posts[i]._id %>"><%= posts[i].title %></a>
                </h4>
                <p><%= posts[i].content %></p>
                <span class="delete" style="cursor: pointer;">글 삭제하기</span>
            </div>
        <% } %>
    </div>

    <a href="/list/next/<%= posts[posts.length -1]._id %>">다음 페이지</a>
    
    

id값을 url 파라미터로 받아와서 해당 아이디값 초과 인 게시물들을 5개씩 다음페이지 버튼을 누르면 보여주도록 했다.
하지만 이것의 단점으로는 1페이지 2페이지 3페이지 이렇게 나눌 수 없고, "몇 번째 게시글을 보여주세요." 라는 것을 할 수 없다
하지만 속도가 빠르다는 것이 장점으로 꼽을 수 있다.
간단한 게시글 페이지이면 skip()을 사용하는 것이 오히려 더 좋을 수 있다.

여기서 추가적으로 이전 페이지도 보여주는 것을 추가해주었다.


server.js

app.get('/list/prev/:id', async (req, resp) =>{
    let result = await db.collection('post')
    .find({_id : {$lt : new ObjectId(req.params.id)}})
    .sort({_id: -1})
    .limit(5)
    .toArray();
    resp.render('list.ejs', {posts : result.reverse() })
})



list.ejs


<div class="white-bg">
       <% for(let i = 0; i < posts.length; i++){ %>
            <div class="list-box" id="post_<%= posts[i]._id %>">
                <h4>
                    <a href="/detail/<%= posts[i]._id %>"><%= posts[i].title %></a>
                </h4>
                <p><%= posts[i].content %></p>
                <span class="delete" style="cursor: pointer;">글 삭제하기</span>
            </div>
        <% } %>
    </div>

    <a href="/list/next/<%= posts[posts.length -1]._id %>">다음 페이지</a>
    <br/>
    <a href="/list/prev/<%= posts[0]._id %>" >이전 페이지</a>
profile
ha lee :)

0개의 댓글