import './style.scss'; import '@/app/styles/data-table.scss'; import { Metadata } from 'next'; import Link from 'next/link'; import MarketNav from './_components/MarketNav'; import DisclosureList from './_components/DisclosureList'; import { fetchMarketIndices, fetchMarketExchangeRates, fetchMarketInterestRates, fetchDisclosures } from '@/lib/api/market'; import { MARKET_INDEX_SERIES_LABEL } from '@/types/market'; import { changeDirection, changeSymbol } from '@/lib/utils/stock'; import { formatDecimal, formatBpRate, formatRatePercent, tradeDateLabel } from '@/lib/utils/market'; export const metadata: Metadata = { title: '시장 — 개미투자', description: '국내 증시 지수·환율·금리·최근 공시 한눈에 (KOSPI/KOSDAQ/KRX·매매기준율·국제금리)' }; // 개요 미니 위젯 노출 개수 const RATE_MINI_COUNT = 6; const FX_MINI_COUNT = 6; const DISCLOSURE_MINI_COUNT = 12; export default async function MarketOverviewPage() { // 지수·환율·금리·공시 병렬 조회 (전부 익명 · request-time) const [indicesRes, fxRes, ratesRes, disclosuresRes] = await Promise.all([ fetchMarketIndices(), fetchMarketExchangeRates({}), fetchMarketInterestRates({ type: 'International' }), fetchDisclosures({ page: 1 }) ]); const indices = indicesRes.success ? (indicesRes.data?.list ?? []) : []; const fxRows = fxRes.success ? (fxRes.data?.list ?? []) : []; const rateRows = ratesRes.success ? (ratesRes.data?.list ?? []) : []; const disclosures = disclosuresRes.success ? (disclosuresRes.data?.list ?? []) : []; return (

시장

전일 종가 기준 (T+1) · 지수/환율/금리/공시
{/* 지수 요약 카드 */}

주요 지수

{indices.length === 0 ? (

지수 데이터를 준비 중입니다.

) : (
{indices.map(row => { const direction = changeDirection(row.flucRateBp); return (
{MARKET_INDEX_SERIES_LABEL[row.series] ?? row.name} · {row.name} {formatDecimal(row.close)} {formatDecimal(row.changeVal)} ({formatBpRate(row.flucRateBp)})
); })}
)}
{/* 환율 + 금리 미니 위젯 */}

환율

{tradeDateLabel(fxRes.data?.tradeDate)}
{fxRows.length === 0 ? (

환율 데이터를 준비 중입니다.

) : (
{fxRows.slice(0, FX_MINI_COUNT).map(row => (
{row.currencyName} ({row.currencyUnit}) {formatDecimal(row.dealBasRate)}
))}
)}

국제 금리

{tradeDateLabel(ratesRes.data?.tradeDate)}
{rateRows.length === 0 ? (

금리 데이터를 준비 중입니다.

) : (
{rateRows.slice(0, RATE_MINI_COUNT).map((row, index) => (
{row.itemName} {formatRatePercent(row.rate)}
))}
)}
{/* 최근 공시 */}

최근 공시

전체 보기
); }