import './style.scss'; import '@/app/styles/stock-common.scss'; import { Metadata } from 'next'; import Link from 'next/link'; import { fetchStockList } from '@/lib/api/stock'; import { StockMarketName } from '@/types/stock'; import { changeDirection, changeSymbol, formatChangeRate, formatKrwCompact, formatNumber, tradingStatusLabel } from '@/lib/utils/stock'; import Pager from './_components/Pager'; export const metadata: Metadata = { title: '종목 — 개미투자', description: '국내 상장 전 종목 목록 — 전일 종가·등락률·시가총액 (KOSPI/KOSDAQ/KONEX)' }; const MARKET_TABS: { value: ''|StockMarketName; label: string }[] = [ { value: '', label: '전체' }, { value: 'KOSPI', label: 'KOSPI' }, { value: 'KOSDAQ', label: 'KOSDAQ' }, { value: 'KONEX', label: 'KONEX' } ]; const PER_PAGE = 30; type Props = { searchParams: Promise<{ market?: string; q?: string; page?: string; }>; }; export default async function StockListPage({ searchParams }: Props) { const query = await searchParams; const market = MARKET_TABS.some(c => c.value === query.market) ? (query.market as ''|StockMarketName) : ''; const q = (query.q ?? '').trim(); const page = Math.max(Number(query.page) || 1, 1); // 백엔드 미기동 시에도 페이지 자체는 렌더 — 테이블 영역만 에러 표시 (request-time fetch) const res = await fetchStockList({ q, market, page, perPage: PER_PAGE }); const data = res.success ? res.data : null; const buildHref = (nextMarket: ''|StockMarketName) => { const params = new URLSearchParams(); if (nextMarket) { params.set('market', nextMarket); } if (q) { params.set('q', q); } const qs = params.toString(); return qs ? `/stock?${qs}` : '/stock'; }; return (

종목

전일 종가 기준 (T+1)
{/* 시장 탭 */} {/* 종목명/코드 검색 (GET — SSR 재조회) */}
{market && }
{!res.success ? (
종목 목록을 불러오지 못했습니다. 잠시 후 다시 시도해 주세요.
) : !data || data.list.length === 0 ? (
{q ? `'${q}' 검색 결과가 없습니다.` : '표시할 종목이 없습니다.'}
) : ( <>

전체 {formatNumber(data.total)}종목

{data.list.map(row => { const direction = changeDirection(row.changeRate); const statusLabel = tradingStatusLabel(row.tradingStatus); return ( ); })}
종목 목록 — 종목명, 현재가(전일 종가), 등락률, 시가총액, 시장
종목명 현재가 (전일종가) 등락률 시가총액 시장
{row.name} {row.code} {statusLabel && ( {statusLabel} )} {formatNumber(row.closePrice)} {changeSymbol(direction)} {formatChangeRate(row.changeRate)} {formatKrwCompact(row.marketCap)} {row.market}
)}
); }