orderController.js
// const conn = require('../mariadb');
const mariadb = require('mysql2/promise');
const { StatusCodes } = require('http-status-codes');
const order = async (req, res) => {
const conn = await mariadb.createConnection({
host: 'localhost',
user: 'root',
password: 'root',
database: 'BookShop',
typeCast: function (field, next) {
if (field.type === 'DATETIME' || field.type === 'TIMESTAMP') {
return field.string(); // → 문자열로 변환 (예: '2025-09-30 14:09:56')
}
return next();
}
});
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);
let delivery_id = results.insertId;
//orders 테이블 삽입
sql = `INSERT INTO orders (book_title, total_quantity, total_price, user_id, delivery_id)
VALUES (?, ?, ?, ?, ?)`;
values = [firstBookTitle, totalQuantity, totalPrice, userId, delivery_id];
[results] = await conn.execute(sql, values);
let order_id = results.insertId;
// items를 가지고, 장바구니에서 book_id, quantity를 조회
sql = `SELECT book_id, quantity FROM cartItems WHERE id IN (?);`
let [orderItems, fields] = await conn.query(sql, [items]);
//orderBook 테이블 삽입
sql = `INSERT INTO orderedBook (order_id, book_id, quantity) VALUES ?`;
values = []; // items = 배열 -> 요소를 하나씩 꺼내서(foreach)
orderItems.forEach((item) => { // order_id와 함께 orderItems 안에 book_id, quantity를 values에 추가
values.push([order_id, item.book_id, item.quantity])
})
results = await conn.query(sql, [values]); // INSERT 문 SQL 실행
console.log([values]);
let result = await deleteCartItems(conn, items);
return res.status(StatusCodes.OK).json(result);
};
const deleteCartItems = async (conn, items) => {
let sql = `DELETE FROM cartItems WHERE id IN (?)`;
let result = await conn.query(sql, [items]);
return result;
}
const getOrders = async (req, res) => {
const conn = await mariadb.createConnection({
host: 'localhost',
user: 'root',
password: 'root',
database: 'BookShop',
typeCast: function (field, next) {
if (field.type === 'DATETIME' || field.type === 'TIMESTAMP') {
return field.string(); // → 문자열로 변환 (예: '2025-09-30 14:09:56')
}
return next();
}
});
let sql = `SELECT orders.id, created_at, address, receiver, contact,
book_title, total_quantity, total_price,
FROM orders LEFT JOIN delivery
ON orders.delivery_id = delivery.id`;
let [rows, fields] = await conn.query(sql);
return res.status(StatusCodes.OK).json(rows);
};
const getOrderDetail = async (req, res) => {
const { id } = req.params;
const conn = await mariadb.createConnection({
host: 'localhost',
user: 'root',
password: 'root',
database: 'BookShop',
typeCast: function (field, next) {
if (field.type === 'DATETIME' || field.type === 'TIMESTAMP') {
return field.string(); // → 문자열로 변환 (예: '2025-09-30 14:09:56')
}
return next();
}
});
let sql = `SELECT book_id, title, author, price, quantity
FROM orderedBook LEFT JOIN books
ON orderedBook.book_id = books.id
WHERE order_id = ?`;
let [rows, fields] = await conn.query(sql, id);
return res.status(StatusCodes.OK).json(rows);
};
module.exports = { order, getOrders, getOrderDetail }
const [result] = await conn.execute(
"INSERT INTO books (title, price) VALUES (?, ?)",
['노인과 바다', 10000]
);
const [rows] = await conn.query(
"INSERT INTO books (title, price) VALUES ?",
[
[
['노인과 바다', 10000],
['데미안', 12000],
],
]
);
⇒ query() 는 values ? 문법을 지원하기 때문에
즉, execute는 values (?, ?)로만 사용하고 values ? 문법을 지원하지 않음.
DELETE
⇒ DELETE FROM 테이블명 (WHERE 조건);
⇒ 조건 있을 시 조건 행이 삭제됨
⇒ 조건 없을 시 모든 행이 삭제 됨 (테이블은 남아있음)
DROP
⇒ DROP TABLE 테이블명
⇒ 테이블 통채로 삭제함
TRUNCATE
⇒ TRUNCATE 테이블명
TRUNCATE 테이블;
⇒ 모든 행이 삭제 됨(테이블은 남아있음)
⇒ autoIncrement 를 초기화 해줄 수 있는 방법!