9-2 주문 DB ERD, API, Bulk INSERT
주문을 위한 주문, 주문된 책, 배송 Table을 설계
Table orders {
id integer [primary key]
delivery_id integer
book_title varchar
total_quantity integer
total_price integer
created_at timestamp
user_id integer
}
Table orderedBook {
id integer [primary key]
order_id integer
book_id integer
quantity integer
}
Table delivery {
id integer [primary key]
address varchar
receiver varchar
contact varchar
}
REF: orders.delivery_id > delivery.id // orders 테이블의 delivery_id 컬럼은 delivery 테이블의 id 를 참고하는 외래키
REF: orderedBook.order_id > orders.id // 이며, 외래키로 참고되는 id는 delivery 테이블의 PK (기본키) 입니다.
REF: orderedBook.book_id > books.id
REF: orders.user_id > users.id
9-1에서 했던것 처럼 9-2에서 주문관련 테이블을 생성하면서, 제약조건의 이름이 중복되지 않도록 약속을 만들어서 진행합니다.
ex) fk_기준테이블명_참조테이블명_참조키
|GPT 설명|
컨벤션(Convention)은 특정 분야나 그룹에서 일관되게 따르는 규칙, 관습, 표준을 의미합니다. 소프트웨어 개발에서의 컨벤션은 코드 작성, 네이밍, 파일 구조 등에서 일관성을 유지하기 위한 규칙들을 말합니다.
📌 소프트웨어 개발에서의 컨벤션
소프트웨어 개발에서는 팀이나 프로젝트 내에서 일관성 있는 방식으로 코드를 작성하고 협업하는 것이 매우 중요합니다. 이를 위해 특정 규칙들을 설정하고 이를 지키는 것이 코딩 컨벤션입니다.
주요 예시:
네이밍 컨벤션: 변수명, 함수명, 클래스명 등을 정해진 규칙에 맞춰 작성
예: camelCase, PascalCase, snake_case 등
예시: userName (camelCase), UserName (PascalCase), user_name (snake_case)
코딩 스타일: 들여쓰기, 공백, 괄호 위치 등 코드의 가독성을 높이는 규칙
예: 2칸 또는 4칸 들여쓰기, 중괄호 {} 위치 규칙
예시:
javascript
복사
편집
if (condition) {
// code
}
파일 및 폴더 구조: 프로젝트 내에서 파일과 폴더를 어떤 방식으로 정리할 것인지
예: src, public, assets, controllers 폴더 사용
주석 규칙: 코드에 주석을 어떻게 달 것인지에 대한 규칙
예: 함수에 대한 설명을 함수 위에 /* ... /로 달기
버전 관리 규칙: Git을 사용할 때, 커밋 메시지 형식, 브랜치 네이밍 규칙 등을 설정
예: "feat:", "fix:", "docs:" 등으로 커밋 메시지를 구분
📌 왜 컨벤션을 지켜야 할까?
일관성: 코드의 일관성이 유지되어 협업이 원활해짐
가독성: 규칙에 맞춰 코드가 작성되면 가독성이 높아짐
유지보수 용이: 나중에 다른 사람이 코드를 보고 쉽게 이해하고 수정할 수 있음
협업 효율성: 팀원 간의 협업에서 규칙을 따라가면 혼란을 줄이고 효율적인 작업이 가능해짐
LAST_INSERT_~~~
MAX()
LAST_INSERT는 오류발생 할 수 있어서 max를 주로 사용하는 편
const order = (req, res) => {
const { items, delivery, totalQuantity, totalPrice, userId, firstBookTitle } = req.body;
// 1(delivery), 2(orders)의 실행은 주석처리 되어 생략되어있음. 일단 수동으로 delivery_id와 order_id 값을 입력해서 테스트
let delivery_id = 3;
let order_id = 2;
//====================1
let sql = "INSERT INTO delivery (address, receiver, contact) VALUES (?, ?, ?)";
let values = [delivery.address, delivery.receiver, delivery.contact];
//====================2
sql = `INSERT INTO orders (book_title, total_quantity, total_price, user_id, delivery_id)
VALUES (?, ?, ?, ?, ?)`;
values = [firstBookTitle, totalQuantity, totalPrice, userId, delivery_id]
//====================3
sql = `INSERT INTO orderedBook (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();
}
return res.status(StatusCodes.OK).json(results);
})
};
1) delivery 테이블 관련 1번 부분은
values에서 받은 값들을 query실행시 각각 address, receiver, contact에 넣어져서 저장됩니다.
2) orders 테이블 관련 2번 부분은
마찬가지로 query 실행시 values에서 받은 값들을 각각의 컬럼에 삽입합니다.
3) orderedBook 테이블 3번 부분은
values = \[ ] 배열을 초기화하고items.forEach((item) => { 부분에서 forEach문으로 item의 책 데이터를 하나씩 꺼냅니다.values.push values에 값을 넣습니다. // 위 코드에서는 넣어지는 값들도 배열입니다.이중배열
arr = [
[1, 2, 3],
[4, 5, 6]
]
arr[0] = [1, 2, 3]
arr[1][2] = 6
각 도서의 정보가 배열형태로 저장되며, 여러 책을 주문하는경우 각 도서는 values 배열에 배열형태로 저장되는 이중배열 형태입니다. = 여러개의 데이터를 한번에 담는 방식.
같은 order_id에 한번에 두 도서의 정보를 삽입한 모습