구현한 부분 (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();
}
});
};
'타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) > TIL' 카테고리의 다른 글
데브코스 9주차 Day1 - [쇼핑몰]장바구니 controller , 중복 오류, ES6 문법 (0) | 2024.01.08 |
---|---|
데브코스 8주차 Day4 - 좋아요 수/여부 조회(서브쿼리), 좋아요 기능 추가 (1) | 2024.01.07 |
데브코스 8주차 Day2 - FK, book/category - Controller , 데이터 join (0) | 2024.01.05 |
데브코스 8주차 day1 - http-status-code 모듈, 폴더구조, 암호화, user 컨트롤러 구현 (0) | 2024.01.05 |
웹 풀사이클 26일차 - API 설계 (0) | 2023.12.30 |