타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js)/TIL

데브코스 8주차 Day3 - 도서 기간 내 검색, 페이징 구현

슈크림 붕어빵 2024. 1. 5. 23:57

구현한 부분 (with 페이징, 검색조건)

  • 전체 도서 & 카테고리별 도서 목록 기능 추가
    • 신간 도서만 조회
    • 페이징 적용

 

신간 도서 - 현재부터 30일 내 검색

시간 더하기

  • DATE_ADD(기준 날짜, INTERVAL __)

시간 빼기

  • DATE_SUB(기준 날짜, INTERVAL __)

 

예시 - 지금으로부터 1달 전 사이의 pub_date를 가진 도서 출력

SELECT * FROM books WHERE pub_date BETWEEN DATE_SUB(NOW(),INTERVAL 1 MONTH) AND NOW();

 

 

페이징

의미: 한 페이지에 몇개씩 보여줄까?

 

- LIMIT : 출력할 행의 수 (ex - limit: 2 => 한페이지에 3개씩) 

- OFFSET: 시작 지점 (ex - offset: 10 => 10번째 행부터 n개씩 )

 

limit과 current_page를 받음
=> limit : 4
current_page 1 2 3 4
offset              0 4 8 12

 

offset = (current_page-1)*limit

 

url 예시

 

전체 도서 조회, 3개씩 1페이지

- localhost:8080/books?limit=3&current_page=3

카테고리 id=1인 도서 조회, 3개씩 1페이지

- localhost:8080/books?category_id=1&limit=3&current_page=3

신간 도서 조회, 3개씩 1페이지

- localhost:8080/books?new_book=true&limit=3&current_page=3

const allBooks = (req, res) => {
  const { category_id, new_book, limit, current_page } = req.query;
  let offset = limit * (current_page - 1);

  let sql = "SELECT * FROM books LIMIT ? OFFSET ?";
  let values = [parseInt(limit), parseInt(offset)];
  if (category_id && new_book) {
    // 카테고리별 조회 추가
    sql +=
      " WHERE category_id= ? AND pub_date BETWEEN DATE_SUB(NOW(),INTERVAL 1 MONTH) AND NOW()";
    values = [...values, category_id];
  } else if (new_book) {
    sql += " WHERE pub_date BETWEEN DATE_SUB(NOW(),INTERVAL 1 MONTH) AND NOW()";
  } else if (category_id) {
    sql += " WHERE category_id= ?";
    values = [...values, category_id];
  }

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