고양이와 코딩

[웹 풀사이클 데브코스 TIL] 9주차 Day 4 - conn.query, MySQL 데이터 삭제 본문

데브코스 TIL

[웹 풀사이클 데브코스 TIL] 9주차 Day 4 - conn.query, MySQL 데이터 삭제

ovovvvvv 2024. 1. 12. 01:30
728x90

promise 모듈은 async/await 및 Promise를 기반으로 하여 비동기적 작업을 처리할 수 있도록 설계되었습니다!
따라서 이제는 콜백 함수를 실행하지 않고 비동기적으로 쿼리를 실행 할 수 있습니다 

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

const order = async(req, res) => {
    const conn = await mariadb.createConnection({
        host : 'localhost',
        user : 'root',
        password : 'root',
        database : 'Bookshop',
        dataStrings : 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;
    console.log(results);

    // 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;

    // orderedBook 테이블에 데이터 삽입
    sql = `INSERT INTO orderedBook (order_id, book_id, quantity) VALUES ?`;

    values = [];
    items.forEach((item) => {
        values.push([order_id, item.book_id, item.quantity]);
    })

    results = await conn.query(sql, [values]);
    return res.status(StatusCodes.OK).json(results[0]);
    }

코드가 한결 간결해졌지요 ,,,

 

    // 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.query(sql, values); 
        order_id = results.insertId;

위 코드에서 `[results] = await conn.query(sql, values);` 라인은 비구조화 할당을 사용하여 `conn.query` 메서드로부터 반환된 배열의 첫 번째 요소를 추출합니다!

어떤 데이터가 들어가게 되는지 잘 이해가 안가서(..) 정리 해 보려고 합니다!

 

주문 데이터 삽입 과정

먼저 제가 postman에 삽입하는 데이터는 이런 형식입니다!

{
    "items" : [
        {
            "book_id": 6,
            "quantity" : 1
        },
        {
            "book_id" : 7,
            "quantity" : 1
        },
        {
            "book_id" : 12,
            "quantity" : 1
        }
    ],
    "delivery" : {
        "address" : "광주시 북구",
        "receiver" : "김광주",
        "contact" : "010-7777-7777"
    },
    "firstBookTitle" : "백설공주들",
    "totalQuantity" : 3,
    "totalPrice" :  60000,
    "userId" : 1
}

 

1. 배송 정보 삽입

주문에 대한 배송 정보를 `delivery` 테이블에 삽입합니다

INSERT INTO delivery (address, receiver, contact) VALUES (?, ?, ?);
  • address: 광주시 북구
  • receiver: 김광주
  • contact: 010-7777-7777

배송정보가 성공적으로 삽입되면 `delivery_id`를 얻습니다

 

2. 주문 정보 삽입

다음으로 주문에 대한 정보를  `orders`  테이블에 삽입합니다

INSERT INTO orders (book_title, total_quantity, total_price, user_id, delivery_id)
VALUES (?, ?, ?, ?, ?);
  • book_title: 백설공주들
  • total_quantity: 3
  • total_price: 60000
  • user_id: 1
  • delivery_id: 앞서 얻은 배송 정보의 delivery_id

주문 정보가 성공적으로 삽입되면 `order_id`를 얻습니다.

 

3. 주문 도서 정보 삽입

마지막으로 주문에 포함된 도서 정보를 `orderedBook` 테이블에 삽입합니다

INSERT INTO orderedBook (order_id, book_id, quantity) VALUES (?, ?, ?), (?, ?, ?), (?, ?, ?);
  • 첫 번째 도서: order_id, book_id: 6, quantity: 1
  • 두 번째 도서: order_id, book_id: 7, quantity: 1
  • 세 번째 도서: order_id, book_id: 12, quantity: 1

각 도서 정보가 성공적으로 삽입되면 주문 프로세스가 완료됩니다.

결과 확인

모든 삽입 작업이 성공하면 results에는 마지막으로 삽입된 행의 정보가 포함되어 있습니다.

이 중에서 insertId 속성을 통해 각 단계에서 생성된 자동 증가 ID를 확인할 수 있습니다. ( •̀ᴗ•́ )و ̑̑

 

 

MySQL 데이터 삭제하는 방법 

테이블을 만들다 보면 fk로 여기저기 엮인 테이블이 분명히!! 있을텐데요, 이때 테이블을 초기화 하고 싶을때,,

참조를 하고 있는 테이블의 데이터를 먼저 날리면 괜찮을거라고 생각했지만 아닙니다 ㅎ ㅎ 

먼저 참조하고있는 테이블의 데이터를 삭제하고, 참조 당하는 테이블의 데이터를 삭제해도 외래키 제약조건때문에 삭제를 할 수 없게 돼요 ,,

 

이럴 때는 이 명령어를 사용하면 됩니다!

SET FOREIGN_KEY_CHECKS = 0;

그리고 각 테이블의 데이터를 삭제 한 뒤, 다시 원래대로 돌려 줍니다.

SET FOREIGN_KEY_CHECKS = 1;

 

1. DELETE 문

특정 조건을 만족하는 행을 삭제합니다. 행을 삭제하더라도 테이블 구조는 그대로 유지됩니다.

 

2. DROP 문

테이블 전체를 삭제합니다. 테이블의 정의와 함께 데이터도 모두 삭제됩니다.

 

3. TRUNCATE 문

테이블에서 모든 행을 삭제하지만, 테이블 구조는 그대로 유지됩니다.

 

DELETE : 선택적 삭제, 롤백 불가능, 특정 행만 삭제 가능

DROP : 테이블 전체 삭제, 복구 어려움, 테이블 구조 손실

TRUNCATE : 모든 행 삭제, 롤백 불가능, 테이블 구조는 유지