고양이와 코딩

[웹 풀사이클 데브코스 TIL] 9주차 Day 2 - 주문하기 flow 정리 본문

데브코스 TIL

[웹 풀사이클 데브코스 TIL] 9주차 Day 2 - 주문하기 flow 정리

ovovvvvv 2024. 1. 9. 21:12
728x90

테이블이 하나하나 늘어날수록 제 머리도 빙빙 (,,) 돌기 시작했는데요!

그래도 차근차근 따라가고 있습니다 ... ㅎㅎ...

 

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

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

    let delivery_id = 3;
    let order_id = 2;

    let sql = `INSERT INTO delivery (address, receiver, contact) VALUES (?, ?, ?)`;
    let values = [delivery.address, delivery.receiver, delivery.contact];

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

            delivery_id = 3;

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

    sql = `INSERT INTO orders (book_title, total_quantity, total_price, user_id, delivery_id)
        VALUES (?, ?, ?, ?, ?)`;
        values = [firstBookTitle, totalQuantity, totalPrice, userId, delivery_id]
        conn.query(sql, values,
        (err, results ) => {
            if (err) {
                console.log(err);
                return res.status(StatusCodes.BAD_REQUEST).end();
            }

            order_id = results.insertId;
            console.log(order_id);

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

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

            order_id = results.insertId;
            console.log(order_id);

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

주문(결제) API에 대한 코드 플로우

1. 'delivery' 테이블에 배송 정보 삽입

2. 'orders' 테이블에 주문 정보 삽입

3. 'orderedBook' 테이블에 각 상품의 주문 정보 삽입

 

  1. Request Body 
    • 요청 본문에서 필요한 데이터(items, delivery, totalQuantity, totalPrice, userId, firstBookTitle)를 추출합니다.
  2. Delivery 정보 삽입
    • delivery 정보를 delivery 테이블에 삽입하는 쿼리를 실행합니다.
    • 만약 에러가 발생하면 BAD_REQUEST 상태 코드를 반환하고 에러를 로깅합니다.
    • 성공적으로 실행되면 delivery_id를 설정합니다.
  3. 주문 정보 삽입
    • 주문에 대한 정보를 orders 테이블에 삽입하는 쿼리를 실행합니다.
    • delivery_id와 함께 주문 정보를 삽입합니다.
    • 주문 삽입 시 에러가 발생하면 역시 BAD_REQUEST 상태 코드를 반환하고 에러를 로깅합니다.
    • 성공적으로 실행되면 order_id에 results.insertId를 할당하여 새로운 주문 ID를 설정합니다.
  4. 상품 주문 정보 삽입
    • 각각의 상품에 대한 주문 정보를 orderedBook 테이블에 삽입하는 쿼리를 실행합니다.
    • items 배열을 순회하며 각 상품의 정보를 쿼리에 추가합니다.
    • 쿼리 실행 시 에러가 발생하면 BAD_REQUEST 상태 코드를 반환하고 에러를 로깅합니다.
    • 성공적으로 실행되면 order_id에 results.insertId를 할당하여 새로운 주문 ID를 설정합니다.

플로우 요약:

  • 요청된 데이터를 받아온 후, delivery 정보를 먼저 삽입하고, 이에 해당하는 delivery_id를 얻습니다.
  • 다음으로 주문 정보(orders 테이블)를 삽입하고, 해당 주문의 order_id를 얻습니다.
  • 마지막으로 각 상품에 대한 주문 정보(orderedBook 테이블)를 삽입합니다.
  • 각 단계에서 쿼리 실행 결과에 따라 적절한 응답을 반환하거나 에러를 처리합니다.

주의해야 할 점:

현재 코드는 비동기적인 방식으로 동작하기 때문에, 쿼리의 실행 순서가 보장되지 않을 수 있습니다!

(ex. `delivery`와 `orders` 쿼리가 실행되는 동안 `orderedBook` 쿼리가 먼저 실행될 수도 있습니다)

 

추후 이 부분을 어떻게 하면 좋을지 고민하면서 코드를 리팩토링 해야 할 것 같습니다 ! 👾

 

+ 추가로 위 코드에서 `results.insertId`는 데이터베이스에 삽입된 새로운 데이터의 자동 증가 값으로, 

INSERT쿼리를 실행하면 MySQL에서 자동으로 생성되는 값이라고 합니다!

`results.insertId`는 새로운 레코드가 삽입 될 때 자동으로 생성되는 값으로, 이 값이 새로 추가된 데이터의 고유 식별자가 될 수 있습니다.