장바구니
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에서 이를 활용하는 방법에 대해서도 학습하였다.
키워드: 프로그래머스 데브코스, 국비지원교육, 코딩부트캠프
'프로그래머스 풀스택 데브코스 > 데브코스 TIL' 카테고리의 다른 글
웹 풀사이클 데브코스 TIL 38일차 (0) | 2024.01.10 |
---|---|
웹 풀사이클 데브코스 TIL 37일차 (0) | 2024.01.10 |
웹 풀사이클 데브코스 TIL 35일차 (0) | 2024.01.07 |
웹 풀사이클 데브코스 TIL 34일차 (0) | 2024.01.04 |
웹 풀사이클 데브코스 TIL 33일차 (0) | 2024.01.03 |