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' 노드에서 두 데이터를 합치려 했다.
Fail Workflow
문제점 분석
순차 실행 보장 불가
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 {} # 빈 딕셔너리를 반환하고 함수를 종료
실행 순서 문제를 해결하기 위해 n8n의 핵심 노드 중 하나인 Merge 노드를 도입했다.
개선된 설계: 두 개의 병렬 데이터 흐름을 'Matching' 노드에 직접 연결하는 대신, 그 앞에 Merge 노드를 배치했다.
Merge Node -> Matching
동작 원리: Merge 노드는 양쪽 입력(Input 1, Input 2)에 모두 데이터가 도착할 때까지 실행을 대기하는 동기화 포인트 역할을 한다. 양쪽의 데이터 수집이 모두 완료되었을 때 비로소 두 데이터를 합쳐 다음 노드로 전달한다.
But, Input2 가 실행이 되지 않아도(Error 발생하지 않고 멈췄다면) Merge 노드는 그대로 실행된다.(아래 예시 확인)
=> Economic ThisWeek에서 가져오는 데이터가 없더라도, 노드는 Error가 발생되지 않았고, Merge노드는 들어오는 데이터가 없더라도 그냥 무시하고 진행하게 된다. 그래서, 혹시라도 데이터가 안 넘어 올 수 있는 가능성이 있다면 해당 노드에서 아래와 같이 설정해주자.
n8n stops executing the workflow when a node has no output data.
You can change this default behaviour via Settings > "Always Output Data".
결과: 이 방식을 통해 'Matching' 노드는 항상 '주간 실적 데이터'와 'S&P500 리스트'를 모두 가진 상태에서 실행되는 것을 보장받게 되었다. 결과적으로 S&P500 기업들의 실적 데이터(This/Next Week)를 안정적으로 필터링하고 저장할 수 있게 되었다.
🔷 S&P500 This/NextWeek 실적 Data 저장(추가 진행 사항)
1)Weekly 구조 변경 및 Code변경
S&P500 기업 기준으로 실적 Matching 및 Update
Weekly Workflow S&P500 Perf 구조 변경
❓ 다음 단계에서 고민 중인 것들
데이터 수집 및 가공 파이프라인이 어느 정도 안정화되었다. 그동안 진행한 필터링, 정규화, 로직 수정 등의 작업은 모두 AI 에이전트의 '토큰 제한(Token Limit)' 문제를 회피하고, 더 정확한 분석을 위한 양질의 데이터를 제공하기 위함이었다.
이제는 이 모든 노력의 결과를 확인할 차례다.
핵심 기능 검증: 정제된 데이터를 AI 에이전트의 컨텍스트(Context)에 실제로 적용하여, 토큰 제한 문제가 해결되었는지 직접 확인해야 한다. < MCP Workflow:https://cord-ai.tistory.com/243>
분석 품질(Quality) 평가: AI 에이전트가 가공된 데이터를 기반으로 사용자의 질문에 얼마나 정확하고 논리적인 답변을 생성하는지 그 품질을 집중적으로 테스트해야 한다. 데이터는 충분하지만 엉뚱한 분석을 내놓는다면 또 다른 문제를 해결해야 한다.
엣지 케이스(Edge Case) 테스트: 실적 발표 데이터가 없는 날이나 특정 데이터가 누락되었을 때, AI 에이전트가 "데이터가 없습니다"라고 명확히 응답하는지, 혹은 에러를 발생시키는지 등 다양한 예외 상황에 대한 반응을 테스트하고 보완해야 한다.
댓글