이전 내용
[TIL] 9/30 ERD 테이블, API 설계 및 수정
이전 내용 [TIL] 9/27 API 설계 명세서 작성하기1. API 설계 - 회원 API 1.1. 회원가입MethodPOSTURI/joinHTTP status code성공 201Request Body{ email: "사용자가 입력한 이메일", password: "사용자가 입력한 비
everydayc0ding.tistory.com
1. API 수정 - 도서 API
1.1. 카테고리별 도서 목록 조회
카테고리 별 catagoryId 를 넣어서 조회할 수 있다.
근데 catagory 를 catagory = "소설" 이렇게 글자로 넣어버리면, 모든 카테고리 종류가 너무 많기 때문에 복잡해지는 문제가 발생한다.
그래서 catagoryId 를 받아서 조회를 하도록 설계했는데, 이렇게 되면 catagoryId 와 id 에 맞는 catagory 가 들어있는 별도의 테이블이 필요해서 추가해주었다.
users 테이블과 catagory 테이블을 조인해서 원하는 데이터를 뽑아내 조회하면 된다.
Method | GET |
URI | 카테고리별 조회(모든 데이터): /books?catagoryId={catagoryId}&new=false 카테고리에 대한 신간 조회: /books?catagoryId={catagoryId}&new=true |
HTTP status code | 성공 200 |
Request Body | |
Response Body | [ { id: "도서 id", title: "도서제목", summary: "요약 설명", author: "작가", price: 가격, likes: 좋아요 수, pubDate: "출간일" }, { id: "도서 id", title: "도서제목", summary: "요약 설명", author: "작가", price: 가격, likes: 좋아요 수, pubDate: "출간일" }, ... ] |
2. 프로젝트 구조
2.1. Express-generator 프로젝트 구조
- bin/www
- 포트 번호 등과 같은 웹 서버를 구축하는 데에 필요한 설정 데이터가 정의되어 있는 파일
- .env 파일과 같이 설정 값을 가지고 에러 처리, 기타 추가 설정을 해주는 파일
- node_modules
- Node.js, Express 에 필요한 모듈들이 설치되는 폴더
- public
- images. javascript, stylesheets -> 정적 파일에 필요한 폴더
- 백엔드보다는 프론트에서 신경 쓰는 폴더라고 할 수 있음
cf. 동적: 사람마다 다른 데이터, 정적: 로고, 회사 소개 페이지
- routes
- 각 경로를 담담하는 모듈들이 들어있는 폴더 (app.js 서버의 시작점에서 URL 에 따라서 라우팅을 해주는데, routes 에 라우팅 로직을 구현하는 모듈들이 들어있음, 자바로 말하면 controller 역할)
cf. 라우팅 로직을 구현하는 모듈들 = 클라이언트에서 어떤 요청을 주느냐에 다라서 어떤 로직을 수행할지 파일별로 분할해서 관리하는
- views
- 클라이언트에게 html 코드로 "화면을 보내는 파일"
- 백엔드보다는 프론트에서 신경 쓰는 폴더라고 할 수 있음
- pakage.json
- 이 프로젝트에 설치된 모듈의 이름, 모듈, 버전 등의 정보들이 작성되어 있는 파일
3. 프로젝트 구현 시작
3.1. 프로젝트 셋팅
express, express-validator, dotenv, jsonwebtoken, mysql2 설치
npm i express express-validator dotenv jsonwebtoken mysql2
/.env
포트번호를 PORT 변수에 담아서 사용하기 위해 .env 파일에 작성
PORT = 9999
/app.js
const express = require('express');
const app = express();
const dotenv = require('dotenv');
dotenv.config(); // 환경변수 로딩 -> .env파일에 있는 환경변수들을 process.env에 로딩
app.listen(process.env.PORT);
3.2. 라우터 추가
// app.js
// ...
const userRouter = require('./routes/users');
const bookRouter = require('./routes/books');
const likeRouter = require('./routes/likes');
const cartRouter = require('./routes/carts');
const orderRouter = require('./routes/orders');
app.use("/users", userRouter);
app.use("/books", bookRouter);
app.use("/likes", likeRouter);
app.use("/carts", cartRouter);
app.use("/orders", orderRouter);
각 api 의 기본 틀만 생성
// users.js
const express = require('express');
const router = express.Router();
router.use(express.json());
// 회원가입
router.post('/join', (req, res) => {
res.json('회원가입');
});
// 로그인
router.post('/login', (req, res) => {
res.json('로그인');
});
// 비밀번호 초기화 요청
router.post('/reset', (req, res) => {
res.json('비밀번호 초기화 요청');
});
// 비밀번호 초기화
router.put('/reset', (req, res) => {
res.json('비밀번호 초기화');
});
module.exports = router;
// books.js
const express = require('express');
const router = express.Router();
router.use(express.json());
// 전체 도서 조회
router.get('/', (req, res) => {
res.json('전체 도서 조회');
});
// 개별 도서 조회
router.get('/:id', (req, res) => {
res.json(`개별 도서 조회: ${req.params.id}`);
});
// 카테고리별 도서 목록 조회
router.get('/:catagoryId', (req, res) => {
res.json(`카테고리별 도서 목록 조회: ${req.params.catagoryId}`);
});
module.exports = router;
// likes.js
const express = require('express');
const router = express.Router();
router.use(express.json());
// 좋아요 추가
router.post('/:id', (req, res) => {
res.json(`좋아요 추가: ${req.params.id}`);
});
// 좋아요 취소
router.delete('/:id', (req, res) => {
res.json(`좋아요 취소: ${req.params.id}`);
});
module.exports = router;
// carts.js
const express = require('express');
const router = express.Router();
router.use(express.json());
// 장바구니 담기
router.post('/', (req, res) => {
res.json('장바구니 담기');
});
// 장바구니 조회
router.get('/', (req, res) => {
res.json(`장바구니 조회`);
});
// 장바구니 도서 삭제
router.delete('/:id', (req, res) => {
res.json(`카테고리별 도서 목록 조회`);
});
// 장바구니에서 선택한 주문 예상 도서 목록 조회
// router.get('/', (req, res) => {
// res.json(`장바구니에서 선택한 주문 예상 도서 목록 조회`);
// });
module.exports = router;
// orders.js
const express = require('express');
const router = express.Router();
router.use(express.json());
// 주문하기
router.post('/', (req, res) => {
res.json('주문하기');
});
// 주문 목록 조회
router.get('/', (req, res) => {
res.json(`주문 목록 조회`);
});
// 주문 상세 상품 조회
router.get('/:id', (req, res) => {
res.json(`주문 상세 상품 조회`);
});
module.exports = router;
4. 데이터베이스 만들기
4.1. users 테이블 만들기
CREATE TABLE `book-shop`.`users` (
`id` INT NOT NULL AUTO_INCREMENT,
`email` VARCHAR(100) NOT NULL,
`name` VARCHAR(45) NOT NULL,
`password` VARCHAR(45) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `email_UNIQUE` (`email` ASC) VISIBLE);
'TIL with Programmers' 카테고리의 다른 글
[TIL] 10/4 도서 데이터베이스, API 구현 (1) | 2024.10.04 |
---|---|
[TIL] 10/2 http-status-codes, 회원가입, 로그인, 비밀번호 변경, 비밀번호 암호화하기 (1) | 2024.10.02 |
[TIL] 9/30 ERD 테이블, API 설계 및 수정 (1) | 2024.09.30 |
[회고록] 풀 사이클 개발 데브코스 6주차 회고 (0) | 2024.09.30 |
[TIL] 9/27 API 설계 명세서 작성하기 (0) | 2024.09.27 |