[STK4-05] 가격 배치 조회 API

작업 내용 (설계 의도)

변경 사항

현재가 REST 스냅샷 API(GET /api/v1/stocks/prices?symbols=)와 SSE 스트리밍 API(GET /api/v1/stocks/prices/stream)를 구현한다. REST 스냅샷은 페이지 마운트 시 SSE 첫 이벤트 전 공백을 채우는 용도다. SSE 엔드포인트는 SseEmitterRegistry에 emitter를 등록하고 연결을 유지한다.

선행: STK4-03

다이어그램

처리 흐름

sequenceDiagram
    participant FE as FE
    participant Ctrl as StockApiController
    participant UC as GetStockPricesUseCase
    participant Cache as StockPriceCacheRepository
    participant Registry as SseEmitterRegistry

    FE->>Ctrl: GET /api/v1/stocks/prices?symbols=005930,035720
    Ctrl->>UC: execute(symbols)
    UC->>Cache: findBySymbols(symbols)
    Cache-->>UC: List<StockPriceCache>
    UC-->>Ctrl: List<StockPriceResponse>
    Ctrl-->>FE: 200 [{symbol, lastPrice, changeRate, updatedAt}]

    FE->>Ctrl: GET /api/v1/stocks/prices/stream
    Ctrl->>Registry: register(emitter)
    Ctrl-->>FE: SseEmitter 연결 수립

클래스 의존

flowchart LR
    StockApiController --> GetStockPricesUseCase
    StockApiController --> SseEmitterRegistry
    GetStockPricesUseCase --> StockDomainService

테스트 케이스

  • GET /api/v1/stocks/prices?symbols=005930 호출 시 캐시 데이터를 반환한다
  • 캐시에 없는 심볼이 포함된 배치 요청 시 해당 심볼은 빈 값으로 처리된다
  • GET /api/v1/stocks/prices/stream 연결 후 스케줄러 실행 시 SSE 이벤트가 수신된다
  • FE가 연결을 끊으면 SseEmitterRegistry에서 emitter가 제거된다
  • SSE 연결이 없는 상태에서 스케줄러 실행 시 오류 없이 동작한다