서버/nodejs

Sequelize 사용 기록(CRUD/Pagination) - 03

오늘은 진행하는 프로젝트에서 데이터를 조회하는 부분을 구현하였다.

dog_poo 테이블에서 최신순으로 정렬한 후 "RGB"값을 두개 씩 보내주는 것이 목표였다.

어떻게 구현해야 할지 찾아보던 중 "pagination" 이라는 것이 있어서 사용하였고, 이를 기록으로 남긴다.

 

const readPooData = async (req, res, next) => {
    const pooData = req.query;
    const Op = Sequelize.Op;
    var startDate = new Date(pooData.date);
    var endDate = new Date(pooData.date);
    endDate.setDate(endDate.getDate()+1);

    try {
        const result =  await db.dog_poo.findAll({
            attributes: [
                "RGB", "createdAt"
            ],
            where: {
                user_dog_id: req.currentUser.uid,
                createdAt: {
                    [Op.gt]: startDate,
                    [Op.lt]: endDate
                },
            },
            order: [
                ["createdAt", "DESC"]
            ],
            limit: 2,
            offset: pooData.page * 2,
        })    
        res.json(result);

Data 객체를 사용한 이유는 createdAt 필드를 "년-월-일"(시 분 초 제외) 기준으로 내림차순으로 정렬하기 위해서이다.

startDate에 App에서 get으로 보내준 년-월-일 데이터를 넣고, endDate에는 getDate()+1을 하여서 1일을 더해준다.

 

startDate와 endDate에 값을 넣고, Sequelize.Op를 사용하여서 특정 범위 안에 들어가는 createdAt 만을 가져온다.

gt는 greater, lt는 little이다. 즉 위의 코드를 수식으로 바꾸자면 startDate<    <endDate 이다.

초과/미만이 아니라, 이상/이하는 gte/lte로 사용하면 된다.

 

where을 거쳐 조건에 맞는 것들이 추출되면, order를 사용해서 정렬해준다.

 

pagination을 위해 limit과 offset을 사용하였다.

limit은 한 페이지에 넘겨 줄 item의 개수, offset은 몇개의 item을 skip하는지에 대한 offset이다.

위의 코드로는 한 번에 2개의 item씩 넘겨주며, offset은 현재의 offset * limit수 를 해주어서, 커서가 2칸씩 이동하게 구현하였다.

 

추가로 REST API로 형식을 맞추어줬는데, 이것에 대한 포스팅은 다음에 진행하겠다.

 

 

참고 링크

1. .getDate() + 1 사용

stackoverflow.com/questions/9989382/how-can-i-add-1-day-to-current-date/9989458

 

2. sequelize.op 연산자 사용 및 gt / lt 사용

velog.io/@cadenzah/sequelize-document-2

 

3. order 사용

victorydntmd.tistory.com/29?category=677306

 

4. pagination 사용

bezkoder.com/node-js-sequelize-pagination-mysql/

 

5. REST API 사용

meetup.toast.com/posts/92