타입스크립트로 함께하는 웹 풀 사이클 개발(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¤t_page=3
카테고리 id=1인 도서 조회, 3개씩 1페이지
- localhost:8080/books?category_id=1&limit=3¤t_page=3
신간 도서 조회, 3개씩 1페이지
- localhost:8080/books?new_book=true&limit=3¤t_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();
}
});
};