본문 바로가기
n8n, Automation Tool/n8n Project

Sense Stock, D+14

by 그때 그때 끄적 2025. 7. 1.

📅 Sense Stock 개발 일지 (2025-07-01)

n8n 기반 주식 자동화 시스템 Sense Stock 구축 중 진행한 작업들을 정리합니다.

오늘은 S&P500 이미지 해석 데이터를 GPT가 참조할 수 있도록, 이미지 해석 Workflow 작업을 진행했습니다.

 

 

❗ 문제 발생 포인트

처음엔 단순히 사용자의 질문에 따라 이미지를 불러오고 바로 해석하는 흐름으로 설계했었다.
하지만 곧바로 문제에 부딪혔다.

  • 매 질문마다 이미지 로딩 + 해석 = Token 낭비 + 중복 처리
  • 특히 GPT가 참조만 하는데도 매번 LLM 호출 비용이 들고 있었다.

그래서 질문 시마다 이미지 해석을 반복하는 비효율을 줄이기 위해, 해석된 내용을 저장하고

GPT가 해당 내용을 참조하도록 구조를 변경했다.


문제는 휴장일이다. 해석본이 없으면 어떻게 처리하지? 이게 핵심 고민이었다.

 

🔁 전체 워크플로우 흐름 정리

🔧 사용한 스택

  • Google Sheet (해석 결과 저장소)
  • GitHub (S&P500 이미지 저장소)
[MarketData Workflow] (S&P500 이미지 저장, 변경점은 없다)
    └─ 영업일에만 이미지 저장 (휴장일은 skip)

[S&P500 Analysis Workflow] (매일 오전 9시 실행)
    ├─ 오늘 이미지 존재 여부 확인(Github Repo)
    ├─ 이미지가 있으면 → 해석 → Google Sheet에 저장
    └─ 이미지 없으면 → 아무것도 하지 않음

[Main Workflow] (질문 처리)
    ├─ 오늘자 해석 데이터 조회
    ├─ 마지막 영업일 데이터 조회
    └─ GPT에게 전달 → 질문에 참조 가능

S&P500 Analysis Workflow

더보기

Heatmap Image Analysis Output

- 전부다 읽어오진 못 한다....(JSON 방식으로 추출 지침)

- 지금은 단순히 이미지에서 Text를 추출하고 있지만, 추후 프롬프트 고도화를 통해
어떻게 Output을 가져오는지 봐야겠다.

[
    { ""symbol"": ""MSFT"", ""change"": ""+0.30%"" },
    { ""symbol"": ""AAPL"", ""change"": ""+2.03%"" },
    { ""symbol"": ""AMZN"", ""change"": ""-1.75%"" },
    { ""symbol"": ""TSLA"", ""change"": ""-1.84%"" },
    { ""symbol"": ""NVDA"", ""change"": ""+0.15%"" },
    { ""symbol"": ""AVGO"", ""change"": ""+2.34%"" },
    { ""symbol"": ""CRM"", ""change"": ""-0.27%"" },
    { ""symbol"": ""UBER"", ""change"": ""+1.93%"" },
    { ""symbol"": ""ADBE"", ""change"": ""-0.27%"" },
    { ""symbol"": ""IBM"", ""change"": ""+1.75%"" },
    { ""symbol"": ""GOOGL"", ""change"": ""-1.29%"" },
    { ""symbol"": ""META"", ""change"": ""+0.61%"" },
    { ""symbol"": ""NFLX"", ""change"": ""+1.21%"" },
    { ""symbol"": ""VZ"", ""change"": ""+2.27%"" },
    { ""symbol"": ""T"", ""change"": ""+1.36%"" },
    { ""symbol"": ""LLY"", ""change"": ""+0.53%"" },
    { ""symbol"": ""JNJ"", ""change"": ""+1.21%"" },
    { ""symbol"": ""SPGI"", ""change"": ""+1.85%"" },
    { ""symbol"": ""GS"", ""change"": ""+2.45%"" },
    { ""symbol"": ""XOM"", ""change"": ""-1.45%"" },
    { ""symbol"": ""CVX"", ""change"": ""-0.42%"" }
]

진행 중 고민한 점

가장 애매했던 건 "이미지 해석 결과를 어디서 GPT가 참조하게 할 것인가"였다.
처음엔 GPT의 tool 포트에 Google Sheet 노드를 그냥 연결하면 참조할 줄 알았는데, Tool 포트는 MCP Tool만 인식한다는 걸 알게 됐다.

→ 그래서 결국 text 데이터를 System Prompt로 직접 전달하는 방식
GPT가 필요한 경우 MCP Tool로 직접 호출하는 방식 둘 중 하나로 갈 수밖에 없었다.

지금은 일단 단순하게 Google Sheet 노드를 붙여서 Prompt에 해당 Text를 넣는 방식으로 처리했다.
추후에는 read_today_summary MCP Tool을 만들어 GPT가 직접 불러오게 개선할 수도 있을 것 같다.

Main Workflow에 Google Sheet 노드 추가



🚨진행중 오류들

🔹 <GitHub 연동 문제>

문제 상황

  • n8n에서 기존에 잘 연동되던 GitHub 노드가 갑자기 403 Forbidden 오류 발생
  • GitHub API 호출 실패 → 연동 불가

