[STK1-07] watchlist + stock

작업 내용 (설계 의도)

변경 사항

  • WatchlistItem·WatchlistDomainService·API(추가 멱등·조회·삭제).
  • Stock 검색(GET /api/v1/stocks/search?q=, Top 20).
  • Phase 2·3 시그널·추천이 재사용할 관심종목 기반.
  • 관심종목 추가는 동일 symbol에 대해 멱등하게 동작 (upsert 의미).

의존

  • 선행: STK1-01
  • 후행: 없음 (Phase 2·3에서 활용)

다이어그램

처리 흐름

sequenceDiagram
    participant Client
    participant CTL as WatchlistApiController
    participant UC as AddWatchlistUseCase
    participant DS as WatchlistDomainService
    participant Repo as WatchlistRepository

    Client->>CTL: POST /api/v1/watchlist
    CTL->>UC: execute(command)
    UC->>DS: addItem(symbol)
    DS->>Repo: findBySymbol(symbol)
    alt 이미 존재
        Repo-->>DS: WatchlistItem
        DS-->>UC: 기존 항목 반환 (멱등)
    else 신규
        DS->>Repo: save(new WatchlistItem)
        Repo-->>DS: WatchlistItem
    end
    UC-->>CTL: WatchlistResponse
    CTL-->>Client: 200 OK

클래스 의존

flowchart LR
    subgraph Presentation["presentation"]
        WCTL[WatchlistApiController]
        SCTL[StockApiController]
    end
    subgraph Application["application"]
        AUC[AddWatchlistUseCase]
        GUC[GetWatchlistUseCase]
        RUC[RemoveWatchlistUseCase]
        SUC[SearchStockUseCase]
    end
    subgraph Domain["domain"]
        WDS[WatchlistDomainService]
        SDS[StockDomainService]
        WI[WatchlistItem]
        ST[Stock]
    end
    WCTL --> AUC
    WCTL --> GUC
    WCTL --> RUC
    SCTL --> SUC
    AUC --> WDS
    GUC --> WDS
    RUC --> WDS
    SUC --> SDS
    WDS --> WI
    SDS --> ST

테스트 케이스

  • 신규 symbol을 추가하면 watchlist에 저장되고 200을 반환한다.
  • 동일 symbol을 중복 추가해도 예외 없이 기존 항목을 반환한다(멱등).
  • DELETE /api/v1/watchlist/{symbol} 등록된 symbol이면 삭제 후 204를 반환한다.
  • DELETE /api/v1/watchlist/{symbol} 미등록 symbol이면 404를 반환한다.
  • GET /api/v1/stocks/search?q=삼성 검색 시 이름에 “삼성”을 포함하는 종목 최대 20개를 반환한다.
  • q 파라미터가 2자 미만이면 400을 반환한다.