Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

사고쳤어요

[도서 쇼핑몰] Node.js - 도서 조회 관련 API 구현하기 본문

웹 풀스택

[도서 쇼핑몰] Node.js - 도서 조회 관련 API 구현하기

kevinmj12 2025. 3. 13. 20:22

도서 전체 조회 (카테고리, 신간 옵션)

const books = (req, res) => {
  let categoryId = req.query.categoryid;
  let isNew = req.query.isnew;

  let sql = "SELECT * FROM books;"; // 전체 도서 조회
  let values = [];
  if (categoryId && isNew) {
    // 카테고리별 신간 도서 조회
    sql = `SELECT * FROM books WHERE category_id = ? AND
      pub_date BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW();`;
    values = [categoryId, isNew];
  } else if (categoryId) {
    // 카테고리별 조회
    sql = "SELECT * FROM books WHERE category_id = ?";
    values = [categoryId];
  } else if (isNew) {
    // 신간 조회
    sql = `SELECT * FROM books WHERE 
      pub_date BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW();`;
    values = [isNew];
  }

  conn.query(sql, values, (err, results) => {
    if (err) {
      return res.status(StatusCodes.BAD_REQUEST).json({
        msg: `Error: ${err.code}`,
      });
    }
    return res.status(StatusCodes.OK).json(results);
  });
};

참고로 신간 조회할 때 사용한 SQL의 WHERE절은

pub_date BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW() 인데,

BETWEEN 'A' AND 'B'는 A와 B 사이를 뜻하며

DATE_SUB('A', INTERVAL 1 MONTH)는 A로부터 1달 전을 뜻한다.

 

따라서 pub_date BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW()는

pub_date가 오늘로부터 1달 전 ~ 오늘 사이에 해당되는 컬럼들을 뽑아오라는 뜻이다.

도서 전체 조회
카테고리가 1인 도서 조회
카테고리가 1이고 신간인 도서 조회

개별 도서 조회

const bookDetail = (req, res) => {
  let { id } = req.params;
  id = parseInt(id);

  const sql = `SELECT * FROM books LEFT JOIN categories
  ON books.category_id = categories.id WHERE id=?;`;

  conn.query(sql, id, (err, results) => {
    if (err) {
      return res.status(StatusCodes.BAD_REQUEST).json({
        msg: `Error: ${err.code}`,
      });
    }
    if (results[0]) {
      return res.status(StatusCodes.OK).json(results[0]);
    } else {
      return res.status(StatusCodes.NOT_FOUND).end();
    }
  });
};