[STK4-02] 종목 도메인 모델·검색 서비스
작업 내용 (설계 의도)
변경 사항
Stock Entity와 StockDomainService를 구현한다. 검색 로직은 DB 우선 + 토스 API fallback 하이브리드(ADR-3)를 따른다. StockRepository interface를 domain layer에 정의하고, QueryDSL 기반 StockRepositoryImpl을 infrastructure에 구현한다. SearchStocksUseCase와 GetStockPricesUseCase도 이 티켓에서 작성한다.
선행: 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를 직접 참조하지 않는다StockRepositoryImplLIKE 검색이 MySQL Testcontainers에서 정상 동작한다