본문 바로가기
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 적용 가능성 검토 중
       이 흐름이 정착되면 단순한 응답형 챗봇이 아니라,
      "사용자 맞춤형 투자 분석 비서"로 역할 확장이 가능해진다.
    • 단순히 "이 종목 어때요?"가 아니라, 사용자 스스로 리포트나 기사 링크를 붙이는 방식.

'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

댓글