[STK9-02] ML: in-memory TtlCache 제거

작업 내용 (설계 의도)

ML 서비스를 stateless 순수 계산 서비스로 만든다. Aggregator가 Backend DB를 먼저 확인하고 DB MISS 또는 refresh일 때만 ML을 호출하게 되므로, ML 내부의 in-memory TtlCache는 불필요해진다.

변경 파일: ml/app/main.py

  • signal_cache = TtlCache(settings.signal_cache_ttl) 제거
  • _compute_signal() 함수 제거 — 각 엔드포인트가 build_signal()을 직접 호출
  • recommendations 엔드포인트의 signal_cache.get_or_compute() 래퍼 제거
  • config.pysignal_cache_ttl 필드 제거

다이어그램

처리 흐름

sequenceDiagram
    participant AGG as Aggregator
    participant ML as FastAPI
    participant TC as TossClient
    AGG->>ML: GET /signals/{symbol}
    ML->>TC: get_stock(symbol)
    ML->>ML: fetch_headlines()
    ML->>ML: analyze_headlines_v2() → Claude CLI
    ML->>TC: get_closes(symbol, 20)
    ML-->>AGG: Signal 계산 결과

클래스 의존

flowchart LR
    route["/signals/{symbol}"] --> build_signal
    build_signal --> TossClient
    build_signal --> fetch_headlines
    build_signal --> analyze_headlines_v2

테스트 케이스

  • /signals/{symbol} 호출 시 매번 build_signal()이 실행된다 (캐시 없음)
  • /recommendations 호출 시 12종목 병렬 계산이 실행된다
  • TtlCache 관련 코드가 남아 있지 않다
  • signal_cache_ttl 환경변수 설정 여부와 무관하게 동작한다