
오늘은 BookController.js 에 있는 allBooks 를 간소화를 하였고
SQL 시간 범위를 구하는 방법으로 한 달을 기준으로 신간 도서도 조회할 수 있는 기능과
페이징 기능을 추가하는 시간을 가졌다.
특정 날짜를 기준으로 시간을 더하거나 빼고 싶다면
DATE_ADD 또는 DATE_SUB을 사용할 수 있다.
DATE_ADD(기준 날짜, INTERVAL ___)
DATE_SUB(기준 날짜, INTERVAL ___)
예를 들어, 최근 한 달 이내에 출판된 책 목록을 가져오려면 아래와 같이 작성할 수 있다.
SELECT * FROM books
WHERE pub_date BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW();
const { category_id, check_new } = req.query;
let sql = `SELECT * FROM books`
let values =[];
if (category_id && check_new ){
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(check_new){
sql += ` WHERE pub_date BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW()`;
}
위처럼 신간 조회를 할 건지 query 로 check_new 를 받아와서
신간 도서를 조회할 때
sql 문을 위 설명에 맞게 지정한다.
지금은 books 테이블 안에 있는 데이터가 많지 않지만
만약 도서 데이터가 100개, 1000개 등 많아지게 되면
한 번에 데이터를 가져오는 건 비효율적이다.
그래서 원하는 개수만큼 가져오려면 SQL 의 LIMIT 와 OFFSET 을 활용하면 된다.
SELECT * FROM books LIMIT 4 OFFSET 8;
SELECT * FROM books LIMIT 8, 4;
정리를 하면
LIMIT 은 가져올 행의 개수이고,
OFFSET 은 시작 위치 (= 몇 번째 데이터부터 가져올지) 이다.
예를 들어, 한 페이지에 4개씩 보여줄 때, 2페이지 데이터를 가져오려면
OFFSET 을 (페이지 번호 -1) * 페이지당 개수 로 계산하면 된다.
SELECT * FROM books LIMIT 4 OFFSET 4; -- 2페이지 (5번째부터 4개)
const { category_id, check_new, limit, currentPage } = req.query;
let offset = limit * (currentPage - 1);
...
sql += ` LIMIT ? OFFSET ?`
위처럼 limit 와 currentPage 를 query 로 받아와서
offset 을 계산해준 다음
마지막에 sql에 추가를 해준다.
페이징이라고 해서 엄청 어려울 줄 알았지만
강사님과 함께 따라가다보니 생각보다 어렵지 않았고
이해하기 쉬웠다. 생각해보면 다른 페이징이 가능한
홈페이지들도 다 저렇게 쿼리로 받아왔던 것 같아서
오늘 배운 내용이 유용하다고 느꼈다.