๐ŸŽฏ ์ฃผ๋ฌธ API๋ฅผ promise๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“™ Today I Learned

MYSQL ๋ฐ์ดํ„ฐ ์‚ญ์ œ ๋ฐฉ๋ฒ•

DELETE

์กฐ๊ฑด์ด ์žˆ์œผ๋ฉด ํ•ด๋‹น ์กฐ๊ฑด์— ๋งž๋Š” ํ–‰๋งŒ ์‚ญ์ œ๋˜๋ฉฐ, ์กฐ๊ฑด์ด ์—†์œผ๋ฉด ๋ชจ๋“  ํ–‰์ด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

DELETE FROM ํ…Œ์ด๋ธ”๋ช… (WHERE ์กฐ๊ฑด);

DROP

ํ…Œ์ด๋ธ”์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

DROP TABLE ํ…Œ์ด๋ธ”๋ช…;

TRUNCATE

๋ชจ๋“  ํ–‰์ด ์‚ญ์ œ๋˜์ง€๋งŒ, ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋Š” ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

AUTO_INCREMENT ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

TRUNCATE TABLE ํ…Œ์ด๋ธ”๋ช…;

โš ๏ธ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜

orderedBooks ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๊ณ , orders ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋„ ์‚ญ์ œํ•˜๊ณ ์ž ํ•˜์˜€์„ ๋•Œ, ์™ธ๋ž˜ํ‚ค ์ œ์•ฝ ์กฐ๊ฑด์ด ์„ค์ •๋œ ํ…Œ์ด๋ธ”์—๋Š” ์‚ญ์ œ ๋ช…๋ น์–ด๋ฅผ ์“ธ ์ˆ˜ ์—†๋‹ค๋Š” ์˜ค๋ฅ˜์˜€์Šต๋‹ˆ๋‹ค.

Error Code: 1701. Cannot truncate a table referenced in a foreign key constraint (`Bookshop`.`orderedBooks`, CONSTRAINT `fk_orderedBooks_orders_id` FOREIGN KEY (`order_id`) REFERENCES `Bookshop`.`orders` (`id`))	


๐Ÿ’ก ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

์™ธ๋ž˜ ํ‚ค ์ œ์•ฝ ์กฐ๊ฑด์„ ์ผ์‹œ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋ฅผ ํ•ด์ค๋‹ˆ๋‹ค.

SET FOREIGN_KEY_CHECKS = 0;

๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ orders ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ ์™ธ๋ž˜ ํ‚ค ์ œ์•ฝ ์กฐ๊ฑด์„ ํ™œ์„ฑํ™” ํ•ด์ค๋‹ˆ๋‹ค.

TRUNCATE TABLE orders;
SET FOREIGN_KEY_CHECKS = 1;

์ถœ์ฒ˜:




์ฃผ๋ฌธ(๊ฒฐ์ œ) API ์„ค๊ณ„

์ฃผ๋ฌธํ•˜๊ธฐ

  • Method : POST

  • URL : /orders

  • HTTP Status Code : 200 Ok

  • Request Body

{
  "items": [ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋„์„œ id, ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋„์„œ id, ...],
  "delivery" : {
    	"address" : "์ฃผ์†Œ",
    	"receiver" : "์ด๋ฆ„",
    	"contact" : "์ „ํ™”๋ฒˆํ˜ธ"
  },
  "totalQuantity" : ์ด ์ˆ˜๋Ÿ‰,
  "totalPrice" : ์ด ๊ธˆ์•ก,
  "userId" : ์œ ์ € ์•„์ด๋””
  "firstbookTitle" : "๋Œ€ํ‘œ ๋„์„œ ์ œ๋ชฉ"
}
  • Response Body : x

  • TODO : ํ˜„์žฌ๋Š” ํ† ํฐ์œผ๋กœ ํ•˜์ง€ ์•Š๊ณ , userId๋ฅผ body๊ฐ’์œผ๋กœ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌ


์ฃผ๋ฌธ ๋ชฉ๋ก ์กฐํšŒ

  • Method : GET

  • URL : /orders

  • HTTP Status Code : 200 Ok

  • Request Body :

"userId" : ์œ ์ € ์•„์ด๋””
  • Response Body :
[
  {
    "order_id" : ์ฃผ๋ฌธ id,
  	"created_at" : "์ฃผ๋ฌธ์ผ์ž",
    "address" : "์ฃผ์†Œ",
    "receiver" : "์ด๋ฆ„",
    "contact" : "์ „ํ™”๋ฒˆํ˜ธ",
  	"book_title" : "๋Œ€ํ‘œ ์ฑ… ์ œ๋ชฉ",
    "total_quantity" : ์ด ์ˆ˜๋Ÿ‰,
  	"total_price" : ๊ฒฐ์ œ ๊ธˆ์•ก,

  },
  {
    "order_id" : ์ฃผ๋ฌธ id,
  	"created_at" : "์ฃผ๋ฌธ์ผ์ž",
    "address" : "์ฃผ์†Œ",
    "receiver" : "์ด๋ฆ„",
    "contact" : "์ „ํ™”๋ฒˆํ˜ธ",
  	"book_title" : "๋Œ€ํ‘œ ์ฑ… ์ œ๋ชฉ",
  	"total_quantity" : ์ด ์ˆ˜๋Ÿ‰,
    "total_price" : ๊ฒฐ์ œ ๊ธˆ์•ก,
  },
  ...
]
  • TODO : ํ˜„์žฌ๋Š” ํ† ํฐ์œผ๋กœ ํ•˜์ง€ ์•Š๊ณ , userId๋ฅผ body๊ฐ’์œผ๋กœ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌ

