ERD 수정
books 테이블에 category 컬럼을 category_id로 수정하고 category 테이블을 추가했다.
카테고리별 도서 조회에서 카테고리를 쿼리로 받게 된다. 카테고리의 종류는 너무 많기 때문에 모두 문자열로 받게 되면 구현이 어려워질 수 있고 정규화 측면에서도 좋지 않다. 따라서 카테고리 테이블을 별도로 생성한다.
프로젝트 구조
파일/폴더 | 설명 |
bin/www | 포트 번화 등과 같은 웹 서버를 구축하는데에 필요한 설정 데이터가 정의되어 있는 파일이다. 설정 값을 가지고 에러 처리, 기타 추가 설정을 해준다. |
node_module | Node.js, Express에 필요한 모듈들이 설치되는 폴더이다. |
public | 정적 파일(images, ljavascripts, stylesheets)을 모아두는 폴더이다. |
routes | 각 경로를 담당하는 모듈들이 들어있는 폴더이다. 모듈들은 라우팅 로직을 구현한다. 클라이언트에서 주는 요청에 따라 수행할 로직을 파일별로 분리하여 관리한다. |
views | 클라이언트에게 html 코드로 화면을 보내는 파일들을 모아둔 폴더이다. |
app.js | Express 서버의 시작점이다. URL에 따라 라우팅 해준다. |
package.json | 이 프로젝트에 설치된 모듈 이름, 버전 등의 정보들이 작성되어있는 파일이다. |
모듈 기본 틀
app.js
const express = require('express');
const app = express();
const dotenv = require('dotenv');
dotenv.config();
app.listen(process.env.PORT);
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);
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) => {
const { categoryId, isNew } = req.query;
if (categoryId || isNew) {
res.json('카테고리별 도서 목록 조회')
} else {
res.json('전체 도서 조회');
}
});
// 개별 도서 조회
router.get('/:id', (req, res) => {
res.json('개별 도서 조회');
});
// 카테고리별 도서 목록 조회
// router.get('/', (req, res) => {
// })
module.exports = router;
likes.js
const express = require('express');
const router = express.Router();
router.use(express.json());
// 좋아요 추가
router.post('/:id', (req, res) => {
res.json('좋아요 추가');
});
// 좋아요 취소
router.delete('/:id', (req, res) => {
res.json('좋아요 취소');
});
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;
workbench 스키마 생성
데이터베이스 이름은 Bookshop으로 설정하고, 인코딩 방식을 utf-8로 설정한다.
users 테이블 생성
사용자 테이블의 대부분의 컬럼은 null이 허용되지 않는다. null이 허용될 수 있는 열은 주소, 연락처 정도이다.
'데브코스' 카테고리의 다른 글
[7주차 - DAY4] 도서 API 구현 (0) | 2024.04.11 |
---|---|
[7주차 - DAY3] 사용자 API 구현 & 비밀번호 암호화 (0) | 2024.04.10 |
[7주차 - DAY1] 도서 정보 API 설계 및 ERD 설계 (0) | 2024.04.08 |
[6주차 - DAY5] 도서 정보 API 설계 (0) | 2024.04.05 |
[6주차 복습 발표] JWT를 이용한 인증 및 인가 (0) | 2024.04.04 |