데브코스/도서 판매 쇼핑몰

API 구현하기(5): 장바구니 담기, 조회, 삭제

hxx_1 2024. 10. 10. 15:54

1️⃣ 장바구니 담기

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

  let sql=`INSERT INTO cartItems (book_id, quantity, user_id) VALUES (?, ?, ?);`;
  let values = [book_id,quantity,user_id];

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

body  에 입력된 값에 따라 데이터베이스에 해당 데이터가 잘 저장되는 것을 확인할 수 있다. 

 

2️⃣ 장바구니 아이템 목록 조회 / 선택된 장바구니 아이템 목록 조회 

const getCartItems = (req,res) => {
  const {user_id, selected} = req.body; //selected = [1,3]
  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=? AND cartItems.id IN (?)`;
  let values = [user_id, 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);
    }
  )
}

 

✨IN 논리 연산자 사용하기

컬럼명 IN (값1, 값2 ...) 쓰면 컬럼명에서 값 1, 값 2을 만족하는 행을 전부 출력해준다. 쉽게 말해 같은 컬럼에서 OR 연산자가 여러개 필요할 때 IN () 을 사용하면 간단해진다. 

 

위의 경우에서는 장바구니에서 선택된 상품들이 여러개 있을 수 있으므로 IN 연산자를 사용하여 장바구니 안에서 선택된 아이템들이 모두 출력되도록 하였다.

 

user_id 가 1이고, 장바구니에서 선택된 아이템의 아이디가 1,3 인 경우를 조회하면 위와 같은 결과가 나오게 된다. 

 

3️⃣ 장바구니 도서 삭제

const removeCartItem = (req,res) => {
  const {id} = req.params; // cartItemId

  let sql=`DELETE FROM cartItems WHERE id= ?`;

  conn.query(sql,id,
    (err, results) => {
      if (err) {
        console.log(err);
        return res.status(StatusCodes.BAD_REQUEST).end();
      }
      return res.status(StatusCodes.OK).json(results);
    }
  )
}

URL 에 파라미터로 받은 장바구니 아이템 번호에 해당하는 아이템이 잘 삭제된 것을 확인할 수 있다.


🌟 배운 점

오늘은 데이터베이스 테이블에서 외래키 설정 시 제약 조건의 이름이 중복되지 않아야 한다는 것을 새롭게 배웠다. 외래키 이름을 짓는 좋은 방법은 `fk_기준테이블명_참조테이블명_참조키` 형식이다. 그동안 제약 조건 이름을 무심코 지었는데, 앞으로는 규칙에 따라 더 체계적으로 이름을 정할 계획이다. 또한, SQL 문에서 OR 대신 IN 연산자를 사용하면 쿼리를 간결하게 작성할 수 있다는 것도 새로 알게 되었다. 오늘 배운 것을 잊지 않고 잘 활용해야겠다.

 

👍🏻참고하기

https://velog.io/@taerin/mysql-errno-121-Duplicate-key-on-write-or-update

 

🧨 mysql - errno: 121 "Duplicate key on write or update”

문제 발생 상황외래키를 지정해주려고 하니 errno: 121 "Duplicate key on write or update” 에러가 뜸errno: 121 "Duplicate key on write or update”고유 제약 조건을 가진 컬럼에 중복된 값을 삽입하려고 할

velog.io