diff --git a/.env.example b/.env.example index 9a1a0d9..b937669 100644 --- a/.env.example +++ b/.env.example @@ -1,9 +1,23 @@ -# Supabase 환경 설정 예제 파일 -# 이 파일의 이름을 .env.local 로 변경한 뒤, 실제 값을 채워넣으세요. +# Supabase 환경 설정 예제 파일 +# 이 파일을 .env.local로 복사한 뒤 실제 값을 채워 주세요. # 값 확인: https://supabase.com/dashboard/project/_/settings/api NEXT_PUBLIC_SUPABASE_URL= NEXT_PUBLIC_SUPABASE_ANON_KEY= -# 세션 타임아웃 (분 단위) +# 세션 타임아웃(분 단위) NEXT_PUBLIC_SESSION_TIMEOUT_MINUTES=30 + +# KIS 거래 모드: real(실전) | mock(모의) +KIS_TRADING_ENV=real + +# 서버 기본 키를 쓰고 싶은 경우(선택) +KIS_APP_KEY_REAL= +KIS_APP_SECRET_REAL= +KIS_BASE_URL_REAL=https://openapi.koreainvestment.com:9443 +KIS_WS_URL_REAL=ws://ops.koreainvestment.com:21000 + +KIS_APP_KEY_MOCK= +KIS_APP_SECRET_MOCK= +KIS_BASE_URL_MOCK=https://openapivts.koreainvestment.com:29443 +KIS_WS_URL_MOCK=ws://ops.koreainvestment.com:31000 diff --git a/.tmp/open-trading-api b/.tmp/open-trading-api new file mode 160000 index 0000000..aea5e77 --- /dev/null +++ b/.tmp/open-trading-api @@ -0,0 +1 @@ +Subproject commit aea5e779da24bec2ec0c23d3d9fe400d8d5db234 diff --git a/app/(main)/dashboard/page.tsx b/app/(main)/dashboard/page.tsx index 3d5af51..303e605 100644 --- a/app/(main)/dashboard/page.tsx +++ b/app/(main)/dashboard/page.tsx @@ -1,115 +1,25 @@ /** * @file app/(main)/dashboard/page.tsx - * @description 사용자 대시보드 메인 페이지 (보호된 라우트) - * @remarks - * - [레이어] Pages (Server Component) - * - [역할] 사용자 자산 현황, 최근 활동, 통계 요약을 보여줌 - * - [권한] 로그인한 사용자만 접근 가능 (Middleware에 의해 보호됨) + * @description 로그인 사용자 전용 대시보드 페이지(Server Component) */ +import { redirect } from "next/navigation"; import { createClient } from "@/utils/supabase/server"; -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import { Activity, CreditCard, DollarSign, Users } from "lucide-react"; +import { DashboardMain } from "@/features/dashboard/components/dashboard-main"; /** - * 대시보드 페이지 (비동기 서버 컴포넌트) - * @returns Dashboard Grid Layout + * 대시보드 페이지 + * @returns DashboardMain UI + * @see features/dashboard/components/dashboard-main.tsx 클라이언트 상호작용(검색/시세/차트)은 해당 컴포넌트가 담당합니다. */ export default async function DashboardPage() { - // [Step 1] 세션 확인 (Middleware가 1차 방어하지만, 데이터 접근 시 2차 확인) + // 상태 정의: 서버에서 세션을 먼저 확인해 비로그인 접근을 차단합니다. const supabase = await createClient(); - await supabase.auth.getUser(); + const { + data: { user }, + } = await supabase.auth.getUser(); - return ( -
지난달 대비 +20.1%
-지난달 대비 +180.1%
-지난달 대비 +19%
-지난 시간 대비 +201
-- 비트코인 매수 -
-BTC/USDT
-- 이더리움 매도 -
-ETH/USDT
-{label}
+{value}
+{kisStatusError}
: null} + {kisStatusMessage ?{kisStatusMessage}
: null} + ++ 종목명 검색, 현재가, 일자별 차트를 한 화면에서 확인합니다. +
+상단에서 API 키 검증을 완료해야 검색/시세 기능이 동작합니다.
+ ) : searchError ? ( +{searchError}
+ ) : ( ++ {searchResults.length > 0 + ? `검색 결과 ${searchResults.length}개` + : "검색어를 입력하고 엔터를 누르면 종목이 표시됩니다."} +
+ )} + +{overviewError}
+ ) : !isKisVerified ? ( +상단에서 API 키 검증을 완료해 주세요.
+ ) : isLoadingOverview && !selectedStock ? ( +종목 데이터를 불러오는 중입니다...
+ ) : selectedStock ? ( + <> +{formatPrice(selectedStock.currentPrice)}
+ {effectivePriceSourceLabel && selectedOverviewMeta ? ( +{realtimeError}
: null} + > + ) : ( +종목을 선택하면 시세와 차트가 표시됩니다.
+ )} +국내주식 {tradingEnv === "real" ? "실전" : "모의"}투자 API 연결 완료
++ 실시간 체결가 연결 상태:{" "} + {isRealtimeConnected ? "연결됨 (WebSocket)" : "대기 중 (일봉 차트 표시)"} +
+마지막 실시간 수신: {lastRealtimeTickAt ? new Date(lastRealtimeTickAt).toLocaleTimeString("ko-KR") : "수신 전"}
+실시간 틱 수신 수: {realtimeTickCount.toLocaleString("ko-KR")}건
+다음 단계: 주문/리스크 제어 API 연결
+