시장 화면에서 가장 위험한 오류는 틀린 숫자만이 아닙니다. 어제는 맞았지만 오늘은 낡은 문장도 충분히 위험합니다. AlgoPick에는 시장 브리핑이 있었고, 브리핑 생성 비용과 운영 안정성 때문에 자동 작성을 멈춰 둔 기간이 있었습니다. 문제는 브리핑이 멈춘 뒤에도 홈 화면이 오래된 판단 문구를 계속 앞세우면 사용자가 그것을 현재 상태로 읽을 수 있다는 점이었습니다.

‘현재 상태’와 ‘해석 글’을 같은 수명으로 취급하면 안 됐습니다

지수 가격은 몇 초, 몇 분 단위로 바뀌지만 분석 글은 작성 시점의 맥락을 담습니다. 둘을 하나의 카드에 묶으면 한쪽이 오래됐을 때 다른 쪽까지 신뢰하기 어려워집니다. 그래서 홈 화면에서 브리핑이 stale 상태이면 과거 글의 판단 문장을 현재 헤드라인으로 재사용하지 않고, KOSPI·KOSDAQ·S&P 500 세 지수의 최신 조회값을 별도로 가져오도록 구조를 나눴습니다.

현재 홈은 지수 스냅샷의 조회 시각과 변동률을 먼저 보여주고, 과거 브리핑은 ‘시장 브리핑 보기’라는 별도 진입점으로 남겨둡니다. 독자는 지금의 숫자와 당시의 해석을 섞지 않고 볼 수 있습니다.

이 과정에서 ‘0%’라는 작은 거짓말도 막았습니다

초기 구현을 검토하면서 한 가지 모서리 케이스를 발견했습니다. 원자료에 변동률도 없고 실제 전일 종가도 없을 때 현재가를 전일 종가처럼 대신 넣으면 계산 결과는 자연스럽게 0%가 됩니다. 화면은 멀쩡해 보이지만 뜻은 완전히 달라집니다. ‘변동 없음’이 아니라 ‘계산할 근거가 없음’이기 때문입니다.

Fail closed전일 종가나 원시 변동률이 없으면 0%를 만들어내지 않습니다. 값 자체는 표시할 수 있어도 변화율은 unknown으로 두거나 감춥니다.

장문 자동화와 현재성 확보를 분리했습니다

장문의 브리핑을 매번 생성하려면 데이터 수집뿐 아니라 작성, 검증, 이미지 생성까지 비용과 실패 지점이 늘어납니다. 반면 홈에서 사용자가 필요한 최소한의 현재성은 세 지수만 정확히 확인해도 확보할 수 있습니다. 그래서 브리핑 작성 파이프라인이 쉬고 있어도 현재 시장 스냅샷은 별도로 동작하게 했습니다.

이 구조는 비용 절감보다 더 중요한 장점이 있었습니다. 생성형 문장이 없더라도 현재 상태를 보여줄 수 있고, 생성 기능을 다시 켜더라도 홈의 사실 데이터가 그 기능에 종속되지 않습니다.

최신성도 하나의 데이터 타입으로 다뤄야 했습니다

이 작업을 하며 얻은 가장 큰 교훈은 ‘데이터 값’뿐 아니라 언제 만들어진 값인지도 데이터라는 점입니다. 숫자 옆의 시각, 브리핑 작성일, 현재 조회인지 보관 자료인지가 UI 안에서 구분돼야 합니다. 특히 금융처럼 시간이 의미를 바꾸는 영역에서는 더 그렇습니다.

AlgoPick은 앞으로도 분석의 양을 늘리는 것보다, 현재 데이터와 해석의 경계를 분명히 하는 쪽을 우선합니다. 과거 글은 기록으로 가치가 있지만 현재 신호인 척하지 않게 만드는 것이 첫 번째 조건입니다.

데이터 연결이 늦을 때도 과거 값을 현재값처럼 재사용하지 않습니다

실시간 지수 연결이 실패하거나 일부 지수만 늦게 도착할 때도 이전 브리핑의 숫자를 끌어와 빈칸을 채우지 않습니다. 일부 데이터가 없으면 그 사실을 그대로 표시하고, 종목 검색처럼 독립적으로 동작할 수 있는 기능은 계속 사용할 수 있게 했습니다. 장애를 숨기기 위해 오래된 값을 재사용하면 UI는 안정적으로 보이지만 데이터의 의미는 더 불안정해지기 때문입니다.

관련 서비스AlgoPick 열기실제 화면 보기 →