[STK4-02] 종목 도메인 모델·검색 서비스

작업 내용 (설계 의도)

변경 사항

Stock Entity와 StockDomainService를 구현한다. 검색 로직은 DB 우선 + 토스 API fallback 하이브리드(ADR-3)를 따른다. StockRepository interface를 domain layer에 정의하고, QueryDSL 기반 StockRepositoryImpl을 infrastructure에 구현한다. SearchStocksUseCaseGetStockPricesUseCase도 이 티켓에서 작성한다.

선행: STK4-01

다이어그램

처리 흐름

sequenceDiagram
    participant UC as SearchStocksUseCase
    participant DS as StockDomainService
    participant DB as StockRepository
    participant Toss as TossStockGateway

    UC->>DS: searchStocks(query)
    DS->>DB: findByNameOrSymbolContaining(query)
    alt DB 결과 있음
        DB-->>DS: List<Stock>
    else DB 결과 없음
        DS->>Toss: searchStocks(query)
        Toss-->>DS: List<TossStock>
        DS->>DB: upsertAll(stocks)
    end
    DS-->>UC: List<Stock>

클래스 의존

flowchart LR
    SearchStocksUseCase --> StockDomainService
    StockDomainService --> StockRepository
    StockDomainService --> TossStockGateway
    StockRepositoryImpl -.->|implements| StockRepository
    TossStockGatewayImpl -.->|implements| TossStockGateway

테스트 케이스

  • DB에 결과가 있으면 토스 API를 호출하지 않고 DB 결과를 반환한다
  • DB 결과가 0건이면 토스 API를 호출하고 결과를 DB에 upsert한다
  • 빈 쿼리("")로 검색 시 전체 종목 목록을 반환한다
  • SearchStocksUseCase는 DomainService만 의존하고 Repository를 직접 참조하지 않는다
  • StockRepositoryImpl LIKE 검색이 MySQL Testcontainers에서 정상 동작한다