본문 바로가기
TIL with Programmers

[TIL] 10/1 API 설계 & 수정, ERD 테이블

by 보먀 2024. 10. 1.
728x90
반응형

이전 내용

 

[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);

 

 

728x90
반응형