본문 바로가기

프로그래머스 풀스택 데브코스/데브코스 TIL

웹 풀사이클 데브코스 TIL 36일차

장바구니

cartItems 컬럼에 user_id를 추가해준다.

Table cartItems {
  id integer [primary key]
  book_id integer
  quantity integer
  user_id integer
}

errno: 121 "Duplicate key on write or update"

제약조건 이름이 겹쳐서 생기는 문제
제약 조건의 이름을 규칙성 있게 지어줘야한다.

  • fk_기준 테이블명_참조테이블명_참조키

  • cartItems.user_id > users.id : fk_cartItems_users_id

  • likes.user_id > users.id : fk_likes_users_id

중복된 인덱스 이름

제약 조건 이름 문제를 해결했더니 또 다른 문제가 생겼다.

이번엔 인덱스 이름이 겹쳐서 생기는 문제이다.

이와같이 인덱스 탭으로 이동해서 인덱스 명을 변경해주면 된다.

장바구니 아이템 조회 join

`SELECT cartItems.id, book_id, title, summary, quantity, price 
    FROM cartItems LEFT JOIN books 
    ON cartItems.book_id = books.id
    WHERE user_id = ?

LEFT JOIN과 SELECT할 행을 직접 지정한 조인문이다.

장바구니에서 선택한 아이템 목록 조회

장바구니에 아이템들이 있고 사용자는 그 아이템중 몇개를 선택해서 주문을 하게 된다.
그렇다면 그 선택된 아이템을 서버입장에서는 어떻게 알 수 있을까?
일단 생각나는 방법은 클라이언트에서 선택된 상품의 cartItem id를 보내주는 것이다. 그렇다면 데이터베이스에서 이 id를 이용해 상품들을 조회할 땐 어떻게 해야할 까? 이를위한 문법이 IN 이다.

SELECT * FROM Bookshop.cartItems WHERE user_id = 1 AND id IN (1,3)

id가 1과 3인 데이터를 추출해준다.

만약 IN 뒤에 배열을 넣고 싶다면 어떻게 해야할까?

자바스크립트에서는 이를 위한 문법을 제공한다.
... 문법이다.

const {user_id, 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 = ? AND cartItems.id IN (?)`;

    conn.query(sql, [user_id, ...selected],

... 을 쓰면 배열의 내용을 풀어헤쳐준다. 하지만 이렇게 해도 문제가 생긴다. selected 배열의 첫번째 값만 ? 에 들어가기 때문이다. 그렇다면 어떻게 해야할 까?
한가지 방법은 ? 의 갯수를 selected의 length 만큼 루프를 돌려서 추가해 주는 것이다. 하지만 이는 굉장히 번거로운 일이다.

최근의 자바스크립트에서는 이를 해결할 방안이 마련되있다. 그냥 배열을 통째로 넣어버리는 것이다.

const {user_id, 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 = ? AND cartItems.id IN (?)`;

    conn.query(sql, [user_id, selected],

후기

장바구니 API를 만들면서 생긴 문제점들을 해결해보았다. IN이라는 개념과 js에서 이를 활용하는 방법에 대해서도 학습하였다.

키워드: 프로그래머스 데브코스, 국비지원교육, 코딩부트캠프