장바구니 테이블 생성
외래키 이름은 "fk_기준테이블_참조테이블_참조테이블의컬럼명"으로 설정한다.
장바구니 API 구현
라우터
const express = require('express');
const router = express.Router();
const { addToCart, getCartItems, removeCartItem } = require('../controller/CartController')
router.use(express.json());
// 장바구니 담기
router.post('/', addToCart);
// 장바구니 아이템 목록 조회
// 선택한 장바구니 상품 목록 조회
router.get('/', getCartItems);
// 장바구니 도서 삭제
router.delete('/:id', removeCartItem);
module.exports = router;
장바구니 담기
어떤 사용자가 어떤 책을 몇 개 담았는지에 대해 데이터를 삽입한다.
const addToCart = (req, res) => {
const { bookId, quantity, userId } = req.body;
const sql = `INSERT INTO cartItems (book_id, quantity, user_id) VALUES (?, ?, ?)`;
const values = [bookId, quantity, userId];
conn.query(sql, values,
(err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end(); // bad request
}
res.status(StatusCodes.CREATED).json(results);
});
}
장바구니 목록 조회/선택한 아이템 조회
request의 body에 선택한 아이템 항목이 들어오면 WHERE 절에 있는 IN 연산자를 통해 선택한 아이템을 조회한다.
선택된 아이템이 없을 경우 해당 사용자의 장바구니 목록을 조회한다.
const getCartItems = (req, res) => {
const userId = parseInt(req.body.userId);
const { selected } = req.body;
let sql = `SELECT cartItems.id, book_id, title, summary, quantity, price
FROM cartItems LEFT JOIN books
ON cartItems.book_id = books.id
WHERE user_id = ?`;
const values = [userId];
if (selected && selected.length) {
sql += ` AND cartItems.id IN (?)`;
values.push(selected);
}
conn.query(sql, values,
(err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.OK).json(results);
});
}
장바구니 아이템 삭제
장바구니 아이템 id로 해당 아이템을 삭제한다.
const removeCartItem = (req, res) => {
const id = parseInt(req.params.id);
const sql = `DELETE FROM cartItems WHERE id = ?`
conn.query(sql, id,
(err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
if (results.affectedRows) {
return res.status(StatusCodes.OK).json(results);
} else {
return res.status(StatusCodes.NOT_FOUND).end();
}
});
};
배운 점
- 제약조건 이름과 인덱스 이름은 중복될 수 없다.
- Node에서 sql안에 변수를 삽입할 때 배열 자체를 넣는 것도 가능하다. (2021년 이후 버전부터 가능)
- MySQL에서 IN 연산자를 이용하면 OR로 조건을 나열하는 것보다 간단하게 조건을 작성할 수 있다.
'데브코스' 카테고리의 다른 글
[8주차 - DAY4] 비동기 (0) | 2024.04.18 |
---|---|
[8주차 - DAY3] 주문 API 구현 (0) | 2024.04.17 |
[8주차 - DAY1] 도서 API 구현(3) (0) | 2024.04.15 |
[7주차 - DAY5] 도서 API 구현(2) (0) | 2024.04.12 |
[7주차 복습 발표] 암호화 (0) | 2024.04.11 |