"낡은 데이터는 숨길 문제가 아니라 라벨 달 사실이야. 거짓말은 신선한 척하는 쪽이지."
데이터가 낡으면 어떻게 할까
데이터는 나이를 먹어. 아침에 받은 quote 는 오후면 낡고, 지난 금요일 값은 연휴가 끝나면 낡아 있지. high-trigger 앱은 이 낡음을 비상사태로 다뤄. 깜빡이고, 허둥지둥 다시 가져오고, 낡은 숫자를 숨겨 버려. Keep 는 차분한 쪽을 골랐어. 낡은 데이터는 사라지는 대신 라벨을 달고 남는다. 옛 값이 제 나이를 정직하게 밝힌 채 화면에 그대로 있어. "이 날짜 기준, 이만큼 지남" 하고. 그래서 숫자와, 그 숫자를 얼마나 믿어도 되는지를 한눈에 같이 봐. 사라지는 것도 없고, 소리치는 것도 없고, 실제보다 신선한 척하는 것도 없어.
숨기는 쪽이 더 나쁜 이유
같은 낡은 quote 를 두고 앱 두 개를 비교해 보자. 앱 A 는 숨겨. 신선한 값이 올 때까지 spinner 를 돌리지. 근데 provider 가 다운이면? 포트폴리오가 있어야 할 자리의 빈칸을 불안하게 바라보는 수밖에 없어. 앱 B 는 마지막으로 알려진 값을 '4시간 경과' 태그와 함께 보여줘. 정보도 있고 단서도 정확하니 마음이 차분하지. 낡은 값을 숨기는 건 유저를 지켜 주는 게 아니야. 라벨 달린 사실을 불안한 공백으로 바꿔치기할 뿐이지. 정직한 라벨이 숨겨진 진실보다 더 유용하고, 더 차분해.
정책은 안 바꾸는 캐싱
Keep 는 source 를 들볶지 않으려고 provider 데이터를 캐시해. 캐시 유효 시간은 데이터 종류마다 실제로 얼마나 빨리 변하는지에 맞춰 정했어.
- 일일 bar → 하루 (장중엔 안 바뀌니까)
- sparkline 구간 → 한 시간
- fundamentals → 여섯 시간 (원래 느리게 움직여)
- 파생 simulation calibration → 하루
캐싱은 속도만 올리고 정책은 건드리지 않아. 캐시에서 나온 값도 똑같이 정직한 provenance 와 나이를 달고 나와. 그리고 일부러 만든 예외가 하나 있어. simulation run 의 seed 가격은 언제나 run 시점에 새로 resolve 해. 캐시에서 꺼내는 일이 절대 없어. 시나리오의 출발점은 정확하고 재현 가능해야 하거든. 이유는 다음 트랙에서 자세히 봐.