페이징 구현해보기!

ssomae·2024년 10월 7일

DevCourse

목록 보기
28/29
post-thumbnail

books - category 연관관계 설정하기

도서 목록 조회 API 조인 구현

const bookDetail = (req, res) => {
    let { id } = req.params;
    let sql = `SELECT * FROM books LEFT JOIN category 
                    ON books.category_id = category.id WHERE books.id = ?`;
    conn.query(sql, id,
        (err, results)=> {
            if (err) {
                console.log(err);
                return res.status(StatusCodes.BAD_REQUEST).end();
            }
            if (results[0])
                return res.status(StatusCodes.OK).json(results[0]);
            else
                return res.status(StatusCodes.NOT_FOUND).end();
        }
    )
};

SQL 시간 범위 구하기

시간 더하기

DATE_ADD(기준 날짜, INTERVAL)

SELECT DATE_ADD(NOW(), INTERVAL 1 MONTH)
// 2024-11-07

시간 빼기

DATE_SUB(기준 날짜, INTERVAL)

SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH)
// 2024 09 07

시간 범위를 설정해서 SELECT

  • 최근 한달 이내 : 신간으로 구분
SELECT * FROM books WHERE pub_date BETWEEN DATE_SUB(NOW(),INTERVAL 1 MONTH) AND NOW(); 

카테고리별 신간, 도서 목록 조회

const allBooks = (req, res) => {
    let { category_id, news } = req.query;
    let sql = `SELECT * FROM books`;
    let values = [];
    if (category_id && news) {
        sql += " WHERE category_id = ? AND pub_date BETWEEN DATE_SUB(NOW(),INTERVAL 1 MONTH) AND NOW()";
        values = [category_id, news];
    }
    else if (category_id) {
        sql += " WHERE category_id = ?";
        values = category_id;
    }
    else if (news) {
        sql += " WHERE pub_date BETWEEN DATE_SUB(NOW(),INTERVAL 1 MONTH) AND NOW()"
        values = news;
    }
    conn.query(sql, values,
        (err, results)=> {
            if (err) {
                console.log(err);
                return res.status(StatusCodes.BAD_REQUEST).end();
            }
            if (results.length)
                return res.status(StatusCodes.OK).json(results);
            else
                return res.status(StatusCodes.NOT_FOUND).end();
        }
    )
   
};
  • 이런식으로 SQL문을 조건에 따라 하드코딩하는게 맞나라는 생각이 든다.
  • 개선을 해보자

도서 목록 조회 페이징 구현하기

데이터베이스 페이징

페이징 : 몇개씩 보여줄까?

  • SELECT * FROM books → 모든 데이터

LIMIT, OFFSET 키워드를 사용하자

LIMIT : 몇개씩 보여줄것인가

OFFSET: 시작 지점

SELECT * FROM books LIMIT 3 OFFSET 0; //-> 0, 1, 2 3개 보여주게된다.

도서 조회시 n개씩 보내줘야함 (limit : req에 담아보내기)

  • URL : /books?limit=(page당 도서 수)¤tPage = (현재 페이지)
const allBooks = (req, res) => {
    let { category_id, news, limit, currentPage } = req.query;
    // limit : page당 도서 수       ex 3
    // currentPage : 현재 몇 페이지 ex 1, 2, 3...
    // offset :                     ex 0, 3, 6, 9, 12 ...
    //                              limit * (currentPage-1)   
    let offset = limit * (currentPage - 1);
    let sql = `SELECT * FROM books LIMIT ? OFFSET ?`;
    let values = [parseInt(limit), offset];
    if (category_id && news) {
        sql += " WHERE category_id = ? AND pub_date BETWEEN DATE_SUB(NOW(),INTERVAL 1 MONTH) AND NOW()";
        values.push(category_id, news);
    }
    else if (category_id) {
        sql += " WHERE category_id = ?";
        values.push(category_id);
    }
    else if (news) {
        sql += " WHERE pub_date BETWEEN DATE_SUB(NOW(),INTERVAL 1 MONTH) AND NOW()"
        values.push(news);
    }
    conn.query(sql, values,
        (err, results)=> {
            if (err) {
                console.log(err);
                return res.status(StatusCodes.BAD_REQUEST).end();
            }
            if (results.length)
                return res.status(StatusCodes.OK).json(results);
            else
                return res.status(StatusCodes.NOT_FOUND).end();
        }
    )
   
};
const conn = require('../mariadb');
const { StatusCodes } = require('http-status-codes');
const dotenv = require('dotenv');

dotenv.config();

const allBooks = (req, res) => {
    let { category_id, news, limit, currentPage } = req.query;
    // limit : page당 도서 수       ex 3
    // currentPage : 현재 몇 페이지 ex 1, 2, 3...
    // offset :                     ex 0, 3, 6, 9, 12 ...
    //                              limit * (currentPage-1)   
    let offset = limit * (currentPage - 1);
    let sql = `SELECT * FROM books`;
    let values = [];
    if (category_id && news) {
        sql += " WHERE category_id = ? AND pub_date BETWEEN DATE_SUB(NOW(),INTERVAL 1 MONTH) AND NOW()";
        values= [category_id];
    }
    else if (category_id) {
        sql += " WHERE category_id = ?";
        values = [category_id];
    }
    else if (news) {
        sql += " WHERE pub_date BETWEEN DATE_SUB(NOW(),INTERVAL 1 MONTH) AND NOW()"
    }
    sql += " LIMIT ? OFFSET ?";
    values.push(parseInt(limit), offset);

    conn.query(sql, values,
        (err, results)=> {
            if (err) {
                console.log(err);
                return res.status(StatusCodes.BAD_REQUEST).end();
            }
            if (results.length)
                return res.status(StatusCodes.OK).json(results);
            else
                return res.status(StatusCodes.NOT_FOUND).end();
        }
    )
   
};

const bookDetail = (req, res) => {
    let { id } = req.params;
    let sql = `SELECT * FROM books LEFT JOIN category 
                    ON books.category_id = category.id WHERE books.id = ?`;
    conn.query(sql, id,
        (err, results)=> {
            if (err) {
                console.log(err);
                return res.status(StatusCodes.BAD_REQUEST).end();
            }
            if (results[0])
                return res.status(StatusCodes.OK).json(results[0]);
            else
                return res.status(StatusCodes.NOT_FOUND).end();
        }
    )
};

module.exports = {
    allBooks,
    bookDetail,
    
};
profile
성장해나갈 개발자

0개의 댓글