📅 Sense Stock 개발 일지 (2025-08-04)
n8n, 사용자 질의 기반 경제/시장/주식 분석 자동화 파이프라인 구축 중 진행한 작업들을 정리합니다.
오늘은 기존에 구축한 금융 데이터 수집 파이프라인의 안정성을 높이고 기능을 확장하는 과정에서 생긴 문제점 및 해결 과정을 정리했습니다.
🚨 문제 발생
1. 데이터 소스를 investing.com으로 변경하면서 발생한 시간대(Timezone) 불일치 문제
2. n8n 워크플로우 내에서 여러 데이터 흐름을 병합할 때 발생한 실행 순서(Race Condition) 문제
위 문제들을 어떻게 분석하고 해결했는지, 특히 '오늘' 기준 데이터 수집 로직 변경, 예외 처리 코드 추가, 그리고 n8n의 Merge 노드를 활용한 데이터 동기화 과정을 진행했다,
1. 문제 상황 및 분석
1) 시간대 변경으로 인한 데이터 누락
매일 전날의 실적 발표 데이터를 가져오는 로직에서 문제가 발생했다.
- 원인: 데이터 크롤링 대상을 kr.investing.com(한국 시간 기준)에서 investing.com(미국 시간 기준)으로 변경했다.
- 현상: 한국 시간으로 화요일 오전에 워크플로우가 실행되면, '어제'는 월요일이다. 하지만 미국 현지 시간은 아직 일요일이라 실적 발표 데이터가 존재하지 않았다. 결국 워크플로우는 빈 데이터를 가져오거나 에러를 발생시켰다.
2) n8n 워크플로우의 실행 순서 불일치 (🚨 Issue)
주간 실적 발표 데이터와 S&P500 종목 목록을 매칭하여 'S&P500 기업의 주간 실적 발표 목록'을 만드는 기능에서 로직이 정상 동작하지 않았다.
- 초기 설계: 아래 그림처럼, '주간 실적 데이터'를 가져오는 흐름과 'S&P500 리스트'를 가져오는 흐름을 병렬로 구성하고, 마지막에 'Matching' 노드에서 두 데이터를 합치려 했다.
- 문제점 분석
- 순차 실행 보장 불가
- n8n 워크플로우는 기본적으로 트리거에서 시작하여 노드를 순서대로 실행
- 위쪽 라인이 먼저 모두 실행된 후 아래쪽 라인이 실행되거나, 또는 실행 순서가 보장되지 않는다.
- 데이터 접근 시점의 불일치: 'Matching' 노드가 실행되는 시점에, 다른 쪽 라인(예: 주간 실적 데이터)의 데이터 수집이 아직 끝나지 않은 경우가 발생했다. 결국 'Matching' 노드는 한쪽 데이터가 없는 상태에서 실행되어 아무런 결과도 내놓지 못했다.
- 순차 실행 보장 불가
2. 해결 과정 및 구현
1) '오늘' 기준 데이터 수집 및 예외 처리 강화
시간대 문제를 해결하기 위해 데이터 수집 기준과 에러 처리 로직을 수정했다.
- 기준 변경: '어제(yesterday)' 데이터를 가져오던 로직을 '오늘(today)' 데이터를 가져오도록 변경 (timeFrame_today).
- 예외 처리 코드 추가: 데이터가 존재하지 않는 경우(예: 주말, 공휴일)에 대비해 Python과 JavaScript 코드에 각각 try-except와 try-catch 구문을 추가하여 에러로 인해 워크플로우 전체가 멈추는 것을 방지했다.
- 데이터 없음 처리: 만약 '오늘' 데이터가 없으면, 빈 데이터 상태로 Daily 파일을 그대로 덮어씌워 저장한다. 이는 작업이 정상적으로 수행되었음을 기록하는 동시에, 데이터가 없다는 사실을 명확히 하는 역할을 한다.
## Python, Execute Node
from playwright.async_api import TimeoutError
# ✅ 'td.theDay'를 기다리는 부분에 try-except 적용
try:
await page.wait_for_selector("td.theDay", timeout=7000)
except TimeoutError:
# TimeoutError가 발생하면 이 블록이 실행
await browser.close()
return {} # 빈 딕셔너리를 반환하고 함수를 종료
## JavaScript, Code Node
// 데이터 없으면, 예외처리
if (!rawString || typeof rawString !== 'string' || rawString.trim() === '') {
return [];
}
2) Merge 노드를 이용한 데이터 동기화
실행 순서 문제를 해결하기 위해 n8n의 핵심 노드 중 하나인 Merge 노드를 도입했다.
- 개선된 설계: 두 개의 병렬 데이터 흐름을 'Matching' 노드에 직접 연결하는 대신, 그 앞에 Merge 노드를 배치했다.
- 동작 원리: Merge 노드는 양쪽 입력(Input 1, Input 2)에 모두 데이터가 도착할 때까지 실행을 대기하는 동기화 포인트 역할을 한다. 양쪽의 데이터 수집이 모두 완료되었을 때 비로소 두 데이터를 합쳐 다음 노드로 전달한다.
- 결과: 이 방식을 통해 'Matching' 노드는 항상 '주간 실적 데이터'와 'S&P500 리스트'를 모두 가진 상태에서 실행되는 것을 보장받게 되었다. 결과적으로 S&P500 기업들의 실적 데이터(This/Next Week)를 안정적으로 필터링하고 저장할 수 있게 되었다.
🔷 S&P500 This/NextWeek 실적 Data 저장(추가 진행 사항)
1)Weekly 구조 변경 및 Code변경
- S&P500 기업 기준으로 실적 Matching 및 Update
❓ 다음 단계에서 고민 중인 것들
데이터 수집 및 가공 파이프라인이 어느 정도 안정화되었다. 그동안 진행한 필터링, 정규화, 로직 수정 등의 작업은 모두 AI 에이전트의 '토큰 제한(Token Limit)' 문제를 회피하고, 더 정확한 분석을 위한 양질의 데이터를 제공하기 위함이었다.
이제는 이 모든 노력의 결과를 확인할 차례다.
- 핵심 기능 검증: 정제된 데이터를 AI 에이전트의 컨텍스트(Context)에 실제로 적용하여, 토큰 제한 문제가 해결되었는지 직접 확인해야 한다. < MCP Workflow: https://cord-ai.tistory.com/243 >
- 분석 품질(Quality) 평가: AI 에이전트가 가공된 데이터를 기반으로 사용자의 질문에 얼마나 정확하고 논리적인 답변을 생성하는지 그 품질을 집중적으로 테스트해야 한다. 데이터는 충분하지만 엉뚱한 분석을 내놓는다면 또 다른 문제를 해결해야 한다.
- 엣지 케이스(Edge Case) 테스트: 실적 발표 데이터가 없는 날이나 특정 데이터가 누락되었을 때, AI 에이전트가 "데이터가 없습니다"라고 명확히 응답하는지, 혹은 에러를 발생시키는지 등 다양한 예외 상황에 대한 반응을 테스트하고 보완해야 한다.
n8n, 나만의 MCP Server 만들기
지난번에 MCP와 RAG이란 개념에 대해 간단히 정리한 적이 있다. https://cord-ai.tistory.com/189 AI의 똑똑함을 완성하는 두 축 - MCP와 RAG란?1. 한눈에 이해하는 차이점 MCP (Model Context Protocol)RAG (Retrieval-Augment
cord-ai.tistory.com
'Automation Tool > n8n Project' 카테고리의 다른 글
Sense Stock, D+23 (2) | 2025.08.11 |
---|---|
Sense Stock, D+22 (4) | 2025.08.06 |
Sense Stock, D+20 (3) | 2025.07.28 |
Sense Stock, D+19 (2) | 2025.07.22 |
Sense Stock, D+18 (0) | 2025.07.15 |
댓글