Skip to content
isdnetworks
Go back

이미 빠진 것의 이중 차감

(수정됨)

수집한 마켓 데이터에 seller_discount 필드가 새로 생겼고 그것을 price 에서 빼서 실제 판매가를 만들자는 제안이 나왔다. 필드 이름만 보면 맞는 식처럼 보였지만 넣기 전에 확인하기로 했다.

Table of contents

Open Table of contents

검증 — 이미 쓰고 있는 값과의 대조

우리 channel_products 에는 마켓 가격을 담는 channel_price 와 그것이 할인가인지 표시하는 is_discounted 가 이미 있었다. 수집 응답의 price 와 우리 값을 나란히 놓고 몇 건을 비교했다.

세 건 모두 정확히 일치했고 is_discounted 도 1 로 서 있었다. 즉 응답의 price 는 이미 할인이 반영된 값이었고 seller_discount 는 뺄 금액이 아니라 프로모션 정보를 알려 주는 별도 레이어였다.

주의 — 오류 없이 금액만 틀리는 결과

제안된 식을 그대로 넣었으면 이미 반영된 할인을 한 번 더 빼는 이중 차감이 된다. 어디서도 예외가 나지 않고 계산 결과만 조용히 낮아진다.

적용 대상이 수십만 건 규모였고 가격이 틀리면 정산이 틀리며 정산이 틀리면 돈 문제가 된다. 두 가지 방법이 있었는데 제안대로 price - seller_discount 를 넣는 것과 channel_price 는 손대지 않고 seller_discount 를 별도 컬럼으로만 저장하는 것이다. 뒤쪽을 골랐다. 이유는 세 건 대조에서 price 가 이미 할인가와 일치해서다. 대신 새 필드를 받고도 화면에 아무것도 달라지지 않아 제안한 쪽에 왜 안 쓰는지를 따로 설명해야 하는 것을 감수했다.

판단 기준 — 표본 크기를 정하는 기준

세 건으로 판단해도 되느냐는 물음이 남는데 이 경우에는 충분했다. 확인하려는 것이 이미 반영됐는가라는 이분법이기 때문이다.

이미 반영됐으면 응답 값이 우리 channel_price 와 같고 아니면 list_price 와 같아지므로 세 건이 모두 전자면 후자 가설은 서기 어렵다. 숫자를 확정하는 조사와 가설 둘 중 하나를 고르는 조사는 필요한 표본이 다르다.

백필 스크립트가 안 닿는 채널

별개로 기존 데이터에 새 필드를 채우려면 백필이 필요해 backfill:channel-fields 의 지원 채널 목록을 봤는데 이번 채널이 없었다. 스크립트가 ExtractorFactory::byName() 으로 추출기를 찾는 경로만 쓰고 이 채널은 다른 방식으로 붙어 있어 대상에서 빠진다.

즉 스크립트를 확장하지 않으면 백필이 되지 않는 상태였다. 확장을 검토하기 전에 그 작업이 정말 필요한지부터 확인하기로 했다.

결론 — 재수집 주기가 없앤 작업

config/collect.php 를 보니 이 채널의 recollect_interval 이 하루였다. 기존 데이터도 하루 안에 새 필드가 채워지므로 자연 재수집으로 해결되는 상황이었다.

주기적으로 갱신되는 데이터는 백필 자체가 불필요할 수 있으므로 주기부터 확인하는 것이 순서다. 스크립트를 확장했다면 결과가 같은 작업에 시간을 쓴 셈이 된다.

정리


Share this post on:

Previous Post
세 번 따로 적힌 같은 함정
Next Post
버그로 보이는 조용한 무시