You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
국내 대장주 종목을 대상으로 실시간 시세를 수집하고, AI가 뉴스를 분석하여 투자자에게 맞춤형 인사이트를 제공하는 모의투자 플랫폼입니다.
🏗️ 시스템 아키텍처
[KIS Websocket] ──(실시간 체결가 push)──> [Spring 시세 클라이언트] ──SET──> [Redis]
│
▼
[네이버 뉴스 API] ──(5분 주기 요약 수집)──> [Spring 스케줄러] ──publish──> [RabbitMQ]
│
┌─────────┘
▼
[RabbitListener Worker]
① OpenAI 감성 분석
② OpenAI 임베딩 생성
③ MySQL news_sentiments 저장
│
▼
[조건 매칭 워커] ── 조건 충족 시 ──┬── WebSocket 알림
└── 모의투자 주문 실행
🛠️ 기술 스택
영역
기술
버전/비고
Backend
Spring Boot
3.5.16 / Java 17
RDBMS
MySQL
9.0+ (VECTOR(1536) 지원)
Cache
Redis
Alpine
Message Queue
RabbitMQ
3-management
Authentication
OAuth 2.0 (Google/Kakao) + JWT
Access + Refresh Token Rotation
Real-time Stock
KIS (한국투자증권) Open API
WebSocket 구독(push) 방식
News
네이버 뉴스 검색 API
요약(description) 기반, 크롤링 없음
AI
OpenAI API
GPT-4o-mini (감성 분석 + 임베딩)
Vector Search
MySQL Native VECTOR(1536)
별도 Vector DB 없음
📦 프로젝트 구조
invest-ai/
├── server/ # Spring Boot 백엔드
│ ├── docs/ # 📚 프로젝트 문서
│ │ ├── clinerules.md # AI Agent 개발 지침서 (v2)
│ │ ├── database.md # DB 테이블 설계 (v3)
│ │ ├── workflow.md # 전체 워크플로우 (v2)
│ │ ├── kisflow.md # KIS API 연동 플로우
│ │ ├── redisflow.md # Redis Key 설계
│ │ └── api.md # API 명세서 (v1)
│ ├── src/main/java/.../
│ │ ├── config/ # RabbitMQ 설정
│ │ ├── domain/ # 도메인별 패키지
│ │ │ ├── asset/ # 자산 (Wallet + Holding)
│ │ │ ├── report/ # 리포트
│ │ │ ├── trade/ # 매매
│ │ │ └── user/ # 회원
│ │ ├── global/ # 공통 유틸
│ │ │ ├── common/ # ApiResponse
│ │ │ └── error/ # 예외 처리
│ │ ├── infra/ # 인프라 연동
│ │ │ ├── config/ # RedisKeys, RedisConfig, WebClientConfig
│ │ │ ├── openai/ # OpenAI 연동
│ │ │ ├── rabbitmq/ # RabbitMQ 연동
│ │ │ └── scheduler/ # 네이버 뉴스 스케줄러
│ │ ├── kis/test/ # KIS 연동 테스트 (main)
│ │ └── resources/
│ │ └── application.yml # 설정 파일
│ └── src/test/java/.../
│ ├── kis/KisApiTest.java # KIS API 통합 테스트
│ └── openai/NewsAiIntegrationTest.java # OpenAI 통합 테스트
├── front/ # 프론트엔드
├── docker-compose.yaml # Docker 환경 (MySQL 9.0 + Redis + RabbitMQ)
└── README.md
docker compose up -d
# MySQL 9.0 (3306) + Redis (6379) + RabbitMQ (5672, 15672)
2. 환경 변수 설정
# .env 파일 생성 (server/.env)
OPENAI_API_KEY=sk-...
KIS_APP_KEY=...
KIS_APP_SECRET=...
NAVER_CLIENT_ID=...
NAVER_CLIENT_SECRET=...
3. 서버 실행
cd server
./gradlew bootRun
4. 테스트 실행
# KIS API 테스트 (토큰 발급 + 현재가 조회)
./gradlew test --tests "com.example.invest_ai.kis.KisApiTest"# OpenAI 감성 분석 테스트
./gradlew test --tests "com.example.invest_ai.openai.NewsAiIntegrationTest"
📋 API 엔드포인트 (v1)
Method
Path
Auth
설명
POST
/api/v1/auth/login
❌
OAuth 로그인 + JWT 발급
POST
/api/v1/auth/refresh
쿠키
Access Token 재발급
POST
/api/v1/auth/logout
✅
로그아웃
GET
/api/v1/assets
✅
지갑+보유종목 종합 조회
POST
/api/v1/assets/orders
✅
수동 매매 주문
GET
/api/v1/assets/histories
✅
매매 이력 조회
POST
/api/v1/conditions
✅
자동 매매 조건 등록
GET
/api/v1/conditions
✅
조건 목록 조회
DELETE
/api/v1/conditions/{id}
✅
조건 삭제
GET
/api/v1/reports/stocks/{code}
✅
최신 리포트 조회
POST
/api/v1/reports/stocks/{code}/refresh
✅
리포트 재생성 요청
WS
/ws
✅
실시간 알림 구독
⚙️ 주요 설계 결정 사항
시세 수집: REST polling ❌ → KIS WebSocket 구독(push) ✅ (API 호출 제한 회피, 저지연)
Vector DB: Chroma/Pinecone ❌ → MySQL VECTOR(1536) ✅ (단일화, 운영 단순화)
뉴스 데이터: 뉴스 본문 크롤링 ❌ → 네이버 API 요약(description) ✅ (IP 차단 리스크 회피)
자산 구조: 단일 user_assets ❌ → Wallet + Holding 분리 ✅ (FK 정합성, 쿼리 단순화)