입점사에서 취소가 마켓 처리 실패로 뜨고 안내받은 자동 취소도 안 된다는 문의가 들어왔다. 요컨대 취소가 전혀 진행되지 않고 있다는 얘기였다.
Table of contents
Open Table of contents
증상 — 이미 종결된 주문
문의한 건들을 조회하니 orders.status 와 order_items.status 가 전부 CANCELLED 로 찍혀 있었다. 취소가 안 된 것이 아니라 이미 정상으로 끝난 상태였다.
그러면 왜 화면에는 대기로 뜨는지를 이어서 봐야 했다. order_cancels 를 GROUP BY status 로 세니 REQUESTED 로 수백 건이 그대로 남아 있었다.
원인 — 전환되지 않은 컬럼
주문은 끝났는데 order_cancels.status 만 전환되지 않고 남은 것이었다. 화면은 그 컬럼을 보고 취소 대기라고 표시하고 있었다.
즉 연동 실패가 아니라 표시 문제였다. 입점사 입장에서는 둘이 구분되지 않으므로 화면에 대기라고 뜨면 안 된 줄 알게 된다.
판단 기준 — 바뀐 확인 순서
두 가지 방법이 있었는데 이 유형의 문의를 받으면 마켓 연동 실패를 먼저 의심하고 laravel.log 를 뒤지는 것과 orders.status 와 order_cancels.status 의 불일치부터 확인하는 것이다. 뒤쪽을 골랐다. 이유는 불일치면 표시 문제이고 일치하면 진짜 실패라 한 번의 조회로 갈려서다. 대신 진짜 실패인 건은 그 조회만큼 조사가 한 단계 늦게 시작되는 것을 감수했다.
이 확인을 먼저 하면 조사 자체가 훨씬 짧게 끝난다. 해소는 잔존 건을 정리하는 것과 왜 전환이 안 됐는지 코드를 보는 두 갈래인데 앞의 것만 하면 또 쌓인다. 다만 전환 미동작의 코드상 원인은 이 시점까지 못 찾았고 미확인으로 적었다.
주의 — 드러난 요청 폭주
조사 중에 성격이 다른 것이 하나 나왔다. 한 주문에 order_cancels 행이 수백 건 있었고 엿새 동안 20분 간격으로 반복 생성돼 있었다.
무언가가 취소 요청이 없다고 판단해 계속 만든 것으로 보이고 마지막에 하나가 성공했는데 앞선 것들이 정리되지 않고 남았다. 표시 문제는 상태가 안 바뀐 것이고 폭주는 같은 요청을 계속 만든 것이라 성격이 다르므로 따로 조사 대상으로 분리했다.
조인 대상을 바꾼 조회
조회 요령도 하나 얻었는데 처음에는 orders.supplier_id 로 걸렀더니 일부가 안 잡혔다.
orders 에 그 식별자가 NULL 인 건이 있어서 order_items.supplier_id 로 JOIN 해야 전체가 잡혔다. 같은 식별자가 여러 테이블에 있으면 어디가 채워져 있는지를 확인하고 조인 대상을 고른다.
정리
- 호소된 실패가 표시 문제일 수 있다
- 확인은
orders.status와order_cancels.status의 불일치부터 한다 - 연동 로그를 뒤지는 것은 그다음이다
- 불일치면 표시 문제이고 일치하면 진짜 실패다
- 해소는 잔존 정리와 전환 로직 확인 두 갈래다
- 원인을 못 찾았으면 미확인으로 적는다
- 같은 요청이 반복 생성되는 폭주는 따로 조사한다
- 같은 식별자가 여러 테이블에 있으면 어디가 채워져 있는지 확인한다