[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 헤더 확인)