[STK2-02] 토스 클라이언트

작업 내용 (설계 의도)

변경 사항

  • toss_client.py — OAuth2 토큰 관리(401 자동 재발급), get_stock·get_closes·get_levels.
  • httpx 기반 동기 호출.

의존

  • 선행: STK2-01
  • 후행: STK2-06

롤백

  • 외부 연동 — 토스 키 환경변수 미설정 시 호출 비활성.

다이어그램

처리 흐름

sequenceDiagram
    participant Caller as signal_service
    participant TC as toss_client
    participant Toss as 토스 API
    Caller->>TC: get_closes(symbol)
    TC->>Toss: GET /candles (Authorization: Bearer <token>)
    alt 401 Unauthorized
        Toss-->>TC: 401
        TC->>Toss: POST /oauth/token (재발급)
        Toss-->>TC: new_token
        TC->>Toss: GET /candles (재시도)
    end
    Toss-->>TC: OHLCV 배열
    TC-->>Caller: closes: list[float]

클래스 의존

flowchart LR
    subgraph Application["Application"]
        signal_service["signal_service.py"]
    end
    subgraph Infra["Infrastructure"]
        toss_client["toss_client.py (TossClient)"]
        httpx["httpx (HTTP 클라이언트)"]
    end
    subgraph Config["Config"]
        config["config.py (TOSS_API_KEY/SECRET)"]
    end
    signal_service --> toss_client
    toss_client --> httpx
    toss_client --> config

테스트 케이스

  • 401 응답 시 토큰을 재발급하고 원래 요청을 재시도한다.
  • 토큰 재발급 후 두 번째 요청도 401이면 예외를 발생시킨다.
  • get_closes 가 반환하는 배열은 최신 순으로 정렬된다.
  • 환경변수 TOSS_API_KEY 미설정 시 클라이언트 초기화에서 오류가 발생한다.
  • get_stock 이 미지원 종목을 요청하면 빈 결과 또는 예외를 반환한다.