DELETE, TRUNCATE 차이
DELETE FROM 테이블명 WHERE 조건;
데이터는 지워지지만 테이블 용량은 줄어들지 않는다. 조건을 통해 원하는 데이터만 삭제할 수 있으며, 롤백이 가능하다.
TRUNCATE 테이블명;
모든 행이 삭제되며 테이블이 생성되었던 최초의 상태로 되돌린다. 롤백이 불가능하다.
주문 API 구현
주문하기
items가 객체 배열에서 배열로 수정되었다. 따라서 items에 있는 id들에 대해 SELECT를 하는 코드가 추가되었고, 장바구니에서 주문된 도서를 삭제하는 코드도 추가되었다.
Method | POST |
URI | /orders |
HTTP Status Code | 성공(201) |
Request Body | // 로그인 할 때 받은 token > header “Authorization” // payload 값 읽을 수 있음 = 사용자 id를 읽을 수 있음 { items = [장바구니 도서 id, …], delivery: { address: “주소”, receiver: “이름”, contact: “010-0000-0000” }, totalPrice: 총 금액, totalQuantity: 총 수량, userId: 사용자 id, firstBookTitle: “대표 도서 제목” } |
Response Body |
쿼리를 실행할 때 원래는 execute 메서드를 사용하는 게 맞지만, 2차원 배열을 파라미터로 넘겨줄 때는 query 메서드를 사용해야 한다. 2차원 배열을 넘겨주는 것은 최신 구문이기 때문이다.
SELECT의 결과 값은 [rows, fields]이다. rows에는 조회 결과 행들이 담기고, fields에는 각 컬럼의 정보들이 담겨있다.
const order = async (req, res) => {
const conn = await mariadb.createConnection({
host: 'localhost',
user: 'root',
database: 'Bookshop',
password: 'root',
dateStrings: true
});
const { items, delivery, totalQuantity, totalPrice, userId, firstBookTitle } = req.body;
// delivery 테이블 삽입
let sql = `INSERT INTO delivery (address, receiver, contact)
VALUES (?, ?, ?)`;
let values = [delivery.address, delivery.receiver, delivery.contact];
let [results] = await conn.execute(sql, values);
const deliveryId = results.insertId;
// orders 테이블 삽입
sql = `INSERT INTO orders (book_title, total_quantity, total_price, user_id, delivery_id)
VALUES (?, ?, ?, ?, ?)`;
values = [firstBookTitle, totalQuantity, totalPrice, userId, deliveryId];
[results] = await conn.execute(sql, values);
const orderId = results.insertId;
// items로 장바구니에서 book_id, quantity 조회
sql = `SELECT book_id, quantity FROM cartItems WHERE id IN (?)`;
const [orderItems, fields] = await conn.query(sql, [items]);
if (!orderItems.length) {
res.status(StatusCodes.BAD_REQUEST).end();
}
// orderedBook 테이블 삽입
sql = `INSERT INTO orderedBook (order_id, book_id, quantity) VALUES ?`;
values = [];
orderItems.forEach((item) => {
values.push([orderId, item.book_id, item.quantity]);
});
results = await conn.query(sql, [values]);
let result = await deleteCartItems(conn, items);
// 응답 전송
res.status(StatusCodes.CREATED).json(result);
};
const deleteCartItems = async (conn, items) => {
let sql = `DELETE FROM cartItems WHERE id IN (?)`;
const result = await conn.query(sql, [items]);
return result[0];
}
주문 목록 조회
const getOrders = async (req, res) => {
const conn = await mariadb.createConnection({
host: 'localhost',
user: 'root',
database: 'Bookshop',
password: 'root',
dateStrings: true
});
const sql = `SELECT orders.id, created_at, address, receiver, contact,
book_title, total_quantity total_price
FROM orders
LEFT JOIN delivery
ON delivery_id = delivery.id`;
const [results, fields] = await conn.query(sql);
if (results.length) {
return res.status(StatusCodes.OK).json(results);
} else {
return res.status(StatusCodes.NOT_FOUND).end();
}
};
주문 상세 조회
const getOrderDetail = async (req, res) => {
const id = parseInt(req.params.id);
const conn = await mariadb.createConnection({
host: 'localhost',
user: 'root',
database: 'Bookshop',
password: 'root',
dateStrings: true
});
const sql = `SELECT book_id, title, author, price, quantity
FROM orderedBook
LEFT JOIN books
ON orderedBook.book_id = books.id
WHERE order_id = ?`;
const [results, fields] = await conn.query(sql, id);
if (results.length) {
return res.status(StatusCodes.OK).json(results);
} else {
return res.status(StatusCodes.NOT_FOUND).end();
}
}
배운 점
- TRUNCATE를 사용하면 테이블이 생성되었던 최초의 상태로 되돌아간다. 따라서 AUTO_INCREMENT로 설정되었던 컬럼의 첫 값이 1이 된다.
- 쿼리를 실행할 때 원래는 execute 메서드를 사용하는게 맞지만, 2차원 배열을 파라미터로 넘겨줄 때는 query 메서드를 사용해야 한다. 2차원 배열을 넘겨주는 것은 최신 구문이기 때문이다.
'데브코스' 카테고리의 다른 글
제발 정렬 좀 시켜달라고 (0) | 2024.04.22 |
---|---|
[9주차 - DAY1] jwt와 에러 처리 (0) | 2024.04.22 |
[8주차 복습 발표] 비동기 처리 (1) | 2024.04.18 |
[8주차 - DAY4] 비동기 (0) | 2024.04.18 |
[8주차 - DAY3] 주문 API 구현 (0) | 2024.04.17 |