[STK8-04] Aggregator: 추천 종목 탭 예측 강화 API

작업 내용 (설계 의도)

기존 GetRecommendationsUseCase를 확장하여 추천 종목 각각에 단기/중기/장기 예측과 매도 추천을 추가한다. 기준가는 lastClose(현재가)이므로 매수가 기준 손익은 포함하지 않는다.

GET /api/v1/recommendations/enhanced?limit=5 — 기존 추천 + 각 종목 예측

ML의 /portfolio-forecast/{symbol}을 추천 종목 수만큼 병렬 호출한다. 캐시(Redis) TTL 정책은 기존 Signal 캐시(30분)와 동일하게 적용한다.

다이어그램

처리 흐름

sequenceDiagram
    participant FE as Frontend
    participant AGG as Aggregator
    participant ML as ML
    FE->>AGG: GET /api/v1/recommendations/enhanced?limit=5
    AGG->>ML: GET /recommendations
    ML-->>AGG: RecommendationResult[5]
    par 병렬 (종목 수만큼)
        AGG->>ML: GET /portfolio-forecast/AAPL
        AGG->>ML: GET /portfolio-forecast/TSLA
        AGG->>ML: GET /portfolio-forecast/...
    end
    AGG-->>FE: EnhancedRecommendationResponse

클래스 의존

flowchart LR
    MlAggregatorApiController --> GetEnhancedRecommendationsUseCase
    GetEnhancedRecommendationsUseCase --> MlDomainService
    MlDomainService --> MlGateway
    MlDomainService --> MlCacheRepository

테스트 케이스

  • 추천 종목 5개 각각에 short/mid/long 예측이 포함된 응답이 반환된다
  • 각 종목의 sell_recommendation.estimated_price가 lastClose 기준으로 계산된다
  • limit=3 요청 시 응답에 3개 종목만 포함된다
  • ML 예측이 일부 종목에서 실패해도 나머지 종목은 정상 반환된다 (부분 성공 허용)
  • 동일 요청 재호출 시 캐시 HIT로 응답한다 (X-Cache: HIT 헤더 확인)