웹 풀 사이클 데브코스

[TIL] Day35 - 주문 리팩토링

닿다라다나닷 2024. 6. 2. 17:25

`.execute()` 로 sql 실행

SQL 데이터 삭제 DELETE, TRUNCATE, DROP

`DELETE FROM 테이블명 (WHERE 조건);` : 조건에 따라 행이 삭제 > 테이블 유지 (없으면 전체삭제)

`DROP TABLE 테이블명;` : 테이블 통째로 삭제

`TRUNCATE 테이블명;` : 모든 행 삭제하고 > 테이블 유지

 

DELETE, TRUNCATE 차이점 : Auto Increment 초기화 해준다!

SET foreign_key_checks=0;
TRUNCATE cartItems;
SET foreign_key_checks=1;

 

<행 삭제 없이 Auto Increment 초기화하는 방법>

SET @count=0;
UPDATE orderedBook SET id=@count:=@count+1;
ALTER TABLE orderedBook AUTO_INCREMENT=5;

 

fk로 연결되어있을경우 orderedBook > delivery > orders

> 참조하고 있는 테이블 먼저 지우고, 참조된 테이블을 지운다 > 데이터가 없어도, 그래도 제약조건이 걸려 있어서 문제 발생!!

> `SET FOREIGN_KEY_CHECKS = 0` 지금은 FK 제약조건을 사용하지 말자! 사용후 다시 `1로 설정`

 

cartItemId

장바구니 구매 후 주문완료된 아이템 삭제

프론트에서 이미 가지고 있을, 전달되는 데이터 id

DELETE FROM cartItems WHERE id IN(1,2,3);

 

const deleceCartItems = async (req, res) => {
  let sql = `DELETE FROM cartItems WHERE id IN (1,2,3);`;
  let values = [1, 2, 3];

  let result = await conn.execute(sql, values);
  return result;
};

 

req body 값의 item 배열의 구조를 변환해주기

장바구니 도서 id를 받아서 전달하면, select해서 book_id랑 quantity만 뽑아내서 insert 하는 방법

//items 를 가지고, 장바구니에서 book_id, quantity 조회
  sql = "SELECT book_id, quantity FROM cartItems WHERE IN (?)";
  let orderItems = await conn.query(sql, [items]);
  ///...
  const deleceCartItems = async (conn, items) => {
  let sql = `DELETE FROM cartItems WHERE id IN (?);`;

  let result = await conn.query(sql, [items]);
  return result;
};

 

{
    "items" : [1,2,3],
    "delivery" : {
        "address" : "서울시 북구",
        "receiver" : "다희",
        "contact" : "010-1111-1111"
    },
    "firstBookTitle" : "어린왕자들",
    "totalQuantity":3,
    "totalPrice" : 60000,
    "userId" : 1
}

 

items에서 id를 가지고만 book_id, quantity를 조회해서 insert에서 사용한다.

//delivery 테이블 삽입
  let sql =
    "INSERT INTO delivery (address, receiver, contact) VALUES (?, ?, ?);";
  let values = [delivery.address, delivery.receiver, delivery.contact];

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

  let delivery_id = result.insertId;

  //orders 테이블 삽입
  sql = `INSERT INTO orders (book_title, total_quantity, total_price, user_id, delivery_id)
  VALUES (?, ?, ?, ?, ?)`;
  values = [firstBookTitle, totalQuantity, totalPrice, userId, delivery_id];
  [result] = await conn.execute(sql, values);

  let order_id = result.insertId;

  //items 를 가지고, 장바구니에서 book_id, quantity 조회
  sql = "SELECT book_id, quantity FROM cartItems WHERE id IN (?)";
  let [orderItems, fields] = await conn.query(sql, [items]);

  //orderedBook 테이블 삽입
  sql = `INSERT INTO orderedBook (order_id, book_id, quantity) VALUES ?;`;
  //items 배열 요소를 하나씩 꺼내서 forEach > 이차원 배열로 값 던지기
  values = [];
  orderItems.forEach((item) => {
    values.push([order_id, item.book_id, item.quantity]);
  });

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

  result = await deleceCartItems(conn, items);

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

const deleceCartItems = async (conn, items) => {
  let sql = `DELETE FROM cartItems WHERE id IN (?);`;
  let values = [1, 2, 3];

  let result = await conn.query(sql, [items]);
  return result;
};

 

주문 목록 조회 GET

[
    {
        id : 주문 id,
        created_at : “주문일자”,
        address : “주소”,
        receiver : “이름”,
        contact : “전화번호”,
        book_title : “대표 책 제목”,
        total_quantity : 총 수령,
        total_price : 결제 금액
    }
]

orders 테이블의 select해서 보낸다.> + delivery JOIN

 

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

  let sql = `SELECT orders.id, book_title, total_quantity, total_price, created_at, address, receiver, contact
  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);
};

 

주문 상세 상품 조회 GET

orderedBook 테이블에서 where절로 ook_id, quantity를 도출하고, book_id로 JOIN으로 책 정보 가져온다.

[
    {
        book_id : 도서 id,
        title : “도서 제목”,
        author : “작가명”,
        price : 결제 금액,
        quantity: 총 수령
    },{
        bookId : 도서 id,
        bookTitle : “도서 제목”,
        author : “작가명”,
        price : 결제 금액,
        quantity: 총 수령
    },
    …
]
const getOrderDetail = async (req, res) => {
  const { id } = req.params;

  const conn = await mariadb.createConnection({
    host: "localhost",
    user: "root",
    password: "root",
    database: "Bookshop",
    dateStrings: true,
  });

  let sql = `SELECT book_id, title, author, quantity, price
  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);
};

 

☑️ 배운 점

장바구니 insert, delete를 진행하면서 데이터 형식이나 async 범위, 등등 에러가 잠 많이 발생한 것 같다.

그래서 부분은 강의를 좀 정신없이 따라가기 바빴다. 특히 id 값에 AI를 설정하니 숫자가 에러가 발생해도 증가하니... 지웠다가, 삽입했다가, 로직 생각했다가... 어려웠던 것 같다.

async - await 관련해서 공식문서의 예시와 글을 조금 더 찾아보아야 겠다.