데브코스

[8주차 - DAY2] 장바구니 API 구현

미안하다 강림이 좀 늦었다 2024. 4. 16. 12:49

 

 

장바구니 테이블 생성

컬럼 설정

 

외래키 이름은 "fk_기준테이블_참조테이블_참조테이블의컬럼명"으로 설정한다.

책 id 외래키
사용자 id 외래키

 

 

장바구니  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로 조건을 나열하는 것보다 간단하게 조건을 작성할 수 있다.