고양이와 코딩
[웹 풀사이클 데브코스 TIL] 9주차 Day 2 - 주문하기 flow 정리 본문
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' 테이블에 각 상품의 주문 정보 삽입
- Request Body
- 요청 본문에서 필요한 데이터(items, delivery, totalQuantity, totalPrice, userId, firstBookTitle)를 추출합니다.
- Delivery 정보 삽입
- delivery 정보를 delivery 테이블에 삽입하는 쿼리를 실행합니다.
- 만약 에러가 발생하면 BAD_REQUEST 상태 코드를 반환하고 에러를 로깅합니다.
- 성공적으로 실행되면 delivery_id를 설정합니다.
- 주문 정보 삽입
- 주문에 대한 정보를 orders 테이블에 삽입하는 쿼리를 실행합니다.
- delivery_id와 함께 주문 정보를 삽입합니다.
- 주문 삽입 시 에러가 발생하면 역시 BAD_REQUEST 상태 코드를 반환하고 에러를 로깅합니다.
- 성공적으로 실행되면 order_id에 results.insertId를 할당하여 새로운 주문 ID를 설정합니다.
- 상품 주문 정보 삽입
- 각각의 상품에 대한 주문 정보를 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`는 새로운 레코드가 삽입 될 때 자동으로 생성되는 값으로, 이 값이 새로 추가된 데이터의 고유 식별자가 될 수 있습니다.
'데브코스 TIL' 카테고리의 다른 글
[웹 풀사이클 데브코스 TIL] 9주차 Day 4 - conn.query, MySQL 데이터 삭제 (0) | 2024.01.12 |
---|---|
[웹 풀사이클 데브코스 TIL] 9주차 Day 3 - 비동기 처리 방법 (1) | 2024.01.10 |
[웹 풀사이클 데브코스 TIL] - 8주차 Day 3 - SQL 함수의 활용, 데이터베이스 페이징 (1) | 2024.01.04 |
[웹 풀사이클 데브코스] 8주차 Day 2 - 쿼리스트링을 사용해 하나의 엔드포인트로 기능 분리하기 (0) | 2024.01.03 |
[웹 풀사이클 데브코스 TIL] 8주차 Day 1 - API 설계, crypto를 사용한 암호화 (1) | 2024.01.02 |