데브코스/도서 판매 쇼핑몰

API 구현하기(6): 주문하기(1)

hxx_1 2024. 10. 11. 20:51

1️⃣ 테이블 만들기

 

delivery 테이블 : 주문자 정보 저장

 

orders 테이블: 주문 정보 저장

 

ordered_book 테이블 : 주문된 책 정보 저장

 

 

2️⃣ 주문하기 api 구현

 

1. delivery 테이블에 주문자 정보를 저장

const { items, delivery, totalQuantity, totalPrice, userId, firstBookTitle } = req.body;
  let delivery_id, order_id;
  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 = results.insertId;
      return res.status(StatusCodes.OK).json(results);
    }
  )

body 로 delivery 객체의 속성들(address,receiver,contact) 를 입력 받아, 해당 속성의 값들을 이용해 delivery 테이블에 저장한다. INSERT 구문이 완료되면 results.insertId 가 반환되는데, 이 값을 주문자 번호인 delivery_id 에 저장한다. 

 

2. orders 테이블에 주문 정보를 저장

 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;
      return res.status(StatusCodes.OK).json(results);
    }
  )

body 로 입력 받은 값들과 주문자 정보를 저장하고 난 후 저장된 delivery_id 를 통해 orders 테이블에 주문 정보를 저장한다. INSERT 구문이 완료되면 results.insertId 가 반환되는데, 이 값을 주문 번호인 order_id 에 저장한다.

 

3. ordered_book 테이블에 주문된 책 정보를 저장

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

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

여기서 items 는 객체 배열 형태이다. 여러 개의 객체가 저장되어 있는 배열이므로, forEach 문을 돌면서 각각의 객체의 값을 위에서 구한 order_id 와 함께 values 에 저장한다. 그리고 그렇게 구한 values 의 값을 ordered_book 테이블에 저장한다.


🌟 배운 점

오늘은 주문하기 API를 구현했다. 이 작업은 여러 테이블이 조인된 상태에서 진행되었고, 단일 테이블에만 INSERT 구문을 사용하는 것이 아니라 여러 테이블에 동시에 데이터를 저장해야 해서 혼란스러운 부분이 많았다. 아직 구현이 완료되지는 않았지만, 다음 주에는 각각의 API가 동시에 어떻게 동작하는지를 배울 예정이라 기대된다. 그전까지는 혼자서 어떻게 개선할 수 있을지 고민해보는 시간을 가져야겠다.