category_mappings에 행이 없어서 연동이 실패하는 상품들이 있었고 매핑을 INSERT하기만 하면 풀리는 것으로 보였다. 그런데 대상을 하나씩 살펴보니 어떤 것은 넣고 어떤 것은 안 넣는 편이 맞았다.
Table of contents
Open Table of contents
추가와 변경의 구분
먼저 대상을 두 종류로 갈랐는데, 그 category_id에 매핑이 아예 없어서 새로 INSERT하는 것이 추가이고 매핑이 이미 있는데 market_category_id를 다른 것으로 UPDATE하는 것이 변경이다.
둘 다 같은 매핑 작업으로 보이지만 위험도가 전혀 다르고, 이 구분을 먼저 해 두지 않으면 둘을 한 .sql 배치로 묶어 실행하게 된다.
원인 — 변경이 위험한 이유
기존 매핑을 바꾸면 그 매핑으로 이미 연동된 상품들이 다음 갱신 때 새 market_category_id로 전송된다. 즉 이미 잘 팔리고 있는 상품의 마켓 쪽 분류가 바뀐다.
마켓에 따라 오류가 날 수도 있고 오류 없이 그냥 바뀔 수도 있는데 후자가 더 나쁘다. 아무도 모르는 사이에 옮겨지므로 발견이 그만큼 늦어진다. 두 가지 방법이 있었는데 추가와 변경을 한 배치에 묶는 것과 추가만 먼저 넣는 것이다. 뒤쪽을 골랐다. 이유는 변경은 이미 연동된 상품 영향을 별도로 검토하기 전에는 손댈 수 없어서다. 대신 변경 대상 상품의 연동 실패가 그 검토 때까지 남는 것을 감수했다.
판단 기준 — 포괄 분류의 판정
추가 자체는 안전하지만 그렇게 넣는 매핑이 유효한지는 별개 문제였다. 우리 카테고리 중에 name이 기타로 시작하는 형태가 있어서 잡다한 것을 한데 담고 있었다.
이런 것을 마켓의 어느 카테고리에 붙일지가 판단이 필요한 지점이었다. 기준은 상대 쪽에도 그만큼 포괄적인 카테고리가 있는지로 잡았고 있으면 매핑이 가능하며 없으면 부적합으로 뒀다.
검증 — 네 건의 대조 결과
기준을 세우고 나서 네 건을 마켓 트리와 실제로 대조했다. 넥워머 쪽은 우리 카테고리에 넥워머와 바라클라바와 마스크와 스카프가 섞여 있는데 마켓의 넥워머 카테고리 아래에 그것이 다 들어가서 포괄 범위가 맞았다.
네일아트도 마켓의 네일소품이 잡다한 용품을 다 포괄해서 가능했다. 기타 자동차 관리는 마켓 하위가 세차기와 비상용품과 트렁크와 필터로 세분화돼 있고 범용 항목이 없어서 부적합이었다. 그 상태에서 하나로 매핑하면 나머지 것들이 전부 틀린 데로 간다. 수건 쪽은 마켓에 세면타올만 있는데 우리 것에는 샤워가운과 비치타월도 들어 있어서 포괄이 안 됐다.
한 건과 분류 전체
부적합으로 판정한 두 건에서 판단이 갈리는 지점이 하나 있었다. LEFT JOIN으로 매핑 없는 상품을 뽑아 보면 지금 오류가 나는 상품 한 건씩은 각각 매핑이 되고 그 상품만 놓고 보면 맞는 것처럼 보인다.
그런데 카테고리 전체로는 부적합해서 나중에 샤워가운이 그 카테고리로 들어오면 틀린 데로 간다. 매핑은 카테고리 대 카테고리이므로 지금 걸린 상품 하나로 판정하면 안 된다. 부적합한 두 건은 market_category_id를 NULL로 두어 보류하거나 그 상품의 category_id 자체를 더 정확한 것으로 옮기는 두 경로를 냈고 뒤쪽이 근본적이다.
기준 자체는 정정을 받아 세운 것이다. 처음에는 기타이니 마켓의 아무 기타에나 넣으면 된다고 생각했는데 범용 매핑은 아무 데나 넣는 것이 아니라 포괄 범위가 맞는 것을 찾는 일이라는 지적을 받았다. 대조를 거치지 않으면 기타 대 기타가 전부 맞는 것처럼 보인다.
정리
- 매핑은
INSERT인지UPDATE인지 먼저 가른다 UPDATE는 이미 연동된 상품에 영향을 준다- 오류 없이 조용히 바뀌는 것이 오류가 나는 것보다 나쁘다
- 포괄적 분류의 기준은 상대 쪽에도 그만큼 포괄적인 것이 있는지다
- 지금 걸린 상품 하나로 판정하지 않는다
- 매핑은 분류 대 분류다
- 부적합하면
NULL로 보류하거나category_id자체를 고치는 경로를 택한다 - 대조 없이는 기타 대 기타가 전부 맞아 보인다