๐ŸŽฏ ์ฃผ๋ฌธ API๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“™ Today I Learned

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„

Table orders

id integer [primary key]
book_title varchar
total_quantity integer
total_price integer
created_at timestamp
user_id integer
delivery_id integer

Table orderedBooks

id integer [primary key]
order_id integer
book_id integer
quantity integer

Table deliveries

id integer [primary key]
address varchar
receiver varchar
contact varchar

SQL ๋ฐ์ดํ„ฐ PK ๊ฐ€์ ธ์˜ค๊ธฐ

ํŠน์ • ํ…Œ์ด๋ธ”์—์„œ ํ˜„์žฌ ์กด์žฌํ•˜๋Š” ๊ฐ€์žฅ ํฐ PK ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

SELECT MAX(์นผ๋Ÿผ๋ช…) FROM ํ…Œ์ด๋ธ”์ด๋ฆ„;

๐Ÿค” ์™œ Last_insert_id()๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์„๊นŒ?

SELECT Last_insert_id();

โŒ ํ•œ ์„ธ์…˜์—์„œ๋งŒ ์ž‘๋™ : ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ INSERTํ•œ ๋ฐ์ดํ„ฐ๋Š” ๋ณด์ด์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
( ์„ธ์…˜ : DB์™€ ์—ฐ๊ฒฐ๋œ ๊ฐ๊ฐ์˜ ์‚ฌ์šฉ์ž(ํด๋ผ์ด์–ธํŠธ)๊ฐ€ ๊ฐ€์ง„ ๋…๋ฆฝ์ ์ธ ์—ฐ๊ฒฐ ์ •๋ณด )

โŒ ๋™์‹œ์„ฑ ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ : A ์‚ฌ์šฉ์ž๊ฐ€ INSERT INTO orders๋ฅผ ์‹คํ–‰ํ•˜๋ฉด LAST_INSERT_ID()๋Š” A๊ฐ€ ์ถ”๊ฐ€ํ•œ ํ–‰์˜ ID๋งŒ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

โŒ ํ…Œ์ด๋ธ”์„ ์ง€์ •ํ•  ์ˆ˜ ์—†์Œ


์ฝ”๋“œ์—์„œ๋Š” result๊ฐ’์˜ inserId ๊ฐ’์„ ํ™œ์šฉํ•ด์„œ PK๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.




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

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

  • Method : POST

  • URL : /orders

  • HTTP Status Code : 200 Ok

  • Request Body

{
  "item": [
    {
    	"cartItemId" : ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋„์„œ id,
      	"bookId" : ๋„์„œ id,
      	"quantity" : ์ˆ˜๋Ÿ‰
    },
    {
    	"cartItemId" : ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋„์„œ id,
      	"bookId" : ๋„์„œ id,
      	"quantity" : ์ˆ˜๋Ÿ‰
    }  
  ],
  "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 : x

  • Response Body :

[
  {
    "order_id" : ์ฃผ๋ฌธ id,
  	"created_at" : "์ฃผ๋ฌธ์ผ์ž",
    "delivery" : {
    	"address" : "์ฃผ์†Œ",
     	"receiver" : "์ด๋ฆ„",
    	"contact" : "์ „ํ™”๋ฒˆํ˜ธ",
    },
  	"bookTitle" : "๋Œ€ํ‘œ ์ฑ… ์ œ๋ชฉ",
  	"totalPrice" : ๊ฒฐ์ œ ๊ธˆ์•ก,
  	"totalQuantity" : ์ด ์ˆ˜๋Ÿ‰
  },
  {
    "order_id" : ์ฃผ๋ฌธ id,
  	"created_at" : "์ฃผ๋ฌธ์ผ์ž",
    "delivery" : {
    	"address" : "์ฃผ์†Œ",
     	"receiver" : "์ด๋ฆ„",
    	"contact" : "์ „ํ™”๋ฒˆํ˜ธ",
  },
  	"bookTitle" : "๋Œ€ํ‘œ ์ฑ… ์ œ๋ชฉ",
  	"totalPrice" : ๊ฒฐ์ œ ๊ธˆ์•ก,
  	"totalQuantity" : ์ด ์ˆ˜๋Ÿ‰
  },
  ...
]

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

  • Method : GET

  • URL : /orders/:id

  • HTTP Status Code : 200 Ok

  • Request Body : x

  • Response Body :

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



OrderController.js

const conn = require('../mariadb');
const { StatusCodes } = require('http-status-codes');

const order = (req, res) => {
  const { items, delivery, totalQuantity, totalPrice, userId, firstBookTitle } =
    req.body;

  let deliveryId;
  let orderId;
  let sql =
    'INSERT INTO deliveries (address, receiver, contact) VALUES (?, ?, ?)';

  let values = [delivery.address, delivery.receiver, delivery.contact];
  conn.query(sql, values, (err, result) => {
    if (err) {
      console.log(err);
      return res.status(StatusCodes.BAD_REQUEST).end();
    }
    deliveryId = result.insertId;

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

  sql =
    'INSERT INTO orders (book_title, total_quantity, total_price, user_id, delivery_id) VALUES (?, ?, ?, ?, ?)';

  values = [firstBookTitle, totalQuantity, totalPrice, userId, deliveryId];

  conn.query(sql, values, (err, result) => {
    if (err) {
      console.log(err);
      return res.status(StatusCodes.BAD_REQUEST).end();
    }
    orderId = result.insertId;

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

  sql = 'INSERT INTO orderedBooks (order_id, book_id, quantity) VALUES ?';
  values = [];
  items.forEach((item) => {
    values.push([orderId, item.bookId, item.quantity]);
  });
  conn.query(sql, [values], (err, result) => {
    if (err) {
      console.log(err);
      return res.status(StatusCodes.BAD_REQUEST).end();
    }

    return res.status(StatusCodes.CREATED).json(result);
  });
};
  • order : ์ฃผ๋ฌธ ๋ฐ์ดํ„ฐ๋ฅผ DB์— ์ €์žฅํ•˜๋Š” ํ•จ์ˆ˜

    • deliveries ํ…Œ์ด๋ธ”์— ๋ฐฐ์†ก ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

      • deliveryId = result.insertId; ๋กœ ์‚ฝ์ž…ํ•œ ๋ฐฐ์†ก ๋ฐ์ดํ„ฐ์˜ PK๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    • orders ํ…Œ์ด๋ธ”์— ์ฃผ๋ฌธ ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

      • orderId = result.insertId; ๋กœ ์‚ฝ์ž…ํ•œ ์ฃผ๋ฌธ ๋ฐ์ดํ„ฐ์˜ PK๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    • orderedBooks ํ…Œ์ด๋ธ”์— ์ฃผ๋ฌธ๋œ ์ฑ… ๋ชฉ๋ก์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

      • items ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ [orderId, bookId, quantity] ํ˜•์‹์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.



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

ํ•œ ํ•จ์ˆ˜์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ SQL ๋ฌธ์„ ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ, VALUES๋ฅผ 2์ฐจ์› ๋ฐฐ์—ด๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์„ ์ฒ˜์Œ ์ ์šฉํ•ด์„œ ํ—ท๊ฐˆ๋ ธ์ง€๋งŒ, SQL ๋ฌธ์„ ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๋ฒ•์„ ์ตํž ์ˆ˜ ์žˆ์–ด ์ข‹์•˜์Šต๋‹ˆ๋‹ค.

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

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