장바구니에 담겨있는 아이템 API
cartItems 테이블에서 user_id 값으로 식별
cartItems | |||
id(PK) | book_id(FK) | cnt | user_id |
1 | 1 | 1 | 1 |
2 | 3 | 2 | 1 |
3 | 2 | 1 | 2 |
4 |
외래키 지정했던 제약조건에 한번 더 같은 이름으로 사용한다면? 충돌, 에러 발생
[fk 제약조건 이름짓기]
fk_기준 테이블명_참조테이블명_참조키
cartItems.uer_id > users.id : fk_catrItems_users_id
likes.user_id > users.id : fk_likes_users_id
장바구니 담기 INSERT
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) => {
장바구니 조회 SELECT
추후에 JWT 적용,, 지금은 user_id body값으로 전달!
book 테이블 JOIN
const getCartItems = (req, res) => {
const { user_id } = 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=?;`;
conn.query(sql, user_id, (err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.OK).json(results);
});
};
장바구니 아이템 삭제 DELETE
const delCartItems = (req, res) => {
const { id } = req.params; //catrItemID
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);
});
};
(장바구니에서 선택한) 주문 예상 상품 목록 조회
수량, 반영, 다음페이지로 전달
대표이미지, 제목, 금액, 수량(변경이 되면, 기억함. 나갔다가 다시 들어와도 반영되어 있다 > UPDATE)
체크된 cateItemId를 백엔드로 다시 보내주면, 받아서 그것만 보여준다.
여러개의 데이터로 SELECT 치기 `IN (1,2)`
장바구니 전체조회를 활용해서 짤수있다
Method | GET |
URI | /cart |
HTTP status code | 성공 : 200 실패 : |
Request Body | 로그인 할때 받은 token > header *Authorization* //payload 값을 읽을 수 있다 > 사용자의 id를 읽을 수 있다. { user_id : 회원 id selected : [cartItemId, cartItemId,…] } |
Response Body | [ { Id : 장바구니 도서 id, bookId : 도서 id, title : 도서 제목, summary : 도서요약, count : 수량, price : 가격 }, { Id : 장바구니 도서 id, bookId : 도서 id, title : 도서 제목, summary : 도서요약, count : 수량, price : 가격 }, … ] |
body 값으로 선택된 아이템 id를 저장해서 전달한다.
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 id IN (?);`;
이때, selected는 배열로 들어올텐데,, sql에서 처리하는 방법은?
js 배열 해제하는 방법 `...selected`
... spread 스프레드 연산자
?물음표의 개수 > selected.length > 부하가 발생하는 문제점
2021년 이후! 배열 그대로 사용해도 sql에서 처리할 수 있다
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) => {
body값에 user_id, selected를 보낸다.
{
"user_id": 1,
"selected" : [1,3]
}
~쇼핑몰에서 가장 까다로운 과정이 장바구니 api라고 한다~
☑️ 배운 점
장바구니에 담긴 item 별 id를 부여하고, 선택된 아이템 id를 body에 담아서 전달한다.
`IN(n, m)` sql 문법
스프레드 연산자로 배열을 해체할 수 있는데.... 이제는 sql 문에 배열을 넣을 수 있구나...!!!