ai-coding-mines목차GitHub

허용값 안에서 골랐는데 상품이 망가졌다 — 스키마 통과는 "맞는 값"이 아니다

쓰기 API

증상

필수 속성을 자동으로 채우는 함수가 400 유효하지 않은 옵션 값을 내고 있었다. 원인은 단순했다 — 그 속성은 타입이 "선택형"이라 플랫폼이 카테고리 메타로 내려주는 허용값 목록 안의 값만 받는다. 임의 문자열을 넣으면 거부된다.

그래서 "허용 목록에서 첫 항목을 고른다"로 고쳤다. 400은 사라졌다. 그리고 성인용 신발에 유아 사이즈가 등록됐다.

원인

목록의 첫 항목은 정렬 순서가 정한다. 사이즈 목록의 첫 항목이 가장 작은 값이었다.

★★★ 제약을 만족시키는 것과 의미를 만족시키는 것은 다른 문제인데, 전자만 풀었다.

층위결과
허용 목록 400시끄러운 실패. 즉시 안다
허용 목록 안인데 의미가 틀림통과. 고객 화면에 유아 사이즈가 뜬다

★★★ 두 번째가 더 위험하다. 에러가 없으니 아무도 모르고, 발견되는 경로는 주문과 반품뿐이다. 이 컬렉션의 조용한 실패 계열이고, 검증기를 통과했다는 사실이 오히려 안심의 근거가 된다.

해법

  1. 값 채우기 함수의 최종 안전망 — 허용 목록이 있으면 반드시 그 안에서, 그리고 극단이 아니라 중앙값을 고른다
  2. 전송 전 SELECT 속성 전수 검증 — ★ 필수 여부와 무관하게. 선택 속성도 틀린 값이면 똑같이 고객에게 보인다

★★ 중앙값을 고르는 이유는 "틀려도 덜 틀리기" 위해서다. 첫 항목·마지막 항목은 분포의 극단이라 유아·특대 같은 값이 걸린다. 의미를 모를 때는 극단이 아니라 중앙을 고른다.

⚠️ ★★ 그래도 중앙값은 추측이다. 상품의 실제 사양이 있으면 그것을 쓰고, 없다면 그 속성을 비우는 편이 틀린 값보다 낫지 않은지 먼저 따진다. 필수 속성이면 비울 수 없지만, 필수가 아닌데 습관적으로 채우고 있는 경우가 많다.

★★★ "빈 값을 허용하지 않는다"와 "아무 값이나 채운다" 사이에 선택지가 있다 — 채우기를 포기하고 그 건을 사람에게 넘기는 것. 자동 채우기의 성공률을 지표로 삼으면 이 선택지가 안 보인다.

검증 방법

등록 후 상품 페이지에 실제로 표시되는 값을 한 번 읽어 대조하라. 전송한 값이 아니라 표시된 값이다. 이 함정은 요청/응답 어디에도 흔적을 남기지 않는다.