티스토리 뷰

최종적으로 diagrma이 완성됐다!

이렇게보니 정말.. 사용해야할 데이터가 많아 보인다 🙄

처음에 API 설계할 때와는 좀 다른 듯 하다.. 역시 하면서 점점 바뀐다는 게 사실이었다 😥

 

이번엔 결제(주문)하기 API 구현할 예정이다!

사용할 테이블은 orders / orderedBook / delivery 테이블이다.

Foreign key도 diagram 처럼 워크벤치로 미리 작업을 해놓은 상태다.

결제 API 설계는 이렇게 했었다.

REQ에서 items(상품목록)의 데이터들은 orderedBook 테이블에 insert를 할 것이고,

delivery(배송정보) 데이터들은 delivery 테이블에 insert를 할 예정이다.

totalQuantity, totalPrice, user_id, firstBookTitle는 orders 테이블에 insert 할 것이다.

 

이렇게 insert를 하게되면 insert된 데이터를 받아서 그 다음에 사용해야 할 때도 있다.

그럴 때 사용하는 방법이 MAX( ) 이다.

💥 방금 insert한 데이터 PK 가져오는 방법

 방금 insert한 데이터를 가져오는 방법은 2가지가 있다.

LAST_INSERT_ID() 와 MAX() 이다.

둘 다 같은 값이 나올 수도 있고, 다른 값이 나올 수도 있다.

LAST_INSERT_ID()는 시간대를 비교해서 가져오는 것인데, 가끔 비슷한 시간대의 값을 잘못 갖고 오는 오류가 발생한다.

그래서 LAST_INSERT_ID() 보단 MAX()를 추천한다.

MAX(id) 라고 SELECT를 하면 id의 가장 큰 값을 가져오는 것이다.

그럼 가장 최근의 데이터가 SELECT 되는 것이다. 나는 MAX()를 사용할 예정이다.

이렇게 id가 가장 큰 값을 가져오는 걸 볼 수 있다.

 

INSERT가 총 3번이 되기 때문에 INSERT 후 MAX() 를 사용하여 해당 값을 가져오는 방법을 택했다.

배송 정보 입력 / 주문 정보 입력 / 주문 상세 목록 입력 API에 사용할 예정이다.

각각  sql은 이렇게 될 것 같다.

 

- 배송 정보 입력

INSERT INTO delivery (address, receiver, contact) VALUES (?, ?, ?);
const delivery_id = SELECT max(id) FROM delivery;

delivery 테이블에 데이터를 INSERT한 후, delivery_id라는 변수에 delivery 테이블의 가장 큰 id 값을 넣는다.

 

- 주문 정보 입력

INSERT INTO orders (book_title, total_quantity, total_price, user_id, delivery_id) VALUES (?, ?, ?, ?, delivery_id);
const order_id = SELECT max(id) FROM orders;

그 다음, orders 테이블에 데이터를 INSERT할 때, delivery_id 컬럼은 아까 받은 변수 delivery_id를 사용하여 INSERT 한다.

그러고나서 order_id 라는 변수에 orders 테이블의 가장 큰 id 값을 넣는다.

 

- 주문 상세 목록 입력

INSERT INTO orderedBook (order_id, book_id, quantity) VALUES (order_id, 1, 1);

그 다음, orderedBook 테이블에 데이터를 INSERT할 때, order_id 컬럼은 아까 받은 변수 order_id를 사용하여 INSERT 한다.

이렇게 되면, 굳이 조인을 하지 않아도 데이터를 전달받아 편하게 뿌릴 수 있다.

 

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

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

 

우선, 변수에 가장 큰 id값을 넣는 건 빼고 배송 정보 입력을 위한 INSERT 먼저 실험을 해보려고 한다.

 

데이터가 잘 들어가는 걸 볼 수 있다.

근데, 여기서 유심히 봐야할 것이 하나 있다.

"insertId" : 3 ....... 응? 이거 내가 원하는 그 id값 아닌가?

