배송정책 화면에는 3,000원인데 마켓 연동 상세에서는 0원으로 나온다는 문의를 받았다. 같은 정책인데 두 화면의 값이 달랐다.
Table of contents
Open Table of contents
공존하던 정책들
먼저 그 업체의 delivery_policies를 전부 뽑으니 셋이었고 channel_id가 갈려 있었다. 하나는 구 채널이고 둘은 신 채널이었다.
이 시스템은 정책을 channel_id로 구분하는데 구 버전과 신 버전의 기본 채널이 다르다. 이 업체는 구 버전에서 이관됐으므로 구 채널 정책이 남아 있고 나중에 신 버전 화면에서 새 정책을 만든 것이었다.
원인 — 상품이 가리키던 것
products.delivery_policy_id가 어느 정책을 가리키는지 조회하니 구 채널 정책이었다. 업체가 새 정책을 만들었지만 상품에 연결하지 않은 상태였다.
이것으로 두 화면의 차이가 설명됐다. 배송정책 화면은 업체가 만든 delivery_policies 목록을 보여 줄 뿐이고 마켓 연동 상세는 상품이 실제로 가리키는 정책을 JOIN으로 읽는다. 연동 상세 쪽이 맞았고 목록 화면은 어느 것이 상품에 연결됐는지를 보여 주지 않는다.
구 정책이 3,500원인데 0원으로 나온 것도 설명이 됐다. 그 정책이 type = 'free'라 fee 필드에 값은 있어도 실제 부과가 0원이었다. 정책 데이터가 이상한 것이 아니라 잘못된 정책을 가리키고 있었다.
판단 기준 — 확인 순서
이 유형의 문의를 받으면 정책 데이터가 아니라 상품의 참조가 가리키는 정책의 채널부터 확인하기로 했다. delivery_policy_id를 보고 그 정책의 channel_id를 보며 구 채널이면 이관 잔존으로 판정한다.
정책 데이터를 아무리 들여다봐도 답이 안 나오는데 문제가 참조에 있기 때문이다. 무엇을 볼지가 틀리면 조사 시간이 얼마든 늘어난다.
검증 — 어긋난 범위
하위 market_products도 함께 확인했더니 각 채널 정책에 올바르게 연결돼 있었다. 상위 하나만 어긋난 것이었다.
하위는 각 채널로 나갈 때 그 채널의 정책을 따로 잡는 흐름을 타는데 상위는 그 흐름 밖에 있었기 때문으로 보인다. 어디까지 어긋났는지를 확인하니 수정 범위가 상위 하나로 좁혀졌다.
조치 — 신규 생성과 참조 갱신
고칠 때 두 가지 방법이 있었는데 기존 정책을 UPDATE로 수정하는 것과 신규로 만들고 참조를 연결하는 것이다. 뒤쪽을 골랐다. 이유는 기존 정책 변경은 그 정책을 쓰는 다른 상품에 영향을 줘서다. 대신 안 쓰는 옛 정책 행이 남는 것을 감수했다.
이번에는 이미 신규 정책이 있으므로 delivery_policy_id만 갱신하면 됐다. 이 건이 보여 주는 패턴은 이관이 데이터는 옮기는데 참조를 안 옮긴다는 것이다. 새 정책이 목록에 있으니 화면상으로는 문제가 안 보이고 참조를 따라가야 어긋난 것이 드러난다.
정리
- 같은 대상의 두 화면이 다른 값을 보이면 각각 무엇을 읽는지 본다
- 목록 화면과 참조를 따라가는 화면은 다른 것을 볼 수 있다
- 이관된 업체의
delivery_policy_id가 옛 정책을 가리키고 있을 수 있다 - 새 정책을 만들어도 연결하지 않으면 안 쓰인다
- 확인은 정책 데이터가 아니라 상품의
delivery_policy_id부터 한다 - 어디까지 어긋났는지 확인하면 수정 범위가 좁아진다
- 기존 정책
UPDATE대신 신규 생성과 참조 갱신이 안전하다 - 이관은 데이터는 옮겨도 참조를 안 옮길 수 있다