shud.log
바이브코딩 기록

페이지를 두 개로 쪼갰다 — 뉴스 요약과 종목 추천을 분리한 이유

2026-05-04stockpick26Next.jsOllama자동화SSG

stockpick26 자동화 파이프라인을 뜯어고쳤다.

기존엔 Ollama가 한 번에 뉴스 요약 + 종목 추천을 같이 생성했다. 문제가 두 가지였다.

  1. 프롬프트가 너무 길어져서 JSON이 중간에 잘리는 경우가 생겼다
  2. 뉴스 요약과 종목 추천은 성격이 달라서 한 페이지에 넣으면 어색했다

그래서 Ollama 호출을 둘로 나누고, 페이지도 분리했다.

구조 변경

이전

stock_report.py
  → Ollama 1회 호출 (뉴스 + 종목 동시)
  → data/reports/YYYY-MM-DD.json
  → /daily/[date] 페이지 하나

이후

stock_report.py
  → Ollama 1차 호출 (뉴스 요약)  → data/news/YYYY-MM-DD.json
  → Ollama 2차 호출 (종목 추천)  → data/reports/YYYY-MM-DD.json
  → /news/[date]   뉴스 요약 페이지
  → /daily/[date]  종목 추천 페이지

뉴스 요약 결과를 2차 프롬프트의 컨텍스트로 넘긴다. 종목 추천이 당일 뉴스를 바탕으로 나오게.

Ollama 호출 두 번

# 1차: 뉴스 요약
news_prompt = build_news_prompt(raw_news)
news_json = call_ollama(news_prompt)
save_json(news_json, NEWS_DIR / f"{date}.json")

# 2차: 종목 추천 (뉴스 요약을 컨텍스트로)
news_summary = json.dumps(news_json, ensure_ascii=False)
picks_prompt = build_picks_prompt(raw_news, news_summary)
picks_json = call_ollama(picks_prompt)
save_json(picks_json, REPORTS_DIR / f"{date}.json")

각각 num_predict=5000을 주고, stream=True로 호출한다. 맥미니 M2에서 두 번 합쳐 15~20분 걸린다.

JSON 구조 분리

뉴스 JSON에는 시장 전반 내용만 담는다.

{
  "date": "2026-04-26",
  "headline": "...",
  "sentiment": "bearish",
  "fear_greed": "공포 지수 38",
  "market_overview": "...",
  "key_themes": [...],
  "kr_headlines": [...],
  "us_headlines": [...],
  "conclusion": "..."
}

종목 JSON에는 픽만 담는다.

{
  "date": "2026-04-26",
  "kr_picks": [
    {"name": "삼성전자", "ticker": "005930", "exchange": "KRX", ...}
  ],
  "us_picks": [
    {"name": "NVIDIA", "ticker": "NVDA", "exchange": "NASDAQ", ...}
  ]
}

페이지 분리

/news/[date]는 뉴스 요약 페이지다. 시장 분위기, 핵심 테마, 국내외 헤드라인, 총평 순서로 보여준다.

/daily/[date]는 종목 추천 페이지다. 뉴스 페이지로 가는 링크가 상단에 있다.

두 페이지 모두 generateStaticParams로 SSG 처리한다.

// app/news/[date]/page.tsx
export async function generateStaticParams() {
  return getAllNewsDates().map(date => ({ date }));
}

새 JSON 파일이 추가될 때마다 Vercel에서 재빌드가 필요하다. git push가 트리거가 된다.

TradingView URL 버그도 잡았다

종목 추천 페이지에서 차트 링크가 틀리는 경우가 있었다.

// 기존 — NYSE 종목도 NASDAQ으로 고정
href={`https://www.tradingview.com/chart/?symbol=NASDAQ:${pick.ticker}`}

// 수정 — exchange 필드 사용
href={`https://www.tradingview.com/chart/?symbol=${pick.exchange || 'NASDAQ'}:${pick.ticker}`}

JPM, XOM 같은 NYSE 종목이 NASDAQ 차트로 연결되던 문제가 사라졌다.


분리하고 나니 각 페이지가 훨씬 깔끔해졌다. 뉴스 요약은 뉴스 요약대로, 종목 추천은 종목 추천대로. Ollama 프롬프트도 짧아져서 JSON 잘림 현상도 없어졌다.

← 목록으로