맞다😃 내가 원하는 id의 가장 큰 값. 그게 바로 insertId 였다 ㅋㅋㅋㅋ

그럼 변수에 sql문으로 가장 큰 id 값을 구해서 넣고 또 쓰고 넣고 또 쓰고.. 할 일이 없다는거네?

정답😄

그래서 나는 insertId를 이용해서 사용하기로 마음 먹었다. 왜냐고..?

코드가 더 짧아지니까 개이득 아닌가 🤷‍♀️

그래서 delivery_id를 먼저 sql문 위에 선언해주고, conn.query가 실행된 후, 

delivery_id =  results.insertId; 를 적어주었다.

그럼 결과값에 있는 insertId가 delivery_id에 담길 것이다.

아주 굿이다 굿..👏👏

 

그럼, 이제 주문 정보 입력 을 위해 로직을 짜보겠다.

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);
})

 

위의 배송 정보 입력 INSERT와는 많이 다른 건 없다.

대신, delivery_id가 아닌 order_id에 결과값의 insertId를 담을 것이다.

이렇게 포스트맨으로 확인했을 때도 문제없이 데이터가 잘 들어갔고, insertId 는 2 라는 걸 볼 수 있다.

console.log(order_id) 코드를 적어놨으니, 콘솔창에 2 가 잘 찍혔는 지도 보겠다.

잘 찍힌 걸 볼 수 있다.

 

이제,  주문 상세 목록 입력 을 위한 INSERT를 해보겠다.

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

 

위의 코드들과는 조금 다른 이유가, 이번엔 INSERT를 한 번에 2개를 하기 위해서이다.

values를 2중배열로 만들어서 INSERT 하는 것이다.

주의사항은 conn.query에 들어갈 values는 꼭 [ ] 로 묶어줘야한다.

이게 없으면 syntax 에러가 나는데 진짜 X가지 없게 알려준다.

이쪽..~~~쯤에 에러난 듯? 이정도만 알려주고 더 안 알려준다 ㅠ 그러니 실수하지말자..🙏

 

포스트맨으로 봤을 때도, 데이터가 잘 들어간 걸 볼 수 있고,

워크벤치 역시, 데이터가 잘 들어간 걸 볼 수 있다🤣

 

 

음 오늘은 진짜 역대급으로 헷갈렸던 것 같다....
INSERT를 세 번이나 한다는 것에 멘붕 + 순서도 정해야한다는 것에 멘붕 + values 쪽에서 오류나서 멘붕
완전 쓰멘붕 상태였다😞
그래서 이렇게 과제도 느려지게 되고.. 프로젝트도 얼른 해야하는데 늦어버렸다...
오늘 강의는 주말에 한 번 더 들을 예정이다. 중간에 이해가 안 간 부분이 몇 개 있었는데,
과제를 얼른 내야하기 때문에 표시만 해두고 넘어갔다.
그래도 결과물은 강사님과 똑같이 나와서 정말 다행인데...... 그래도 완벽하게 이해를 해야할 것 같다.

아! 그리고 드디어 이번 프로젝트를 준비하면서 코드를 어느정도 읽을 수 있게 되었다!!!!
사실 같이 준비하고 있는 프로젝트는 깃허브에 각자 역할을 분담하고 이슈등록해서
해당 이슈와 연관된 기능을 커밋하기로 했는데, 백 담당하시는 분들의 코드를 보고 굉장히 당황했었다.
이건 뭔 뜻이고 이건 뭐고.. 이건 왜 필요한거지..... 이러고 있었는데
드디어 어느정도 이해를 하기 시작했다 ㅠㅠ.. 눈에 읽히는 게 정말 다행이라고 생각중이다..
다음 프로젝트를 할 땐 어렵더라도 나도 백을 담당해볼까 한다..
나으 친구 챗GPT만 있다면 어디든... 갈 수 있을 것이야🙏
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함