프로그래머스 데브코스TIL북 스토어 프로젝트

[week7] 프로젝트 : Node.js 기반의 Rest API 구현 (9)

이규현2026-02-25
[week7] 프로젝트 : Node.js 기반의 Rest API 구현 (9)

장바구니 API 구현

cart 테이블 생성

books 테이블의 books_id와 users 테이블의 user_id를 참조하였습니다.

CREATE TABLE cart (
    cart_id INT NOT NULL AUTO_INCREMENT,
    book_id INT NOT NULL,
    user_id INT NOT NULL,
    quantity INT NOT NULL DEFAULT 1,
    PRIMARY KEY (cart_id),

    INDEX book_id_idx (book_id ASC),
    INDEX user_id_idx (user_id ASC),

    CONSTRAINT fk_cart_book
      FOREIGN KEY (book_id)
      REFERENCES books (book_id)
      ON DELETE CASCADE,

    CONSTRAINT fk_cart_user
      FOREIGN KEY (user_id)
      REFERENCES users (user_id)
      ON DELETE CASCADE
);

route/carts.js

우선 controller 코드 작성 전에 route 코드 작성 먼저 해보았습니다.

import express from 'express';
import { addCart, getCartItems, deleteCartItem } from '../controller/cartController.js';
const router = express.Router();

router
  .post('/', addCart)

  .get('/', getCartItems)

  .delete('/:cart_id', deleteCartItem);

export default router;

장바구니 담기 API 구현

책, 사용자 아이디와 수량 (quantity)를 body에 담아서 보냈습니다

export const addCart = (req, res) => {
  const { book_id, quantity, user_id } = req.body;

  const sql = 'INSERT INTO cart (book_id, quantity, user_id) VALUES (?, ?, ?)';
  const values = [book_id, quantity, user_id];

  conn.query(sql, values, (err, results) => {
    if (err) {
      console.error('장바구니 담기 DB 에러:', err);
      return res.status(StatusCodes.INTERNAL_SERVER_ERROR).json(err);
    }
    return res.status(StatusCodes.CREATED).json(results);
  });
};

장바구니 목록 조회 API 구현

LEFT JOIN을 통해 cart 테이블의 수량 정보와 books 테이블의 도서 상세 정보를 한 번에 가져오도록 구현했습니다.

export const getCartItems = (req, res) => {
  const { user_id } = req.body;

  let sql = `
    SELECT 
        cart.cart_id, 
        cart.book_id, 
        books.title, 
        books.summary, 
        cart.quantity, 
        books.price 
    FROM cart 
    LEFT JOIN books ON cart.book_id = books.book_id
    WHERE cart.user_id = ?`;

  let values = [user_id];

  conn.query(sql, values, (err, results) => {
    if (err) {
      console.error('장바구니 조회 DB 에러:', err);
      return res.status(StatusCodes.INTERNAL_SERVER_ERROR).json(err);
    }
    return res.status(StatusCodes.OK).json(results);
  });
};

장바구니에서 선택한 상품 목록 조회 API 구현

selected 유무에 따라 SQL을 구성하는 동적 SQL 방식을 적용했습니다. selected가 없을 땐 전체 목록을, 있을 땐 IN 연산자를 추가해 특정 도서 정보만 필터링하도록 구현했습니다.

export const getCartItems = (req, res) => {
  const { user_id, selected } = req.body;

  let sql =
    ...동일;

  let values = [user_id];

  if (selected && selected.length > 0) {
    sql += ` AND cart.cart_id IN (?)`;
    values.push(selected);
  }

  conn.query(sql, values, (err, results) => {
    ... 동일
};