증상
목록 조회에 상태 필터가 필수인 API에서, 특정 구간의 레코드가 조회에 아예 안 나온다. 존재하는데 어떤 조합으로도 안 잡힌다.
원인
필터 목록에서 한 상태가 빠져 있었다. 그 상태는 "송장은 입력됐지만 배송 스캔 전"에 해당하는, 짧게 머무는 중간 구간이었다.
★ 더 나쁜 건, 6개월 전에 이 목록을 "전체로 확대"라고 적어뒀다는 것이다. 실제로는 이름이 비슷한 다른 값(NONE)을 넣고 진짜 값(NONE_TRACKING)을 빠뜨렸다. "전체"라고 쓰여 있으니 아무도 다시 대조하지 않았다.
대가
해당 구간의 주문을 이틀간 못 찾았다. 대응이 필요한 건이었다.
해법
NONE_TRACKING은 "추적 없음"처럼 읽히지만 실제로는 "아직 스캔 전" 이다. 이름이 성질을 오도하면 목록에서 빠뜨리기 쉽다★★ 필터가 필수인 목록 API에서, 빠뜨린 값은 곧 존재하지 않는 레코드다.
"없다"고 결론 내리기 전에 필터부터 의심한다.
곁가지 — 반대편도 막힌다
그 구간의 레코드는 조회에 안 보이지만 이미 처리가 끝나 있을 수 있다. 안 보인다고 미처리로 단정하고 다시 쓰기를 시도하면 INVALID_STATUS로 거부된다. 보이지 않는 것과 처리되지 않은 것은 다르다.
필터가 필수인 목록은 그 파라미터의 값 공간만큼만 보인다
상태 필터가 필수인 목록 API에서는 열거하지 못한 값의 구간이 영영 안 보인다. 전수를 봐야 하면 목록을 고치는 게 아니라 필터가 필요 없는 단건 경로를 찾는다. 단건 경로는 상태와 무관하게 조회됐고, 목록에 없던 필드까지 돌려줬다.
★ 같은 조각으로 이뤄진 두 경로가 다른 리소스다. /{상위}/{id}/하위와 /{상위}/하위/{id}는 순서만 다른데, 하나는 주문 ID를 받고 다른 하나는 다른 종류의 ID를 기대해 400을 냈다. 경로 조각의 순서도 식별자다.