์ฃผ๋ฌธ ์ƒ์„ธ ์กฐํšŒ

  • Method : GET

  • URL : /orders/:id

  • HTTP Status Code : 200 Ok

  • Request Body : x

  • Response Body :

[
  {
    "book_id" : ๋„์„œ id,
    "title" : "๋„์„œ ์ œ๋ชฉ",
    "author" : "์ž‘๊ฐ€",
    "price" : ๊ฐ€๊ฒฉ,
    "quantity" : ์ˆ˜๋Ÿ‰
  },
  {
    "book_id" : ๋„์„œ id,
    "title" : "๋„์„œ ์ œ๋ชฉ",
    "author" : "์ž‘๊ฐ€",
    "price" : ๊ฐ€๊ฒฉ,
    "quantity" : ์ˆ˜๋Ÿ‰
  },
  ...
]



OrderController.js

const mysql = require('mysql2/promise');
const { StatusCodes } = require('http-status-codes');

const order = async (req, res) => {
  const conn = await mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'root',
    database: 'Bookshop',
    dateStrings: true,
  });

  const { items, delivery, totalQuantity, totalPrice, userId, firstBookTitle } =
    req.body;

  let sql =
    'INSERT INTO deliveries (address, receiver, contact) VALUES (?, ?, ?)';
  let values = [delivery.address, delivery.receiver, delivery.contact];
  let [result] = await conn.execute(sql, values);
  const deliveryId = result.insertId;

  sql =
    'INSERT INTO orders (book_title, total_quantity, total_price, user_id, delivery_id) VALUES (?, ?, ?, ?, ?)';
  values = [firstBookTitle, totalQuantity, totalPrice, userId, deliveryId];
  [result] = await conn.execute(sql, values);
  const orderId = result.insertId;

  sql = 'SELECT book_id, quantity FROM cartItems WHERE id IN (?)';
  [orderItems, fields] = await conn.query(sql, [items]);

  sql = 'INSERT INTO orderedBooks (order_id, book_id, quantity) VALUES ?';
  values = [];
  orderItems.forEach((item) => {
    console.log(item);
    values.push([orderId, item.book_id, item.quantity]);
  });

  result = await conn.query(sql, [values]);

  result = await deleteCartItems(conn, items);

  return res.status(StatusCodes.CREATED).json(result[0]);
};

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 mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'root',
    database: 'Bookshop',
    dateStrings: true,
  });

  let sql =
    'SELECT orders.id, created_at, address, receiver, contact, book_title, total_quantity, total_price FROM orders LEFT JOIN deliveries ON orders.delivery_id = deliveries.id';
  let [rows, fields] = await conn.query(sql);
  return res.status(StatusCodes.OK).json(rows);
};

const getOrderDetail = async (req, res) => {
  const id = parseInt(req.params.id);
  const conn = await mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'root',
    database: 'Bookshop',
    dateStrings: true,
  });

  let sql =
    'SELECT book_id, title, author, price, quantity FROM orderedBooks LEFT JOIN books ON orderedBooks.book_id = books.id WHERE order_id = ?';
  let [rows, fields] = await conn.query(sql, id);
  return res.status(StatusCodes.OK).json(rows);
};
  • order : ์ฃผ๋ฌธ ์ •๋ณด๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ , ์žฅ๋ฐ”๊ตฌ๋‹ˆ์—์„œ ์ฃผ๋ฌธ ๋ชฉ๋ก์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    • ๋ฐฐ์†ก ์ •๋ณด INSERT
    • ์ฃผ๋ฌธ ์ •๋ณด INSERT
    • ์ฃผ๋ฌธํ•œ ์ฑ… ๋ชฉ๋ก SELECT
    • ์žฅ๋ฐ”๊ตฌ๋‹ˆ์—์„œ ์ฃผ๋ฌธํ•œ ํ•ญ๋ชฉ DELETE
  • getOrders : orders ํ…Œ์ด๋ธ”๊ณผ deliveries ํ…Œ์ด๋ธ”์„ JOIN ํ•ด์„œ ๋ฐฐ์†ก ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

  • gerOrderDetail : orderedBooks ํ…Œ์ด๋ธ”๊ณผ books ํ…Œ์ด๋ธ”์„ JOIN ํ•ด์„œ ์ฃผ๋ฌธ์— ํฌํ•จ๋œ ๋„์„œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.




โœ๏ธ ํ•œ ์ค„ ํšŒ๊ณ 

DB ์—ฐ๊ฒฐ ๊ฐ์ฒด(conn)๊ฐ€ ๊ณ„์† ์žฌ์‚ฌ์šฉ๋˜๋‹ค ๋ณด๋‹ˆ, ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ์ •๋ฆฌํ•˜๊ณ  ๋ฆฌํŒฉํ† ๋ง์˜ ํ•„์š”์„ฑ์„ ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.

profile
๐ŸŒฑ๊ฐœ๋ฐœ ๊ธฐ๋ก์žฅ

0๊ฐœ์˜ ๋Œ“๊ธ€