데이터베이스를 이용할 때, 테이블이 많아진다면 주의해야 할 점이 있다.
테이블이 많아졌다는 것은, 하나의 테이블을 여러 테이블이 참조할 경우가 생긴다는 것이다.
예를 들어, books 테이블과 users 테이블이 존재한다.
그리고, likes 테이블이 books.id,users.id를 각각 book_id, user_id 라는 이름으로 참조한다고 하자.
이 때, 만약 cartItems 을 생성하고, 마찬가지로 books.id,users.id를 각각 book_id, user_id 라는 이름으로 참조하려고 한다면 다음과 같이 오류가 발생한다.

errno: 121 "Duplicate key on write or update 라는 오류가 발생한다.
이는, 외래키의 이름이 중복되어 발생하는 오류로 FK의 이름을 바꿔주면 된다.
특히, 외래키의 이름을 지정하는 데에는 불문율이 있다.
제약조건 이름 규칙
제약조건을 다음과 같이 이름지으면, 다른 테이블과 중복될 일이 발생하지 않는다.
제약조건명_현재테이블명_참조테이블명_참조키
위 예시의 경우, fk_cartItems_books_id 로 외래키 이름을 바꾸면 된다.
다음은 Workbench의 화면이다.

모든 쇼핑몰 사이트에는 장바구니 API가 필수적이다.
어떤 쇼핑몰을 가든 우리는 장바구니에 상품을 담고, 장바구니를 조회하고, 마음에 안드는 항목은 삭제하고, 더 사고 싶은 물품은 수량을 변경하고, 마음에 드는 항목은 체크해서 결제 페이지로 이동한다.
즉, 장바구니에도 CRUD가 모두 구현되어야 한다는 것이다.
먼저 4개의 틀을 구현한다.
장바구니 추가 (사용자별) :
장바구니 조회 (사용자별) :
장바구니 삭제 (사용자별) :
장바구니에서 선택한 항목들 조회 (사용자별) :
4가지 API 모두 공통점이 있다.
사용자 별로 장바구니를 관리해야 한다는 것이다.
따라서, 데이터베이스를 조회할 땐, 사용자ID 값이 필수적으로 이용할 수 밖에 없다.
보통 세션을 유지할 때, JWT를 발급해서 토큰 안에 user_id를 포함시킬 수 있으므로
로그인 상태를 확인함과 동시에 user_id를 추출해서 사용할 수 있다.
API 구현은 지금까지 공부했던 내용으로 쉽게 구현할 수 있다.
API별로 request body값, Path Parameter 값, 쿼리 파라미터 값 등을 고려하여 설계하면 된다.
장바구니 API에 대한 코드의 구현 내용은 github 페이지에 정리해두었다.
전체 코드는 프로그래머스의 강의를 참조하였기 때문에 코드의 일부분만 공개하였다.
특히, 장바구니에서 선택한 항목들을 조회할 때, 처음으로 Request body값에 배열을 이용해보았다.

프론트엔드에서 사용자가 체크한 장바구니 항목을 Request Body에 배열값으로 장바구니ID를 보내주면, 백엔드는 user_id와 장바구니ID를 이용하여 장바구니 테이블에서 해당 유저가 가진 항목들을 확인하고 해당 항목들의 정보를 Respond 해준다.
let sql = `SELECT ~ FROM cartItems LEFT JOIN books
ON cartItems.book_id = books.id WHERE user_id = ? AND cartItems.id IN (?) `
이 때, 처음 사용해보는 SQL 문법으로 IN 을 사용했다.
IN ()은 컬럼에서 괄호안의 숫자 값이 있는지를 판별할 때 사용한다.
위 코드에서 user_id의 placeholder("?")는 JWT에서 받아온 user_id를 활용하고,
cartItems.id의 placeholder는 Request Body에서 받아온 장바구니ID들 을 활용한다.
즉, 위 Postman의 예시에서는, IN (1,2,3,6,7)로 쿼리문이 작성된 것이다.
테스트용으로 [1,2,3,6,7] 이라는 값을 써보았는데, 장바구니 데이터베이스에서 6,7번만 해당 사용자의 장바구니였기 때문에, 6,7 의 장바구니만을 조회되어 결과가 출력된 모습이다.
하지만, 어차피 프론트엔드에서 사용자가 장바구니ID를 체크할 땐 본인이 가진 장바구니ID만 보여줄 것이므로 애초에 [1,2,3]이라는 다른 사용자의 장바구니ID 값은 절대 들어올 일은 없을 것 같고,
만약 6,7,8,9가 사용자의 장바구니 항목이라면,
[6,7,8,9] 에서 [6,7]번째 장바구니 항목만 선택하여 조회하는 용도로 사용한다고 생각하면 된다.