"네가 눈치채지 못하는 사이에 일어나는 fallback 은 안전망이 아니야. 동의한 적 없는 출처 변경이지."
provider 서열은 명시적이야
equity 와 index 쪽에서 Keep 는 primary provider 하나(Polygon 기반의 Massive)와 이름이 정해진 fallback 둘(Yahoo Finance, Stooq)을 둬. 여기서 힘을 쓰는 단어는 '이름이 정해진' 이야. 되는 놈 아무나 쓰는 흐릿한 체인이 아니라, 지정된 primary 가 있고 정확히 누구인지 아는 대체 후보가 있는 거지. 그리고 하나에서 다른 쪽으로 갈아타는 건 절대 자동이 아니야. equity fallback 은 요청 한 건마다 명시적 확인을 요구해. 사람이 "응, 이번 요청은 대체로 가" 라고 말해 줘야 넘어가.
조용한 fallback 체인이 함정인 이유
편하게 짜자면 체인이지. A 를 시도하고, 실패하면 B, 또 실패하면 C, 뭐라도 받으면 반환. 튼튼해 보여. 실제로는 내 데이터의 출처를 놓쳐 버리는 조용한 방법이야. A 가 비실대는 날 앱이 말없이 B 값을 내놓으면, 숫자의 출처가 슬그머니 바뀌어. ticker 표기법이 다르고, 종가 산정 시각이 다르고, 반올림이 달라. 근데 바뀐 줄을 몰라. 그러다 월요일의 Massive 종가를 화요일의 Stooq 종가에 대고 비교하면서 계산이 왜 이상하지, 하고 갸웃하게 되는 거야. 조용한 fallback 은 눈에 보이는 실패를 눈에 안 보이는 불일치와 맞바꿔. 밑지는 장사야.
무인 규칙, 예약된 refresh 는 fallback 을 아예 안 해
이 정책의 가장 날카로운 모서리가 여기야. Keep 는 아무도 안 보는 시간에 일일 refresh 를 돌리는데, 그 job 은 fallback 이 아예 금지야. 왜냐고? fallback 의 요체가 사람이 대체를 확인해 주는 건데, 새벽 6시 31분 무인 시간엔 확인해 줄 사람이 없잖아. 그러니 durable 한 일일 스냅샷에 fallback 출처를 몰래 적어 넣는 대신, 예약 job 은 primary 로 성공하거나 정직하게 실패해. 실패하면 경고로 떠오르고. 확인을 조건으로 거는 fallback 과 무인 운영은 애초에 공존할 수 없으니까, 무인 경로는 fallback 을 통째로 사양하는 거야.