티스토리 뷰

 

2024.12.18 - [웹 개발 공부하기] - [12.18] 결제(주문)하기 API 구현해보기🤔

2024.12.19 - [웹 개발 공부하기] - [12.19] 논 블로킹 I/O 때문에 순서가 바뀐다고?🤔

2024.12.19 - [웹 개발 공부하기] - [12.19] async&await으로 순서를 조종해보자📢

 

이제 코드를 전체 다 주석을 풀고 async&await을 사용한 만큼 사용법에 맞게 코드를 어느정도 수정한 후,

테스트를 해보기 위해 돌려봤다!

Could not get response 가 떴다.

역시 한 번에 잘 되리란 법은 없군.. 하고 콘솔창을 좀 보러갔다.

뭐시기저시기.. undefined 다. 라는 것 같은데...

[results] = await conn.query(sql, [values]); 에서 오류가 난 것 같다.

그럼 데이터도 안 들어갔으려나 하고 워크벤치를 보니..

세 개의 테이블에 데이터는 다 쏙쏙 잘 들어갔다.

sql은 문제없이 잘 되었고, results 값을 res 하는 구간에서 문제가 생긴 것 같다.

 

INSERT 할 때 2중배열 쓰는 방법 때문에 정상적인 루트가 아니라 살짝 우회한 것처럼 사용해서 오류가 난 것 같다.

async&await을 쓰면서 query는 execute로 변환해야하는데, 오류가 난 부분은 2중배열 때문에 query를 고집했다.

그래서 콘솔창으로 어떤 값 때문에 저렇게 되는 지 확인을 해보기로 했다.

[results] = await conn.execute(sql, values);
console.log(results);

문제없었던 이 로직과

let test = await conn.query(sql, [values]);
console.log(test);

문제가 발생했던 query 로직을 비교해보겠다.

첫 번째의 로직 콘솔 결과는 우리가 봤던대로 잘 들어오는 걸 볼 수 있다.

하지만 두 번째 로직 결과를 보아하니 뭔가 이상하다. 갑자기 undefined가 따라오면서 배열로 전달이 되는 걸 볼 수 있다.

아 이래서 문제가 생겼구나!! 그럼 이 값의 첫번째 값만 빼면 되지않을까? 라는 생각이 든다.

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

그래서 results의 첫번째값을 res 해달라고 적었다.

포스트맨으로 확인해보겠다.

드...디어 성공적으로 results값을 볼 수 있게 되었다 🙆‍♀️

워크벤치도 확인해보니 아무 탈 없이 데이터들도 잘 INSERT된 걸 볼 수 있다.

드디어 결제하기 API 끝이다!!!!!! 라고 생각했는데......................... 아니었다 ^ㅁ^...

장바구니에 있던 거 구매하면.. delete를 해줘야하는데...... 그럴려면... cartItemId를 받아야 하는...데

cateItemId를 안 받았다 ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ 이제 진짜 진짜 결제하기의 마무리를 할 때가 됐다😥

 

그나저나.. API 설계한 걸 보아하니 조금 아쉬운 부분이 있다.

어차피 cartItems 테이블에 book_id 랑 quantity가 있는데 굳이 따로따로 받아야할까? 였다.

그래서 API 설계한 부분을 먼저 수정하기로 했다.

 

이렇게 수정을 하고보니.. book_id랑 quantity를 그럼 어디서 받아올건데?

음... 그럼 orderedBook 테이블에 INSERT 하기전에 SELECT로 한 번 조회를 하자.

sql = `SELECT book_id, quantity FROM cartItems WHERE id IN (?)`
let [orderItems, fields]= await conn.query(sql, [items]);

 

이렇게 cartItems에 id값을 받아서 book_id, quantity 받아와서 그걸 사용하면되지!

async&await 사용할 때 SELECT 구문은 [rows, fields]로 받아야한다.

근데 어차피 rows 가 내가 원하는 그 값이니까 rows 자리에 orderItems 라고 적어주면

이 orderItems을 이용해서 INSERT 할 때 사용하면 되는 것이다.

 

그렇게 순서는 INSERT  => INSERT => SELECT => INSERT => DELETE 가 될 것이다.

주문이 되면 장바구니에 있는 해당 제품들은 사라져야 하니 DELETE를 해줘야 하는 것이다.

DELETE FROM cartItems WHERE id IN (?)

 

주문할 때, 1개만 주문하지 않을 수도 있기 때문에 WHERE 절에 IN을 넣어 데이터를 더 받을 수 있게 만들었다.

 

이제 드디어 ,진짜 진짜 길고 길었던 결제하기 API가 완성되었다.

총 3개의 제품을 한 명의 유저가 주문했으니, delivery 테이블과 orders 테이블엔 1개의 데이터가 추가가 될 것이고,

orderedBook 테이블엔 3개의 데이터가 추가가 되고, cartItems에 있는 3개의 데이터가 지워진다.

 

이게 바로 주문하기 API의 완성본이다...

 

async&await을 사용해보니 순서를 잡을 수 있는 건 너무 좋은데...
확실히 사용법이 조금 다르다보니 고쳐야 할 곳도 너무 많았고, 왜 문제가 일어나는 지 이해를 하기 어려웠다.
일반 코드를 볼 때와.. async&await을 사용한 코드를 볼 때는 진짜 뭔가 너무 달라서 머리에 쥐 날 것 같았다 ㅠㅠ..
사실 아직도 어느정도는 이해를 못 하고 넘어간 부분이 꽤나 있다.
다행히 25일부터 쉬니까 쉬는 동안 async&await에 대한 부분을 좀 더 돌려봐야 할 것 같다.
일단 많은 사람들이 쓰는 코드이기도 하고, 실제로 이 코드로 순서도 바로 잡을 수 있으니 좋다고 들었다.
지인 개발자도 async&await은 자주 쓴다고 배울 때 제대로 이해하는 게 좋을 거라고 했으니 말이다 🙄
이제 주문 내역 조회/주문 상세 조회 만 하면 된다!!
결제하기 API가 엄청 빡셌던 것 만큼 어렵진 않을 것 같지만.. 그래도 결제하기 API와
주문내역조회 API 들은 충분히 어디서든 사용할 만한 API니까 남은 시간동안 좀 더 집중해서 들어보자!!

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함