본문 바로가기

TIL

[TIL 2024. 06. 12] 배포 후 오류 수정

어제 대시보드를 만들고 test를 진행하던 중에 elder 사이드의 주문 과정에서 장바구니에 음성인식으로 메뉴를 넣고,

"결제하기"버튼을 누르면 DB order table의 order_menu필드에 값이 빈 값({ })로 저장되는 문제가 있음을 확인했다.

 

일단 확인한 오류에 대한 내용을 정리하면 다음과 같다

  • 클릭으로 장바구니에 넣은 메뉴들은 "결제하기"버튼을 눌렀을 때 DB에 잘 저장된다
  • 음성인식으로 장바구니에 넣은 메뉴들은 "결제하기"버튼을 눌렀을 때 DB에 빈 리스트로 저장된다
  • 클릭과 장바구니를 섞어서 장바구니에 넣고 "결제하기"를 진행하면, 클릭으로 넣은 물건들만 DB에 저장된다
  • "결제하기"의 실행은 클릭으로 하거나 음성인식으로 하거나 결과에 차이가 없다
    • 즉, 음성인식으로 장바구니에 메뉴를 추가, 수정, 삭제했다면 "결제하기"버튼을 클릭하는지 음성으로 진행하는지와 무관하게 DB에는 빈 리스트로 저장된다

 

문제를 처음 확인하고 가장 먼저 확인한 것은 "결제하기"와 관련된 코드들에서 console.log문이나 print문을 찍어보면서 정확한 문제 발생지점을 확인하는 것이었다.

그 결과, cart.js에서의 submitOrder()에서 selectedItems라는 변수에 값을 조회해올 때 사용하는 "cart"라는 변수 자체에 아무런 값이 들어있지 않은 것이 문제의 원인임을 알 수 있었다.

 

cart의 값이 {} 으로 나오고 있음. 그러니 당연히 selectedItems도 []로 나옴


하지만 문제의 직접적인 발생이 submitOrder에서 발생한 것이라고 하더라도, 이게 add_to_cart부터 제대로 실행되지 않아서 Redis자체에 update가 되지 않고 있는 것인지 아니면 Redis저장까지는 문제가 없는데 submit과정 자체에서 문제가 발생하는 것인지에 대한 추가적인 확인이 필요했다

 

지금 현재 상황은 배포가 진행된 상태이므로, Docker와 관련된 설정들이 모두 aws EC2에 맞춰져 있어서 local docker로 test를 진행할 때 static파일 경로를 찾지 못하는 문제가 있어서 local docker에서의 디버깅은 어려웠다.
(배포 설정시에 local docker에서도 원활한 수정 및 디버깅을 할 수 있는 세팅이 별도로 있다고 하는데, 우리는 모두 정식으로 진행하는 배포는 처음이라 이 사실을 뒤늦게 알았다..ㅎㅎ)

-> 그래서 settings.py의 설정들을 postgreSQL과 docer내의 Redis가 아니라 sqlite와 로컬 Redis로 변경하고 "python manage.py runserver"로 디버깅을 진행했다.

** settings.py
1. DATABASES 설정 변경

2. CACHE의 Redis Location 변경: redis://redis:6379 -> redis://127.0.0.1:6379
## redis://으로 해야 함. redis:/로 했다가 오류 남

3.ALLOWED_HOSTS 변경: [".silverlinings.site"] -> ["*"]
## "*"로 띄워쓰기가 없어야 함. " * "로 했다가 오류 남

4. DEBUG = True

 

Redis Insight(GUI)도 깔아서 Redis에 잘 저장되고 있는지를 확인해보려고 했지만, 포트 연결에 문제가 있어서 결국 vscode의 터미널에서 명령어로 확인했다. (기존 기능 개발시에는 지현님이 GUI를 설치하시고, ZEP을 통한 화면공유로 진행했어서 내 컴퓨터에는 GUI연결이 안되어 있었다..)

 

즉, 다음과 같은 순서로 문제의 원인을 정확히 알기 위한 test를 진행했다

1. elder_menu페이지에서 음성인식으로 장바구니에 물건을 넣는다

(이때, 디버깅 중에 화면이 이동하는 것을 막기 위해 리다이렉트 타이머는 일시적으로 설정을 매우 길게 잡아둠)

2. vscode의 터미널에서 `hgetall cart:<staff명>"으로 Redis에 현재 장바구니 상태가 잘 저장되어 있는지 확인한다

3. elder_menuㅠ페이지로 돌아와서 "결제하기"버튼을 누른다

4. DB의 order 테이블에 잘 저장되는지 확인한다

 

test결과, 2번 과정에서 Redis에 장바구니 현황이 실시간으로 잘 update되고 있음을 확인했다.

그리고 4번 과정에서는 여전히 DB에 빈 리스트로 저장됨을 다시 확인했다.

 

정리하면, 문제의 원인이 add_to_cart와는 무관하게 submit과정과 관련되어 있음을 확실히 알게 된 것이다.


문제의 원인을 알게 되었지만 해결과정에서도 약간의 난항이 있었다.

 

기존의 작성된 로직을 보면,

1. elder_menu상에서 "결제하기"버튼을 클릭 or 음성인식