시장 · 종목 API ↔ 테이블 ↔ Port

1주차 MVP · 왼쪽은 테이블을 읽는 엔드포인트, 오른쪽은 테이블을 채우는 외부 Port

API (읽기)테이블Port (수집·쓰기)
GET /market/status GET /exchange-rates/latest GET /stocks/rankings GET /stocks/search GET /stocks/{symbol} GET /stocks/{symbol}/candles exchange_rate base_currency · quote_currency mid_rate · rate · rate_at stock symbol · name · english_name market · market_country · currency isin_code · stock_category · leverage_factor is_dividend · shares_outstanding · list_date is_suspended · is_liquidation · is_warned is_ranked · rank_no · trading_amount 커서 = (trading_amount, stock_id) stock_category 는 자체 분류 (Port 아님) quote_snapshot last_price · quote_at · currency prev_close · upper_limit · lower_limit prev_close ← daily_candle.close_price 복사 daily_candle — interval=1d trade_date · volume open / high / low / close_price minute_candle — interval=1m candle_at · volume open / high / low / close_price MarketCalendarPort fetchExchangeRate() → rate · mid_rate · rate_at fetchKr / fetchUsMarketCalendar() → 테이블 없음 · /market/status 직접 응답 SymbolInfoPort fetchAllStocks() · fetchStocks() → symbol · name · english_name currency · isin_code · list_date is_suspended · is_liquidation … fetchStockWarnings() → is_warned RankingPort fetchRanking() → is_ranked · rank_no · trading_amount → prev_close (신규 편입 basePrice) MarketDataPort fetchPrices() → last_price · quote_at · currency fetchCandles() → open/high/low/close_price · volume
실선 — API가 읽는 테이블    점선 — Port가 채우는 컬럼
Port 없는 컬럼upper_limit · lower_limit 는 Toss /price-limits 담당인데 현재 Port에 메서드가 없습니다. stock_categorysecurity_type + is_common_share 로 우리가 분류합니다.
파생 필드 (DB·Port 모두 없음, Service 계산) — changeAmount · changeRate · marketCap · realtime · tradable