🔍 원인 분석

  1. 토큰 만료
    • GitHub Personal Access Token(PAT)이 만료
    • 또는 조직 정책 변경으로 인해 무효화되었을 가능성 있음
    • 해결: GitHub → Settings > Developer Settings > PAT 발급 → 토큰 연장 → Regenerate Token
      더보기

      토큰 생성 시 No Expire 옵션은 왜 안 되는가?

      • 최근 GitHub는 보안 강화를 위해 일부 조직 또는 OAuth App에서 무기한 토큰 허용을 제한
      • 만료 옵션이 보이지 않는 경우:
        → 조직 정책상 필수 만료 설정 / 권한 낮은 계정 / Fine-grained token 사용 가능성 확인 필요

      그렇다 나는 Fine-grained token 사용중이다. 두 가지 선택 항목이 있다.

      Classic Personal Access Token(PAT) / Fine-grained token PAT

       

      이렇게 나눠진 이유는 "보안성과 제어력 향상"

      GitHub은 조직 보안 강화를 위해 “필요한 만큼만 권한 주자”는 흐름(= Fine-grained )으로 전환 중

      항목 Classic PAT Fine-grained PAT
      🔐 보안 수준 낮음 (전역 권한) 높음 (세부 권한)
      🎯 범위 지정 없음 저장소 단위로 선택 가능
      ✏️ 접근 권한 전체 읽기/쓰기 read, write 개별 지정
      ⏰ 만료 기간 선택 (No Expire 가능) 필수 설정 (No Expire 불가)
      👥 조직 승인 자동 조직별 승인 필요 가능

      🔧 n8n에서는 어떤 걸 써야 할까?

      상황 추천 토큰 종류
      개인 프로젝트, 빠른 자동화 Classic PAT (No Expire, 전체 권한 편함)
      조직 협업, 보안 필수 Fine-grained PAT (보안·추적 용이)
       
  2. API 호출 제한 초과 (Rate Limit)
    • GitHub API는 기본적으로 시간당 5,000건 제한
    • 초과 시 403 Forbidden 발생

➕ 확인 방법 (터미널)

curl -H "Authorization: token <YOUR_TOKEN>" https://api.github.com/rate_limit

## 응답 예시
{
  "rate": {
    "limit": 5000,
    "used": 5000,
    "remaining": 0,
    "reset": 1751336090
  }
}

remaining: 0이면 API 호출 불가 상태 → reset 시간 이후 자동 복구

🧩 추가 개선 필요

Rate Limit 사전 감지 흐름 추가(현재 쓰고 있는 Token이라면...)

  • GitHub → Code 노드 → /rate_limit → IF 노드 → 처리 분기

403 발생 시 자동 슬랙 알림 발송

  • IF 노드 → "statusCode == 403" → Slack 노드로 알림 전송

 

🔹 <Google Sheet 연동 Error>

  • 갑자기 Google Sheet 연동 실패(n8n)
  • OAuth2 인증 URL 누락이 원인
  • n8n의 Google OAuth2 Credential 설정에서 아래 값을 직접 입력함으로써 정상 작동
Authorization URL: https://accounts.google.com/o/oauth2/v2/auth  
Access Token URL: https://oauth2.googleapis.com/token

 

❓ 다음 단계에서 고민 중인 것들

  • 이미지 분석 지침 프롬프트 재작성 필요
    S&P500 Heatmap이라는 제한된 케이스에 맞춰서 설계된 지금의 지침은 범용성이 떨어짐
    → 시각 자료를 받아서 어떤 정보(섹터/티커별 등)를 추출해야 할지 명확히 지시하는 프롬프트로 재구성해야 함
  • 참조 데이터 확장
    현재 이미지는 분석이 되긴 하지만, 실제 의사결정에 참조할 만큼 충분한 정보는 아님
    → 이미지 + 실시간 뉴스 + 정책/금리/환율 등으로 다층적인 참조 구조를 만들 필요가 있음
  • 사용자 입력 기반 분석 기능 (URL / 텍스트 / PDF 업로드)
    • 질문 기반 분석 외에, 사용자가 정보를 제공하는 흐름도 실험 중이다.고민 중인 입력 타입
      • 📎 URL: Firecrawl이나 Puppeteer로 콘텐츠 요약 후 분석
      • 📝 텍스트 입력: 사용자가 복사한 뉴스 전문 등
      • 📄 PDF 업로드: PDF → 텍스트 변환 → RAG 적용 가능성 검토 중
       이 흐름이 정착되면 단순한 응답형 챗봇이 아니라,
      "사용자 맞춤형 투자 분석 비서"로 역할 확장이 가능해진다.
    • 단순히 "이 종목 어때요?"가 아니라, 사용자 스스로 리포트나 기사 링크를 붙이는 방식.

'n8n, Automation Tool > n8n Project' 카테고리의 다른 글

Sense Stock, D+15  (0) 2025.07.07
Sense Stock 개발 회고, 두 번째  (1) 2025.07.04
Sense Stock, D+13  (0) 2025.06.30
Sense Stock, D+12  (0) 2025.06.27
Sense Stock, D+11  (1) 2025.06.26

댓글