[2026-07-일지
오늘은 내 AI 투자 비서 프로젝트에서 오랫동안 미뤄왔던 upstream 저장소의 주요 기능인 HTML 리포트 출력과 서빙 시스템을 우리 포크에 포팅하는 데 집중했다. 이와 더불어 사용자가 제보해 준 국내 뉴스 피드 장애와 MCP 서버 크래시 문제도 근본적으로 해결했다.
HTML 리포트 출력 및 PDF 저장 기능 포팅 완료
그동안 우리 버전에서는 uostream에서 추가된 HTML 리포트 저장 및 서빙 관련 코드들이 누락되어 있었다. 이로 인해 리포트 저장 기능이 정상 작동하지 않거나 뷰어 화면에서 showTab 관련 에러가 발생하는 고질적인 문제가 있었는데, 이를 해결하기 위해 총 5단계에 걸친 대대적인 포팅 작업을 진행했다.
우선 백엔드에서 HTML 문서를 서빙하고 PDF로 즉석 변환해 주는 라우터를 구축했다. Playwright 라이브러리를 사용해 HTML을 깨끗한 PDF 파일로 변환하도록 세팅했고, 이어서 사용자가 설정 페이지에서 마크다운과 HTML 포맷 중 원하는 출력 형태를 직접 선택할 수 있도록 옵션을 제공했다.
프론트엔드에서는 동적으로 빌드된 HTML을 격리된 샌드박스에서 서빙하는 전용 뷰어 모듈을 재구성하고, 다운로드 및 PDF 변환 액션 버튼들을 매끄럽게 연결했다. 이 과정에서 우리 포크의 강점인 외부 CDN 스크립트 에러 보존 로직(injectCrossOrigin)도 uostream 공유 모듈에 이식해 정합성을 유지했다.
최종적으로 엔터 3사(하이브, JYP, YG) 비교 분석 리포트를 HTML 형식으로 요청하여 테스트를 거쳤다. 리포트가 깔끔한 차트와 스냅샷 카드를 갖춘 43KB 크기의 HTML 파일로 완벽하게 빌드되는 것을 확인했고, Playwright를 통해 차트가 온전히 포함된 7페이지 분량의 PDF 문서로 무사히 변환되어 저장되는 것을 실증하며 풀스택 라이브 검증을 마쳤다. 배포 환경에서 Playwright의 크로미움 브라우저 설치 커맨드를 필수로 실행해야 한다는 교훈도 얻었다.
국내 뉴스 피드 연동 장애 수정
사용자 로그에서 국내 뉴스 수집이 원활하지 않았던 원인을 집중 분석했다.
먼저 이데일리 RSS 서비스의 경우, 기존에 사용하던 RSS URL 엔드포인트가 공식적으로 폐기되어 이데일리 홈페이지 HTML로 리다이렉트되고 있었다. 이 때문에 프로그램이 XML을 파싱하지 못하고 매번 에러 로그를 도배하고 있었다. 이를 해결하기 위해 50건의 정상 파싱을 확인한 새로운 실시간 주식 뉴스 RSS 피드 주소로 교체했다.
매일경제의 경우는 보안 솔루션인 클라우드플레어(Cloudflare)의 봇 감지 챌린지에 걸려 요청이 차단되는 현상을 발견했다. 매번 새로운 HTTP 클라이언트를 만들어 요청을 보내고 있어 쿠키가 유지되지 않는 데다, 브라우저가 아닌 에이전트 봇 이름으로 요청했던 것이 원인이었다. 향후 브라우저 정보를 모방한 UA 적용과 쿠키 재사용 로직을 도입해 개선할 예정이며, 당장은 HTML 응답이 올 경우 불필요한 파싱 에러 로그가 도배되지 않도록 차단 경고만 가볍게 남기는 가드를 추가해 로그 청결도를 높였다.
MCP 서버 기동 실패 해결 및 마무리
마지막으로 투자 비서의 핵심인 가격, 재무, 매크로 데이터를 다루는 3개의 MCP 서버가 실행 직후 연결이 끊어지던 원인을 추적했다.
원인은 자식 프로세스를 띄울 때 레포지토리의 루트와 소스 경로를 잡지 못해 내부 유틸 모듈을 임포트하지 못하고 크래시가 났던 것이었다. 서버 런치 함수가 자식 프로세스의 PYTHONPATH 환경변수에 프로젝트 루트 디렉토리 경로를 명시적으로 상속해 주도록 수정하여 문제를 해결했다. 덕분에 이제 연결 실패 없이 21개의 서버와 126개의 도구가 완전히 연동되어 대기 상태로 잘 기동된다.
모든 변경 사항은 각각 독립된 기능 브랜치로 분리해 개인 포크 저장소에 푸시를 끝마쳤다. 이제 남은 리포트 공유 링크 생성과 챌린지 완화 로직 등을 순차적으로 검토해 나갈 계획이다.
오늘의 소감
upsteam 저장소의 데이터를 가지고 오는데, 생각보다 많은 시간과 토큰을 소비하고 있어, 여러가지 고민이 많다. 이렇게 머지하고 나면 또 생각하지 못한 부분에서 오류를 일으키는 케이스도 많고..