배포·운영 중

한국·미국 금융 자료의 수집·재처리·Telegram 리캡 파이프라인

공시·시세·경제지표 원본을 보존하고 PostgreSQL 원장과 분석 스냅샷을 거쳐 리캡을 만드는 개인 시스템을 구축·배포했습니다. 누락과 잠정 상태를 알림에도 표시합니다.

기간2026 — 운영 중
대상공개 공시·시세·경제지표와 장후 보고서
역할단독 설계·구현·운영
PythonPostgreSQLKafkaDuckDB / ParquetSparkTelegram

작업 요약

원본 보존·버전 원장·재처리 · Parquet·Spark 대조 · Telegram 발송 설정·실제 전달 확인

장마감 요약보다 먼저 자료의 기준을 남기기

한국과 미국의 장마감 자료를 모아 읽으려면 공시, 시세 지표, 경제지표의 기준일과 발행 시각을 맞춰야 했습니다. 최신 피드만 읽으면 과거 공시가 빠질 수 있고, 공급자가 실패했는데 빈 결과로 처리하면 “자료가 없었다”는 잘못된 요약이 나올 수 있습니다.

제가 공개 자료 수집기, 원본 저장소, PostgreSQL 원장, 재처리·대조 명령과 리캡 전달 경로를 구축했습니다. Linux 수집 서버에 배포해 예약 수집·보고서 생성을 운영하고, 원본을 다른 저장 호스트에 복제하도록 연결했습니다. 제 투자 성과를 보여주는 도구가 아닌, 확인 가능한 자료와 공백을 함께 남기는 개인 데이터 시스템입니다.

원본·원장·분석 파일을 나눈 구성

전체 구조를 먼저 보고, 크게 열어 세부 내용을 확인하세요.크게 보기ExcalidrawMermaid
공개 금융 공급자, 수집기, 불변 Bronze, PostgreSQL 원장, Kafka outbox 전달, Parquet와 Spark 검증, 리캡과 Telegram, 별도 호스트 원본 복제의 구성
공개 자료를 파싱 전에 보존하고 PostgreSQL에 버전·체크포인트·outbox를 기록합니다. 같은 스냅샷에서 분석 파일과 리캡을 만들고, 원본 복제와 Kafka 전달은 별도 경로로 처리합니다. Spark는 내보낸 Parquet의 배치 검증에 사용합니다.

Bronze: 실패 응답도 파싱 전에 보존

수신한 바이트는 SHA256 지문으로 불변 저장하고, 파싱 전 원본부터 남깁니다. 다른 호스트에 비동기 복제하며 저장·복제 확인 때 크기와 해시를 대조합니다. 지정한 디스크가 마운트되지 않았을 때 부팅 디스크에 대신 쌓이지 않도록 실행을 거절합니다.

Silver와 Gold: 이력과 현재 상태를 함께 유지

PostgreSQL을 운영 원장으로 사용합니다. 공시 식별자에 따른 중복 제거, 필드별 출처와 관측 시각의 우선순위, 불변 버전과 현재 포인터를 분리했습니다. 시도 이력·체크포인트·소스별 공백도 저장해 데이터가 바뀐 이유와 다시 처리할 범위를 찾을 수 있게 했습니다.

공급자의 최신 목록을 전체 이력으로 오해하지 않기

KIND·DART·SEC EDGAR의 공시와 KRX·Tiingo의 시세 지표, FRED·ECOS의 경제 자료를 공급자별 어댑터로 수집합니다. 인증키 설정 여부와 실제 API 이용 가능 여부는 다르므로 수집 결과에서 접근·승인 상태를 확인합니다. KRX는 배포 당시 인증 오류가 있었고 이후 이용 승인 뒤 실제 수집과 저장을 확인했습니다.

최신 RSS 목록은 과거 전체를 보장하지 않습니다. SEC는 일별 공식 색인과 최근 미대조 날짜를 다시 비교해 늦게 도착한 자료를 보강합니다. KIND 피드의 연속 구간에 겹치는 항목이 없으면 누락 가능성을 남깁니다. 보관 공시 수를 전체 시장 공시 수로 설명하지 않습니다.

공급자 일부가 실패해도 성공한 쪽은 보존하고, 실패한 결과를 정상 완료와 구분해 반환합니다. 아직 발행되지 않은 색인, 인증 실패, 미지원 일정과 정상적인 빈 결과를 다른 상태로 기록했습니다. 오래 남은 대조 대기는 수동 확인이 필요할 수 있습니다.

