[STK2-03] 뉴스 수집 (market·news·headlines)

작업 내용 (설계 의도)

변경 사항

  • market.py: 시장 분류(KOSPI/KOSDAQ/KONEX→KR, 그 외 US)·검색어 분기.
  • news.py: KR=Google News RSS(ko), US=GDELT(폴백 Google en-US).
  • headlines.py: 매체 접미사 제거 dedup·순서 유지·limit(NEWS_LIMIT).

의존

  • 선행: STK2-01
  • 후행: STK2-05

다이어그램

처리 흐름

sequenceDiagram
    participant SS as signal_service
    participant MK as market.py
    participant NW as news.py
    participant HL as headlines.py
    SS->>MK: detect_market(symbol)
    MK-->>SS: market(KR/US), query
    SS->>NW: fetch(query, market)
    alt market == KR
        NW->>NW: Google News RSS (ko)
    else market == US
        NW->>NW: GDELT API
        alt GDELT 실패
            NW->>NW: Google News RSS (en-US) 폴백
        end
    end
    NW-->>SS: raw_headlines[]
    SS->>HL: dedup(raw_headlines, limit)
    HL-->>SS: headlines[]

클래스 의존

flowchart LR
    subgraph Application["Application"]
        signal_service["signal_service.py"]
    end
    subgraph Domain["Domain"]
        market["market.py (detect_market, news_query)"]
        news["news.py (fetch)"]
        headlines["headlines.py (dedup)"]
    end
    subgraph Config["Config"]
        config["config.py (NEWS_LIMIT)"]
    end
    signal_service --> market
    signal_service --> news
    signal_service --> headlines
    news --> market
    headlines --> config

테스트 케이스

  • KOSPI 종목은 시장이 KR로 분류되고 한국어 검색어로 분기된다.
  • 미국 종목은 시장이 US로 분류되고 GDELT API를 우선 호출한다.
  • GDELT 호출이 실패하면 Google News RSS(en-US)로 폴백한다.
  • 동일 제목의 헤드라인이 여러 매체에서 수집되면 첫 번째 항목만 남기고 순서를 유지한다.
  • NEWS_LIMIT을 초과하는 헤드라인은 잘린다.
  • 뉴스 소스가 응답하지 않으면 빈 리스트를 반환한다(예외 미전파).