ai-coding-mines목차GitHub

원가가 10~100배 부풀어 한 스토어 상품이 전부 적자로 집계된다

Python · DB

증상

소싱처 카탈로그 API의 price를 그대로 원가로 넣었더니 특정 스토어 상품들이 전부 적자. 마진 검사·재가격·소싱 판정이 한꺼번에 무효가 됐다.

원인

카탈로그 API의 price그 스토어의 표시 통화다. USD가 아니다. 스웨덴 브랜드는 SEK(×133원), 대만 브랜드는 TWD(×44.5원), 일본 브랜드는 JPY(×9.3원). 응답 어디에도 통화가 안 찍혀 있으니 1400.00이 USD 1,400인지 SEK 1,400인지 숫자만으로는 모른다.

내가 한 오판

숫자가 큰 걸 보고 "센트 단위"라고 진단해 한 스토어 65건을 /100 했다가 복구했다. 그 스토어는 정상 USD였다 — 멀쩡한 걸 망가뜨린 것이다.

가설 두 개(센트 단위 / 다른 통화)가 같은 숫자를 만든다. 숫자만 보면 구분이 안 된다.

해법 — 판별 순서

  1. 상품 페이지의 표시가와 API price를 대조한다. 이게 확정 근거다
  2. 브랜드 국적으로 통화를 먼저 추정한다 — 스웨덴이면 SEK부터 의심
  3. 도메인 TLD도 단서지만 단독으로는 부족하다(.com인 유럽 브랜드가 많다)

교정 대상은 두 통화 939건 + JPY 14건이었다.

검증

변환 후 원가/판매가 비율이 스토어 단위로 정상 범위에 드는지 본다. 한 스토어가 통째로 적자거나 통째로 90% 마진이면 통화가 틀린 것이다.

비가역 일괄 변환 전에 판별을 먼저 한다. 값이 있다고 그 값의 단위가 맞는 게 아니다.

★★★ 같은 가정은 엔드포인트마다 따로 깨야 한다

엿새 뒤, 장바구니 견적 엔드포인트에서 같은 함정을 다시 밟았다. 카탈로그의 price는 고쳤지만 배송비 견적 응답도 스토어 표시 통화였다. 대만 스토어가 378을 줬고 그대로 읽으면 $378, 실제로는 $11.72였다.

★★★ 한 곳에서 고친 가정이 다른 곳에는 적용되지 않는다. "스토어 통화는 USD"라는 가정은 금액을 읽는 모든 지점에서 각각 깨야 한다.금액을 받는 호출부를 grep으로 전부 세고, 각각에 통화 확인을 넣어라. 처방이 정해진 것과 모든 호출 지점에 들어간 것은 별개다.

★★ 그리고 단위 오류는 의미로 못 잡고 크기로 잡는다. 378이 어느 통화인지는 값만 봐서 모르지만, "국제배송비 $378"은 불가능하다는 건 안다. 변환이 끼는 모든 경로에 상식 상한을 두고, 넘으면 단위 오독으로 보고 차단한다.