[DevCamp] 스프린트 프로젝트 2 - 주문 관련 기능 추가

동건·2025년 3월 20일

DevCamp

목록 보기
32/85

스프린트 프로젝트 2 - 주문 관련 기능 추가

오늘은 주문 API를 끝냈다.
자세한 내용은 아래와 같다.


  1. 주문 시 장바구니 삭제
  2. 주문 전체 조회
  3. 주문 상세 조회

각 기능별로 코드와 설명을 함께 살펴보자.


1. 주문 시 장바구니 삭제

사용자가 주문을 완료하면 장바구니에 담긴 항목들을 삭제해야 한다. 이를 처리하는 코드의 흐름은 다음과 같다.

코드 분석

const order = async (req, res) => {
    const conn = await mariadb.createConnection({
        host: '127.0.0.1',
        user: 'root',
        password: 'root',
        database: 'Bookshop',
        port: 3306,
        dateStrings: true,
    });

    const {items, delivery, totalQuantity, totalPrice, userId, firstBookTitle} = req.body;

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

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

    // 장바구니에서 book_id, quantity 가져오기
    sql = `SELECT book_id, quantity FROM cartItems WHERE id IN (?)`;
    let [orderItems] = await conn.query(sql, [items]);

    // orderedBook 테이블 삽입
    sql = `INSERT INTO orderedBook (order_id, book_id, quantity) VALUES ?;`;
    values = orderItems.map(item => [order_id, item.book_id, item.quantity]);
    await conn.query(sql, [values]);

    // 장바구니 삭제
    let result = await deleteCartItems(conn, [items]);

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

const deleteCartItems = async (conn, items) => {
    let sql = `DELETE FROM cartItems WHERE id IN (?)`;
    let result = await conn.query(sql, items);
    return result;
};

설명

  1. 배송 정보 저장: delivery 테이블에 사용자의 주소, 받는 사람, 연락처를 저장하고 delivery_id를 가져온다.
  2. 주문 정보 저장: orders 테이블에 주문 정보를 저장하고 order_id를 가져온다.
  3. 장바구니 데이터 활용: cartItems에서 book_idquantity를 가져온다.
  4. 주문 상세 저장: orderedBook 테이블에 order_id, book_id, quantity 데이터를 저장한다.
  5. 장바구니 삭제: cartItems 테이블에서 주문한 항목을 삭제한다.

2. 주문 전체 조회

관리자 또는 사용자가 자신의 주문 목록을 조회할 수 있도록 한다.

코드 분석

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

    let sql = `SELECT orders.id, created_at, address, receiver, contact,
                book_title, total_quantity, total_price
                FROM orders LEFT JOIN delivery
                ON orders.delivery_id = delivery_id;`;
    let [rows] = await conn.query(sql);
    return res.status(StatusCodes.OK).json(rows);
};

설명

  1. orders 테이블에서 주문 정보 조회
  2. delivery 테이블과 조인하여 배송 정보를 포함
  3. 전체 주문 목록을 반환

3. 주문 상세 조회

특정 주문의 상세 정보를 조회하는 기능이다.

코드 분석

const getOrderDetail = async (req, res) => {
    const {orderId} = req.params;

    const conn = await mariadb.createConnection({
        host: '127.0.0.1',
        user: 'root',
        password: 'root',
        database: 'Bookshop',
        port: 3306,
        dateStrings: true,
    });

    let sql = `SELECT book_id, books.title AS book_title, author, price, quantity
                FROM orderedBook LEFT JOIN books
                ON orderedBook.book_id = books.id
                WHERE order_id = ?;`;
    let [rows] = await conn.query(sql , [orderId]);
    return res.status(StatusCodes.OK).json(rows);
};

설명

  1. 주문 ID를 기반으로 orderedBook 테이블에서 조회
  2. books 테이블과 조인하여 책의 제목, 저자, 가격 정보 포함
  3. 특정 주문의 상세 목록을 반환

🔨 TIL

오늘은 주문 기능 구현에 대해 다뤘다. 주요 기능은 다음과 같다:

  • 주문 시 장바구니 삭제: 주문을 완료하면 장바구니에서 해당 항목을 삭제한다.
  • 주문 전체 조회: 사용자가 자신의 주문 목록을 확인할 수 있다.
  • 주문 상세 조회: 특정 주문의 상세 내역을 확인할 수 있다.

드디어 주문 관련 API를 끝냈다. 백엔드가 어렵지만 재미를 느낄수 있어서
계속 연습해야겠다는 생각을 했다.

profile
배고픈 개발자

0개의 댓글