📚요약
지난 시간 책과 카테고리에 관한 API를 구현했습니다. 이번 시간에는 추가적으로 신간 목록을 불러오는 API와 페이징을 해보겠습니다.
📖SQL
📄시간 간격 더하기, 빼기
DATE_ADD(), DATE_SUB() 함수를 사용하여 시간을 원하는 간격에 따라 더하고 빼서 구할 수 있습니다.
SELECT DATE_ADD(기준이 되는 시간, 원하는 시간 간격);
SELECT DATE_SUB(기준이 되는 시간, 원하는 시간 간격);
// 2024.05.24 기준
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY); // 2024.05.25 출력
SELECT DATE_SUB(NOW(), INTERVAL 1 DAY); // 2024.05.23 출력
📄여러 조건 설정하기
저희가 조건을 설정할 때 WEHRE 절에 조건을 설정했었습니다. 이때 여러 조건이 있으면 AND, OR 기능이 DBMS에도 그대로 있기 때문에 그대로 사용할 수 있습니다. 추가적으로 ~와 ~ 사이라는 BETWEEN도 있기 때문에 아래 예제를 통해 알아보겠습니다.
WEHRE 조건A AND 조건B; // 두 조건 모두 만족하는 경우
WHERE 조건A OR 조건B; // 두 조건 중 하나라도 만족하는 경우
WHERE BETWEEN 조건A AND 조건B; // 두 조건 사이의 경우
WHERE BETWEEN id > 1 AND id < 10; // id가 2~9인 경우
📄원하는 결과 출력 수 정하기
행의 수가 많아지면 한 번에 출력하는 것이 부담스러워질 수 있습니다. 이를 결과(행, 데이터)를 원하는 수만큼 쪼개서 보여줄 수 있는 기능입니다. 예를 들어 블로그에 게시글이 많아지면 스크롤을 많이 해야 합니다. 하지만 저희는 일반적으로 페이지를 나눠서 보는 기능을 사용하고 있습니다.
SELECT * FROM table LIMIT 원하는 개수 OFFSET 시작 지점;
// or SELECT * FROM table LIMIT 시작지점, 원하는 개수;
시작 지점이 정해져 있는 이유는 매번 1~3번만 보여주면 안 되고 4~6번, 7~9번... 뒤에 남은 데이터를 보여줘야 하기 때문입니다.
📖책 API
📄구현




📑신간 조건 구현
신간을 구분하는 조건은 프로젝트마다 다르지만 현재 프로젝트에서는 현재 날짜에서 출판일이 1달 전까지인 책을 신간으로 분류하기로 했습니다. 이에 따라 SQL문을 작성해 원하는 결과가 출력되도록 하겠습니다.
let sql = `SELECT * FROM books
WHERE published_date BETWEEN DATE_SUB(NOW(),INTERVAL 1 MONTH) AND NOW()`
mariadb.query(sql, ()=>{});
BETWEEN ~ AND와 DATE_SUB를 활용해 현재 날짜와 한 달 전 날짜 사이에 있는 결과만 불러오기로 했습니다.
📑페이지네이션
설계를 보면 사용자가 원하는 책의 수만큼만 화면에 보여줘야 합니다. 이에 따라 SQL문을 작성해 원하는 결과가 출력되도록 하겠습니다.
const {limit, pages} = req.query;
let sql = `SELECT * FROM books
WHERE published_date BETWEEN DATE_SUB(NOW(),INTERVAL 1 MONTH) AND NOW()
LIMIT ? OFFSET ?`
const offset = limit * (pages-1);
// offset 계산
// 실제 데이터베이스의 인덱스는 0부터 시작하기 때문에 pages-1을 하고
// 다음 페이지를 위해 limit를 곱한다.
const values = [limit, offset];
mariadb.query(sql, values, ()=>{});
위와 같이 sql을 작성하면 원하는 limit와 offset(pages)에 따라 페이지가 구분된 것처럼 결과가 보입니다.
📖ERD

🍯tip! dbdigram.io에서 테이블 간의 연관관계를 설정하기 위해서는 >, <(다대일), -(일대일)을 활용하면 된다.
자세한 코드는 Github에서 확인할 수 있습니다.
ProgrammersSchool/PROJECT-BOOKSHOP at main · nulzi/ProgrammersSchool
프로그래머스 데브코스에서 학습하는 것들을 모아두는 레포. Contribute to nulzi/ProgrammersSchool development by creating an account on GitHub.
github.com
❔▪❓
Q. JOIN을 써서 결과를 출력하면 books의 id가 아닌 category의 id로 나오는데 어떻게 해결할 수 있을까?

A1. category 테이블의 id를 category_id로 직접 변경한다.
A2. * 대신 칼럼명을 하나하나 직접 입력한다.
Q. 카테고리 API 추가에 대한 의문
A. 카테고리 목록이 수정될 수 있는 정적 데이터가 아닌 동적 데이터로 인식하는 게 좋다.
다음 시간에 계속...
출처 & 참고
김송아 강사님의 강의
'개발 > 프로그래머스 데브코스' 카테고리의 다른 글
| 프로그래머스 데브코스 36일차 with. TS 웹 풀스택 (0) | 2024.05.27 |
|---|---|
| 데브코스 스터디(알고리즘, 코테) 10회차 (0) | 2024.05.26 |
| 데브코스 스터디(알고리즘, 코테) 9회차 (0) | 2024.05.23 |
| 프로그래머스 데브코스 34일차 with. TS 웹 풀스택 (0) | 2024.05.23 |
| 프로그래머스 데브코스 33일차 with. TS 웹 풀스택 (0) | 2024.05.22 |