DB 반영과 이벤트 전달 사이의 실패 다루기

DB에는 반영됐지만 Kafka 전달이 실패하는 경우를 처리하기 위해 트랜잭션 outbox를 사용했습니다. 데이터 변경과 전송할 이벤트를 함께 기록하고, 송신기는 임대 토큰으로 이벤트를 선점한 뒤 브로커의 확인 응답을 받아 DB에 발송 확인을 남깁니다. Kafka가 중단되어도 원장 수집은 계속되고 전송 대기는 남습니다.

브로커 확인 직후 DB 확인 전에 중단되면 같은 이벤트가 다시 전달될 수 있습니다. 소비자는 이벤트 식별자로 중복을 제거해야 하며 단일 브로커 구성을 고가용성으로 설명하지 않습니다.

재처리는 보관된 Bronze 원본을 다시 읽게 했습니다. 이때 HTTP 수집 체크포인트를 앞으로 이동시키지 않아 원본 재해석과 새 자료 수집을 섞지 않습니다. 같은 입력을 반복 실행하면 새 데이터 버전과 outbox가 불필요하게 늘지 않도록 했습니다.

같은 스냅샷으로 보고서를 만들고 다시 대조하기

리캡은 PostgreSQL의 REPEATABLE READ 스냅샷에서 읽습니다. DuckDB로 불변 Parquet와 매니페스트·해시를 먼저 내보내고, 같은 자료를 기준으로 Gold와 Markdown 보고서를 저장합니다. 수집이 진행되는 동안 집계와 상세가 다른 순간을 보지 않도록 묶었습니다.

Spark는 이 Parquet를 다시 읽어 스키마·해시·집계를 확인하는 배치 검증에 사용했습니다. 수집 경로의 필수 상시 프로세스로 배치하지 않았습니다. 실제 배포 자료를 다시 읽는 검증과 별도 DB의 백업 복원·해시 대조를 거쳐 코드 시험과 운영 자료 확인을 나눴습니다.

배포 때는 기존 앱을 보존하고 새 릴리스로 실행 경로를 전환했습니다. 추가 스키마 적용 뒤 기존 테이블 내용이 유지되는지 확인하고, 운영 전후 백업을 별도 저장 호스트에 남겼습니다.

Telegram에서 자료가 없는 이유까지 읽게 하기

저장 보고서가 만들어졌어도 메시지가 전달되었다는 뜻은 아니었습니다. 발송 옵션이 꺼진 예약과 보고서 게시 모듈 오류를 구분해 진단하고, 장후 리캡의 Telegram 발송 예약을 활성화하고 수동 전달 시험을 확인했습니다. 이 근거만으로 예약 시각에 실제 발송이 이루어졌다고 판단하지 않았습니다.

메시지에는 데이터 기준일, 보관 자료와 지표, 인증·미발행·미지원·누락 가능성을 함께 표시합니다. 미국 리캡은 공급자 당일 자료의 확정 시각을 보장하지 않아 잠정 집계로 안내하며, 나중의 보충 수집은 저장 보고서를 갱신합니다. 수동 보고서 재실행은 재발송될 수 있어 Telegram의 영구 중복 방지까지 보장하지 않습니다.

위키 자동 게시기는 모듈 경로 오류로 중지된 상태입니다. 수집·보고서 저장·Telegram 전달·위키 반영·검색 색인 완료를 각각 확인해야 한다는 운영 경계를 남겼습니다.

운영 범위와 남은 설계

공개 자료 수집, 원본·버전 보존, 재처리·대조, 분석 스냅샷과 장후 리캡 경로까지 구축·배포했습니다. 한국 미래 일정, 휴장·조기폐장 달력과 일부 공급자의 대량 과거 이력 복구는 남은 범위입니다. 데이터가 있는 항목과 비어 있는 이유를 함께 보여주는 수준으로 설명하며 확정 종가나 전체 공시의 완전성을 보장하지 않습니다.

여러 AI 모델이 같은 자료를 보고 견해와 반론을 비교하는 토론 흐름은 설계 단계입니다. 장전 종목 선정과 자동 매매를 구현한 것으로 쓰지 않았으며, 수익률이나 투자 판단의 정확도를 성과로 제시하지 않았습니다.