"가격은 세상에 대한 사실이 아니야. 어느 source 가 어느 순간에 뭐라고 했는지에 대한 사실이지. 그렇게 저장해."
시장 데이터는 observation 데이터야
주가를 그냥 숫자 하나로, '그 가격' 으로 생각하고 싶어지지. 근데 세상 어딘가에 읽히길 기다리는 '그' 가격 같은 건 없어. 있는 건 특정 provider 가 특정 거래일에 대해 특정 시각에 보고한 값뿐이야. Keep 는 그 겸손을 데이터 모양에 그대로 새겼어. 모든 quote 와 FX row 는 observation 이고, 값 옆에 네 가지가 따라붙어. 적용되는 market date, 가져온 fetch 시각, 알려준 source, 그리고 사용된 provider ticker. 숫자가 맨몸으로 저장되는 일은 없어.
메타데이터가 선택사항이 아닌 이유
provenance 조각 하나하나가 언젠가 반드시 나올 질문에 대비하는 거야.
- market date — 이거 오늘 종가야? 아니면 연휴로 시장이 닫혀 있어서 지난 금요일 값이야?
- fetch 시각 — 이 observation 은 지금 얼마나 묵었어? 5초 전에 가져온 거야, 5시간 전 거야?
- source — primary 한테서 온 값이야, 확인 거친 fallback 한테서 온 값이야? 둘은 미묘하게 다를 수 있고, 어느 쪽을 보고 있는지는 알아야지.
- provider ticker — 그 provider 의 어떤 심볼로 얻은 값이야? ticker 표기법은 source 마다 다르고, 여기서 어긋나면 아주 미묘한 부류의 버그가 태어나.
이 중 하나라도 떼어 내면 값은 더 믿음직해 보이면서 실제로는 덜 믿을 만해져.
provenance 는 데이터의 일부지, 곁다리 장식이 아니야. 출처도 날짜도 나이도 댈 수 없는 값은 추론에 쓸 수 없는 값이야. 메타데이터는 디버깅하다 필요하면 붙이는 부속이 아니라, 맨숫자를 조심스러운 사람이 믿어도 되는 무언가로 바꿔 주는 본체야.
이 습관이 사 오는 차분함
이건 북극성 얘기로 곧장 이어져. 모든 숫자가 제 provenance 를 달고 다니니, Keep 는 낡은 값을 신선한 척 꾸미거나 출처를 얼버무릴 필요가 없어. 그냥 보여주면 돼. "이 가격, 이 source, 이 날짜 기준, 40분 경과." 이 정직함이 화면을 차분하게 지켜 줘. 알고 보니 낡았던 자신만만한 숫자에 뒤통수 맞을 일이 없으니, 도구 전체를 의심하게 되는 그 불쾌한 학습도 일어나지 않아.
아키텍처 전체가 같은 모양이야. provenance 달린 observation 은 이미 본 패턴의 시장 데이터 버전이야. 현금은 source 태그와 함께 저장되고, fallback 은 스스로 자백하고, 이력은 날짜를 달고 append-only 로 쌓여. Keep 는 자리만 바꿔 가며 같은 말을 반복하고 있는 거야. 값과 그 값의 출처 이야기는 언제나 함께 다닌다.