auto-trade
한국투자증권(KIS) Open API와 Supabase 인증을 연결한 국내주식 트레이딩 대시보드입니다.
사용자는 로그인 후 API 키를 검증하고, 종목 검색/상세/차트/호가/체결/주문 화면을 한 곳에서 사용할 수 있습니다.
1) 핵심 기능
- 인증: Supabase 이메일/소셜 로그인, 비밀번호 재설정, 세션 타임아웃 자동 로그아웃
- KIS 연결: 실전/모의 모드 선택, API 키 검증, 웹소켓 승인키 발급
- 트레이드 화면: 종목 검색, 종목 개요, 캔들 차트, 실시간 호가/체결, 현금 주문
- 종목 검색 인덱스:
korean-stocks.json기반 고속 검색 + 자동 갱신 스크립트
2) 기술 스택
- 프레임워크: Next.js 16 (App Router), React 19, TypeScript
- 상태관리: Zustand
- 서버 상태: TanStack Query (React Query)
- 인증/백엔드: Supabase (
@supabase/ssr,@supabase/supabase-js) - UI: Tailwind CSS v4, Radix UI, Sonner
- 차트:
lightweight-charts
3) 화면/라우트
/: 서비스 랜딩 페이지/login,/signup,/forgot-password,/reset-password: 인증 페이지/dashboard: 로그인 전용(현재 플레이스홀더)/settings: KIS API 키 연결/해제/trade: 실제 트레이딩 대시보드
4) UI 흐름 (중요)
- 인증 흐름: 로그인 UI ->
features/auth/actions.ts-> Supabase Auth -> 세션 쿠키 반영 -> 보호 라우트 접근 허용 - KIS 연결 흐름: 설정 UI ->
/api/kis/validate-> 토큰 발급 성공 확인 ->use-kis-runtime-store에 검증 상태 저장 - 실시간 흐름: 트레이드 UI ->
/api/kis/ws/approval->useKisTradeWebSocket구독 -> 체결/호가 파싱 -> 차트/호가창 반영 - 검색 흐름: 검색 UI ->
/api/kis/domestic/search->korean-stocks.json메모리 검색 -> 결과 목록 반영
5) 빠른 시작
5-1. 요구 사항
- Node.js 20 이상
- npm 10 이상 권장
5-2. 설치
npm install
5-3. 환경변수 설정
.env.example을 복사해서 .env.local을 만듭니다.
cp .env.example .env.local
Windows PowerShell:
Copy-Item .env.example .env.local
필수 값은 아래를 먼저 채우면 됩니다.
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEY
KIS는 .env에 저장하지 않고 /settings 입력 폼에서 직접 입력합니다.
- 앱키/시크릿/계좌번호는 사용자 브라우저에서만 관리
- 서버 API는 로그인 세션 + 요청 헤더로 전달된 키가 있어야 동작
NEXT_PUBLIC_BASE_URL(선택, 배포 도메인 사용 시 권장)
5-4. 로컬 실행
npm run dev
- 개발 서버:
http://localhost:3001 - Turbopack 적용:
package.json의dev스크립트에--turbopack포함
5-5. 점검 명령
npm run lint
npm run build
npm run start
6) 종목 인덱스 동기화
features/trade/data/korean-stocks.json은 수동 편집용 파일이 아닙니다.
KIS 마스터 파일(KOSPI/KOSDAQ)에서 자동 생성합니다.
npm run sync:stocks
검증만 하고 싶으면:
npm run sync:stocks:check
상세 문서: docs/trade-stock-sync.md
7) API 엔드포인트 요약
-
인증/연결
-
POST /api/kis/validate: API 키 검증 -
POST /api/kis/revoke: 토큰 폐기 -
POST /api/kis/ws/approval: 웹소켓 승인키 발급 -
국내주식
-
GET /api/kis/domestic/search?q=...: 종목 검색(로컬 인덱스) -
GET /api/kis/domestic/overview?symbol=...: 종목 개요 -
GET /api/kis/domestic/orderbook?symbol=...: 호가 -
GET /api/kis/domestic/chart?symbol=...&timeframe=...: 차트 -
POST /api/kis/domestic/order-cash: 현금 주문
8) 프로젝트 구조
app/
(home)/ 랜딩
(auth)/ 로그인/회원가입/비밀번호 재설정
(main)/ 로그인 후 화면(dashboard/trade/settings)
api/kis/ KIS 연동 API 라우트
features/
auth/ 인증 UI/액션/상수
settings/ KIS 키 설정 UI + 런타임 스토어
trade/ 검색/차트/호가/주문/웹소켓
lib/kis/ KIS REST/WS 공통 로직
scripts/
sync-korean-stocks.mjs
utils/supabase/ 서버/클라이언트/미들웨어 클라이언트
9) 트러블슈팅
-
KIS 검증 실패
-
입력한 앱키/시크릿, 실전/모의 모드가 맞는지 확인
-
KIS Open API 앱 권한과 IP 허용 설정 확인
-
실시간 체결/호가가 안 들어옴
-
/settings에서 검증 상태가 유지되는지 확인 -
장 구간(장중/동시호가/시간외)에 따라 데이터가 달라질 수 있음
-
브라우저 콘솔 디버그가 필요하면
localStorage.KIS_WS_DEBUG = "1"설정 -
검색 결과가 기대와 다름
-
검색은 KIS 실시간 검색 API가 아니라 로컬 인덱스(
korean-stocks.json) 기반 -
최신 종목 반영이 필요하면
npm run sync:stocks실행
10) 운영 주의사항
- 현재 KIS 입력값과 검증 상태 일부는 브라우저 로컬 스토리지(localStorage, 브라우저 저장소)에 저장됩니다.
- 실전 운영 시에는 민감정보 보관 정책(암호화, 만료, 서버 보관 방식)을 반드시 따로 설계하세요.
- 주문은 계좌번호가 필요합니다. 계좌번호 입력/검증 UX는 운영 환경에 맞게 보완이 필요합니다.