추정해도 되는 것과 안 되는 것 — 모르는 값을 다루는 네 가지 규칙
"모르는 값은 비워 둔다." 저희가 여러 번 적어 온 원칙입니다. 그런데 이 원칙만으로는 실제로 화면을 만들 수 없었습니다.
배송비를 예로 들어 보겠습니다. 어떤 쇼핑몰은 검색 단계에서 배송비를 알려 주고, 어떤 곳은 알려 주지 않습니다. 알려 주지 않는 값을 그냥 비워 두면 실질가 비교가 아예 성립하지 않습니다. 배송비를 더한 값으로 줄을 세우는 게 저희 화면의 핵심인데, 절반이 빈칸이면 그 줄은 아무 의미가 없습니다.
그래서 "비워 두느냐 채우느냐"가 아니라 **"무엇을 어디까지 추정해도 되는가"**를 정해야 했습니다. 지금 쓰고 있는 규칙 네 가지를 적어 둡니다.
규칙 1. 추정하되, 추정이라고 적는다
소스가 배송비를 주지 않은 견적에는 그 쇼핑몰의 공개된 기본 배송 정책으로 값을 채웁니다. "3만 원 이상 무료, 미만은 2,500원" 같은 정책이 공개돼 있으면 그걸 적용합니다.
대신 그 값에는 반드시 딱지가 붙습니다. 화면에 (추정) 이라고 적히고, 마우스를
올리면 "몰 표준 배송정책 기반 추정치예요"라고 나옵니다.
이 딱지가 붙는 값과 붙지 않는 값은 성격이 완전히 다릅니다. 앞의 것은 정책이 바뀌었거나 이 상품만 예외이면 틀릴 수 있는 값이고, 뒤의 것은 판매 페이지에서 실제로 읽은 값입니다. 같은 3,000원이지만 같은 신뢰도가 아닙니다. 그 차이를 화면에서 지우지 않는 것이 첫 번째 규칙입니다.
규칙 2. 실제로 확인한 값을 추정으로 덮지 않는다
상위 견적 10개는 실제 판매 페이지에 들어가 값을 다시 확인합니다(요청당 5초까지 기다립니다). 이렇게 실검증을 통과한 견적은 추정 대상에서 제외됩니다.
당연한 얘기 같지만 코드에서는 실수하기 쉬운 부분입니다. "배송비 채우기"를 전체 목록에 한 번 돌리면 확인한 값까지 정책값으로 덮어씁니다. 그러면 더 정확한 값을 덜 정확한 값으로 바꾸는 일이 조용히 벌어집니다. 화면은 아무 이상 없이 보이고요.
그래서 순서를 못 헷갈리게 규칙으로 못 박았습니다. 실제 값이 있으면 손대지 않는다.
규칙 3. 틀릴 위험이 큰 값은 아예 만들지 않는다
여기서 방향이 반대로 꺾입니다. 배송비는 추정하지만, 단위가격은 추정하지 않습니다.
단위가격은 상품명에서 용량을 읽어 계산합니다. 2kg이나 500ml처럼 적혀 있으면
100g당·100ml당 가격을 뽑을 수 있습니다. 그런데 용량 표기가 없거나 읽을 수 없게 적혀
있으면 — 단가를 만들지 않습니다. 그 칸은 비어 있습니다.
추정할 방법이 없는 건 아닙니다. 비슷한 상품의 평균 용량을 쓰거나, 가격대로 미루어 짐작할 수도 있습니다. 하지만 그렇게 만든 단가는 다른 상품과 나란히 놓이는 순간 순위를 바꿉니다. 100g당 1,410원과 1,562원의 차이로 1등이 정해지는 화면에서, 짐작으로 만든 숫자가 그 자리에 앉으면 안 됩니다.
틀린 단가는 없는 단가보다 나쁩니다.
배송비에도 같은 선이 있습니다. 정책을 아는 쇼핑몰만 추정하고, 모르는 곳은 추정하지 않습니다. "대충 3,000원쯤 하겠지"로 채우면 그 견적의 순위가 근거 없이 움직입니다. 모르는 몰은 "별도 확인"으로 남겨 두는 편이 낫습니다.
두 규칙의 차이는 이렇게 갈립니다.
| 배송비 | 단위가격 | |
|---|---|---|
| 근거 | 몰이 공개한 배송 정책 | 상품명의 용량 표기 |
| 없을 때 | 정책이 있으면 추정 · 표시 | 만들지 않음 |
| 틀렸을 때 영향 | 실질가가 몇천 원 어긋남 | 순위 자체가 뒤집힘 |
| 사용자가 검증 | 결제 화면에서 바로 확인 | 확인하려면 직접 계산 |
기준은 **"틀렸을 때 사용자가 알아챌 수 있는가"**입니다. 배송비 추정이 틀리면 결제 화면에서 바로 드러납니다. 잘못된 단가는 드러나지 않습니다 — 사용자는 이미 그걸 믿고 골랐으니까요.
규칙 4. 모르는 값이 유리한 자리를 차지하게 두지 않는다
이게 가장 늦게 깨달은 규칙입니다.
프로그램에서 "값이 없음"을 다루는 가장 쉬운 방법은 0으로 두는 것입니다. 그런데 가격을 다루는 화면에서 0은 가장 좋은 값입니다. 배송비가 0원이면 무료배송이고, 단가가 0원이면 공짜입니다. 그러니까 모르는 값을 0으로 두면 모르는 것들이 전부 1등 자리에 올라옵니다.
그래서 정렬할 때는 방향을 반대로 잡았습니다.
- 배송비 낮은순 — 배송비 불명인 견적은 맨 뒤로
- 단가 낮은순 — 단가를 못 뽑은 견적은 맨 뒤로
또 하나. 배송비를 확인하지 못한 견적이 확인된 견적을 실질가로 이기려면, 통상 배송비(3,000원) 만큼은 더 싸야 합니다. 모르는 값에 유리한 가정을 주지 않기 위한 장치입니다.
정리하면 모르는 값은 불리하게 둡니다. 정보가 없다는 건 사용자에게 위험이 있다는 뜻이고, 그 위험은 1등 자리보다 목록 아래쪽에 있는 게 맞습니다.
있다고 믿었는데 없던 기능
추정 이야기에 꼭 붙여야 할 실패담이 하나 있습니다.
배송 정책 표에 ssg.com과 SSG라는 줄이 적혀 있었습니다. 그런데 저희는 판매처
이름을 표준화해서 쓰고 있고, 표준화 결과는 SSG닷컴입니다. 조회는 표준화된 이름으로
하니까, 그 두 줄은 한 번도 걸린 적이 없는 죽은 설정이었습니다.
화면에는 아무 오류도 없었습니다. 배송비 추정이 안 되는 몰처럼 보였을 뿐이고, 코드에는 분명히 정책이 적혀 있으니 아무도 의심하지 않았습니다. 가장 무서운 결함은 에러를 내지 않는 결함입니다.
지금은 테스트가 표의 모든 키를 검사합니다. 표준화를 거쳐도 그 이름이 그대로 나오는지 확인하고, 아니면 빌드를 깨뜨립니다. 정직하게 만들려면 원칙만으로는 부족하고, 원칙이 지켜지는지 확인하는 장치가 있어야 했습니다.
못 하는 것도 그대로 둔다
추가 혜택(적립·쿠폰)은 수집이 되는 곳만 보여 줍니다. 카카오 톡딜은 판매 페이지에서 적립금과 쿠폰을 읽을 수 있어서 표시되고, 네이버는 세 겹의 차단(요청 거부·자동화 차단· 로그인 요구)에 막혀 읽지 못합니다.
여기서 선택지가 두 개였습니다. 못 읽는 곳의 혜택을 "일반적인 수준"으로 추정해 채우거나, 혜택 칩을 그냥 비워 두거나. 후자를 택했습니다. 그리고 혜택 수집이 실패해도 검색 결과 자체에는 영향이 없습니다 — 칩만 빠지고 가격과 순위는 그대로입니다.
값의 상태별로 이렇게 다룬다
| 값의 상태 | 처리 | 화면 표기 |
|---|---|---|
| 판매 페이지에서 확인 | 그대로 사용 · 덮지 않음 | 그냥 표시 |
| 소스가 준 값 | 그대로 사용 | 그냥 표시 |
| 없음 + 정책 아는 몰 | 정책으로 추정 | (추정) |
| 없음 + 정책 모르는 몰 | 추정하지 않음 | 별도 확인 · 정렬 맨 뒤 |
| 용량을 못 읽음 | 단가 만들지 않음 | 빈칸 · 정렬 맨 뒤 |
| 판정에서 의심 | 순위·통계 제외 | ⚠️ 확인 필요 |
| 혜택 수집 실패 | 비워 둠 | 칩 없음 (결과 영향 없음) |
정직함은 빈칸이 아니라 구분이다
처음에는 정직함이 곧 빈칸이라고 생각했습니다. 모르면 비우면 된다고요. 만들어 보니 그건 절반이었습니다. 빈칸만 남기면 화면이 아무것도 못 하고, 그러면 사용자는 결국 다른 곳에서 덜 정직한 숫자를 보게 됩니다.
지금 저희가 지키려는 선은 이것입니다. 추정해도 되지만, 추정한 것을 확인한 것처럼 보여 주지 않는다. 그리고 틀릴 위험이 큰 자리에는 아예 숫자를 놓지 않는다.
이건 밥집 가격에서 제보가 없으면 없다고 말하는 것, 검색에서 실패한 소스를 화면에 알리는 것과 같은 줄기입니다. 아는 것과 모르는 것을 구분해서 보여 주면, 사용자가 스스로 판단할 수 있습니다. 구분을 지우면 편해 보이지만, 판단은 불가능해집니다.
배송비가 실질가를 어떻게 바꾸는지는 무료배송의 함정에,
단위가격 계산은 대용량이 항상 싸지 않다에 정리해 두었습니다.
(추정) 딱지는 최저가 검색에서 직접 보실 수 있습니다 — 그 딱지가 붙은
값은 결제 전에 한 번 더 확인해 주세요. 저희가 딱지를 붙인 이유가 그것입니다.