본문 바로가기

개발/프로그래머스 데브코스

프로그래머스 데브코스 35일차 with. TS 웹 풀스택

📚요약

지난 시간 책과 카테고리에 관한 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

📄구현

각 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

dbdiagram.io를 활용한 테이블 시각화

🍯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로 나오는데 어떻게 해결할 수 있을까?

category의 id가 나오는 문제

A1. category 테이블의 id를 category_id로 직접 변경한다.

A2. * 대신 칼럼명을 하나하나 직접 입력한다.

 

Q. 카테고리 API 추가에 대한 의문

A. 카테고리 목록이 수정될 수 있는 정적 데이터가 아닌 동적 데이터로 인식하는 게 좋다.

 

다음 시간에 계속...

 

출처 & 참고

김송아 강사님의 강의