342 lines
16 KiB
Markdown
342 lines
16 KiB
Markdown
|
# I'm AI 투자매니저 시스템 아키텍처 설계서
|
||
|
|
||
|
## 1. 개요
|
||
|
|
||
|
### 1.1 문서 목적
|
||
|
I'm AI 투자매니저 시스템의 전체 아키텍처를 정의하여 개발 가이드라인 및 기술적 의사결정 근거 제공
|
||
|
|
||
|
### 1.2 시스템 개요
|
||
|
- **서비스명**: I'm AI 투자매니저
|
||
|
- **아키텍처 패턴**: 하이브리드 클라우드 아키텍처 (로컬 + AWS)
|
||
|
- **배포 전략**: 서버리스 + 로컬 데이터 처리
|
||
|
- **확장성**: 마이크로서비스 기반 확장 가능
|
||
|
|
||
|
## 2. 전체 시스템 아키텍처
|
||
|
|
||
|
### 2.1 시스템 구성도
|
||
|
```
|
||
|
┌─────────────────────────────────────────────────────────────────┐
|
||
|
│ 사용자 (웹브라우저) │
|
||
|
└─────────────────────┬───────────────────────────────────────────┘
|
||
|
│ HTTPS
|
||
|
┌─────────────────────▼───────────────────────────────────────────┐
|
||
|
│ AWS CloudFront (CDN) │
|
||
|
└─────────────────────┬───────────────────────────────────────────┘
|
||
|
│
|
||
|
┌─────────────────────▼───────────────────────────────────────────┐
|
||
|
│ React Frontend App │
|
||
|
│ (S3 Static Hosting) │
|
||
|
└─────────────────────┬───────────────────────────────────────────┘
|
||
|
│ API Calls
|
||
|
┌─────────────────────▼───────────────────────────────────────────┐
|
||
|
│ AWS API Gateway │
|
||
|
└─────────────────────┬───────────────────────────────────────────┘
|
||
|
│
|
||
|
┌─────────────────────▼───────────────────────────────────────────┐
|
||
|
│ AWS Lambda Functions │
|
||
|
│ ┌─────────────────┬─────────────────┬─────────────────────────┐ │
|
||
|
│ │ Main API │ Product API │ WebSocket API │ │
|
||
|
│ │ Lambda │ Lambda │ Lambda │ │
|
||
|
│ └─────────────────┴─────────────────┴─────────────────────────┘ │
|
||
|
└─────────────────────┬───────────────────────────────────────────┘
|
||
|
│ Data Fetch
|
||
|
┌─────────────────────▼───────────────────────────────────────────┐
|
||
|
│ AWS S3 Bucket │
|
||
|
│ (AI 분석 결과 JSON 파일) │
|
||
|
└─────────────────────▲───────────────────────────────────────────┘
|
||
|
│ Data Upload
|
||
|
┌─────────────────────┴───────────────────────────────────────────┐
|
||
|
│ 로컬 데이터 처리 서버 │
|
||
|
│ ┌─────────────────────────────────────────────────────────────┐ │
|
||
|
│ │ Apache Airflow │ │
|
||
|
│ │ ┌───────────────┬───────────────┬──────────────────────────┐ │ │
|
||
|
│ │ │ 데이터 수집 │ AI 분석 │ S3 업로드 │ │ │
|
||
|
│ │ │ DAGs │ DAGs │ DAGs │ │ │
|
||
|
│ │ └───────────────┴───────────────┴──────────────────────────┘ │ │
|
||
|
│ └─────────────────────────────────────────────────────────────┘ │
|
||
|
│ ┌─────────────────────────────────────────────────────────────┐ │
|
||
|
│ │ 로컬 데이터베이스 │ │
|
||
|
│ │ (PostgreSQL / MySQL / SQLite) │ │
|
||
|
│ └─────────────────────────────────────────────────────────────┘ │
|
||
|
└─────────────────────┬───┬───────────────────────────────────────┘
|
||
|
│ │
|
||
|
┌───────────▼───▼──────────────┐
|
||
|
│ 외부 API 서비스 │
|
||
|
│ ┌─────────────┬─────────────┐│
|
||
|
│ │ 업비트 API │ 야후파이낸스 ││
|
||
|
│ │ (코인 데이터)│ (주식 데이터) ││
|
||
|
│ └─────────────┴─────────────┘│
|
||
|
│ ┌─────────────┬─────────────┐│
|
||
|
│ │ 뉴스 API │ AI API ││
|
||
|
│ │ (뉴스 데이터)│(Gemini/GPT) ││
|
||
|
│ └─────────────┴─────────────┘│
|
||
|
└─────────────────────────────────┘
|
||
|
```
|
||
|
|
||
|
## 3. 계층별 아키텍처 설계
|
||
|
|
||
|
### 3.1 프레젠테이션 계층 (Frontend)
|
||
|
|
||
|
#### 3.1.1 기술 스택
|
||
|
- **Framework**: React 18 + TypeScript
|
||
|
- **State Management**: Zustand (가벼운 상태관리)
|
||
|
- **Styling**: Tailwind CSS + shadcn/ui
|
||
|
- **Chart Library**: Chart.js + TradingView Widgets
|
||
|
- **Build Tool**: Vite
|
||
|
- **WebSocket**: Socket.IO Client
|
||
|
|
||
|
#### 3.1.2 컴포넌트 구조
|
||
|
```
|
||
|
src/
|
||
|
├── components/
|
||
|
│ ├── common/ # 공통 컴포넌트
|
||
|
│ ├── dashboard/ # 대시보드 관련
|
||
|
│ ├── product/ # 투자상품 상세
|
||
|
│ ├── simulation/ # 수익률 시뮬레이션
|
||
|
│ └── charts/ # 차트 컴포넌트
|
||
|
├── hooks/ # 커스텀 훅
|
||
|
├── stores/ # Zustand 상태관리
|
||
|
├── services/ # API 서비스
|
||
|
├── utils/ # 유틸리티
|
||
|
└── types/ # TypeScript 타입
|
||
|
```
|
||
|
|
||
|
#### 3.1.3 주요 기능
|
||
|
- **실시간 가격 표시**: WebSocket 연결
|
||
|
- **반응형 디자인**: 모바일/데스크톱 대응
|
||
|
- **캐싱 전략**: React Query로 데이터 캐싱
|
||
|
- **성능 최적화**: Code Splitting, Lazy Loading
|
||
|
|
||
|
### 3.2 API 계층 (AWS Lambda)
|
||
|
|
||
|
#### 3.2.1 Lambda 함수 구성
|
||
|
```
|
||
|
lambda-functions/
|
||
|
├── main-api/ # 메인 페이지 API
|
||
|
│ ├── handler.py
|
||
|
│ └── requirements.txt
|
||
|
├── product-api/ # 투자상품 상세 API
|
||
|
│ ├── handler.py
|
||
|
│ └── requirements.txt
|
||
|
└── websocket-api/ # 실시간 데이터 API
|
||
|
├── handler.py
|
||
|
└── requirements.txt
|
||
|
```
|
||
|
|
||
|
#### 3.2.2 API 설계
|
||
|
- **GET /api/web/main**
|
||
|
- 메인페이지 데이터 (전체 투자상품 리스트)
|
||
|
- 응답: JSON (투자상품 기본정보 + AI분석 요약)
|
||
|
|
||
|
- **GET /api/web/invest/{product}**
|
||
|
- 투자상품 상세 데이터
|
||
|
- 응답: JSON (상세 AI분석 + 캔들데이터 + 뉴스)
|
||
|
|
||
|
- **WebSocket /ws/realtime**
|
||
|
- 실시간 가격 업데이트
|
||
|
- 메시지: JSON (상품ID + 현재가 + 등락률)
|
||
|
|
||
|
### 3.3 데이터 계층 (로컬 서버)
|
||
|
|
||
|
#### 3.3.1 Apache Airflow 구성
|
||
|
```
|
||
|
airflow/
|
||
|
├── dags/
|
||
|
│ ├── collect_crypto_data.py # 코인 데이터 수집
|
||
|
│ ├── collect_stock_data.py # 주식 데이터 수집
|
||
|
│ ├── collect_news_data.py # 뉴스 데이터 수집
|
||
|
│ ├── ai_analysis.py # AI 분석 수행
|
||
|
│ └── upload_to_s3.py # S3 업로드
|
||
|
├── plugins/
|
||
|
│ ├── api_connectors/ # 외부 API 연결
|
||
|
│ └── ai_processors/ # AI 분석 엔진
|
||
|
└── config/
|
||
|
└── airflow.cfg
|
||
|
```
|
||
|
|
||
|
#### 3.3.2 데이터 파이프라인
|
||
|
1. **데이터 수집 (매 5분)**: 업비트/야후파이낸스 API 호출
|
||
|
2. **데이터 정규화**: 수집 데이터 표준화 및 검증
|
||
|
3. **AI 분석 (매 24시간)**: 수집된 데이터로 AI 분석 수행
|
||
|
4. **결과 업로드**: 분석 결과를 JSON 형태로 S3 업로드
|
||
|
|
||
|
### 3.4 데이터베이스 설계
|
||
|
|
||
|
#### 3.4.1 데이터베이스 선택
|
||
|
- **DBMS**: PostgreSQL 15+
|
||
|
- **이유**: JSON 지원, 확장성, 안정성
|
||
|
|
||
|
#### 3.4.2 주요 테이블 구조
|
||
|
```sql
|
||
|
-- 투자상품 기본정보
|
||
|
CREATE TABLE symbols (
|
||
|
id SERIAL PRIMARY KEY,
|
||
|
symbol VARCHAR(20) UNIQUE NOT NULL,
|
||
|
name VARCHAR(100) NOT NULL,
|
||
|
type VARCHAR(10) NOT NULL, -- 'CRYPTO' or 'STOCK'
|
||
|
market VARCHAR(20) NOT NULL,
|
||
|
is_active BOOLEAN DEFAULT true,
|
||
|
created_at TIMESTAMP DEFAULT NOW()
|
||
|
);
|
||
|
|
||
|
-- AI 분석결과
|
||
|
CREATE TABLE ai_analysis (
|
||
|
id SERIAL PRIMARY KEY,
|
||
|
symbol_id INTEGER REFERENCES symbols(id),
|
||
|
target_price DECIMAL(20,8),
|
||
|
stop_loss_price DECIMAL(20,8),
|
||
|
entry_price DECIMAL(20,8),
|
||
|
attractiveness_score INTEGER, -- 1-100점
|
||
|
analysis_content TEXT,
|
||
|
related_news JSON,
|
||
|
analysis_date TIMESTAMP DEFAULT NOW()
|
||
|
);
|
||
|
|
||
|
-- 캔들 데이터
|
||
|
CREATE TABLE invest_candle_data (
|
||
|
id SERIAL PRIMARY KEY,
|
||
|
symbol_id INTEGER REFERENCES symbols(id),
|
||
|
open_price DECIMAL(20,8),
|
||
|
high_price DECIMAL(20,8),
|
||
|
low_price DECIMAL(20,8),
|
||
|
close_price DECIMAL(20,8),
|
||
|
volume DECIMAL(20,8),
|
||
|
candle_time TIMESTAMP,
|
||
|
created_at TIMESTAMP DEFAULT NOW()
|
||
|
);
|
||
|
|
||
|
-- 뉴스 정보
|
||
|
CREATE TABLE news_info (
|
||
|
id SERIAL PRIMARY KEY,
|
||
|
symbol_id INTEGER REFERENCES symbols(id),
|
||
|
title VARCHAR(500),
|
||
|
content TEXT,
|
||
|
source VARCHAR(100),
|
||
|
published_at TIMESTAMP,
|
||
|
url VARCHAR(1000),
|
||
|
created_at TIMESTAMP DEFAULT NOW()
|
||
|
);
|
||
|
```
|
||
|
|
||
|
## 4. 클라우드 아키텍처 (AWS)
|
||
|
|
||
|
### 4.1 AWS 서비스 구성
|
||
|
- **S3**: 정적 웹사이트 호스팅 + AI 분석 결과 저장
|
||
|
- **CloudFront**: CDN (전세계 캐시)
|
||
|
- **API Gateway**: API 엔드포인트 관리
|
||
|
- **Lambda**: 서버리스 API 처리
|
||
|
- **IAM**: 권한 관리
|
||
|
|
||
|
### 4.2 S3 버킷 구조
|
||
|
```
|
||
|
ai-invest-bucket/
|
||
|
├── web-assets/ # React 빌드 파일
|
||
|
│ ├── index.html
|
||
|
│ ├── static/
|
||
|
│ └── assets/
|
||
|
└── data/ # AI 분석 결과
|
||
|
├── main/
|
||
|
│ └── latest.json # 메인 페이지 데이터
|
||
|
└── products/
|
||
|
├── BTC.json # 코인별 상세 데이터
|
||
|
├── ETH.json
|
||
|
├── AAPL.json # 주식별 상세 데이터
|
||
|
└── ...
|
||
|
```
|
||
|
|
||
|
### 4.3 보안 설정
|
||
|
- **HTTPS Only**: CloudFront SSL/TLS 인증서
|
||
|
- **CORS 설정**: API Gateway CORS 정책
|
||
|
- **API 키 관리**: AWS Systems Manager Parameter Store
|
||
|
|
||
|
## 5. 데이터 플로우
|
||
|
|
||
|
### 5.1 실시간 데이터 플로우
|
||
|
```
|
||
|
외부 API → Airflow DAG → 로컬 DB → S3 업로드 → Lambda → Frontend
|
||
|
↓ ↑
|
||
|
WebSocket ──────────────────────────────────────────────┘
|
||
|
```
|
||
|
|
||
|
### 5.2 사용자 요청 플로우
|
||
|
```
|
||
|
사용자 → CloudFront → S3 (React App) → API Gateway → Lambda → S3 Data → 응답
|
||
|
```
|
||
|
|
||
|
### 5.3 AI 분석 플로우
|
||
|
```
|
||
|
캔들데이터 + 뉴스데이터 → AI 프롬프트 생성 → AI API 호출 → 결과 파싱 → DB 저장 → S3 업로드
|
||
|
```
|
||
|
|
||
|
## 6. 성능 최적화 전략
|
||
|
|
||
|
### 6.1 Frontend 최적화
|
||
|
- **번들 최적화**: Code Splitting, Tree Shaking
|
||
|
- **이미지 최적화**: WebP 포맷, Lazy Loading
|
||
|
- **캐싱**: Service Worker, Browser Cache
|
||
|
- **WebSocket**: 실시간 데이터만 필요시 연결
|
||
|
|
||
|
### 6.2 Backend 최적화
|
||
|
- **Lambda Cold Start**: Provisioned Concurrency 설정
|
||
|
- **데이터베이스**: 인덱싱, Connection Pooling
|
||
|
- **S3**: CloudFront 캐시, Gzip 압축
|
||
|
|
||
|
### 6.3 비용 최적화
|
||
|
- **Lambda**: 메모리 최적화, 실행시간 단축
|
||
|
- **S3**: Intelligent Tiering, 불필요한 파일 정리
|
||
|
- **AI API**: 배치 처리, 캐시 활용
|
||
|
|
||
|
## 7. 확장성 고려사항
|
||
|
|
||
|
### 7.1 수평적 확장
|
||
|
- **투자상품 추가**: symbols 테이블에 데이터 추가만으로 확장
|
||
|
- **Lambda 스케일링**: Auto Scaling 지원
|
||
|
- **데이터베이스**: Read Replica 추가 가능
|
||
|
|
||
|
### 7.2 수직적 확장
|
||
|
- **Airflow**: Worker 노드 추가
|
||
|
- **데이터베이스**: 인스턴스 사양 업그레이드
|
||
|
- **Lambda**: 메모리 증설
|
||
|
|
||
|
## 8. 모니터링 및 로깅
|
||
|
|
||
|
### 8.1 모니터링 구성
|
||
|
- **AWS CloudWatch**: Lambda 메트릭, 로그 수집
|
||
|
- **Airflow**: DAG 실행 상태 모니터링
|
||
|
- **Database**: 성능 메트릭 수집
|
||
|
|
||
|
### 8.2 알람 설정
|
||
|
- **API 응답시간** > 500ms 알람
|
||
|
- **Lambda 에러율** > 1% 알람
|
||
|
- **데이터 수집 실패** 알람
|
||
|
|
||
|
## 9. 개발 및 배포 전략
|
||
|
|
||
|
### 9.1 개발 환경
|
||
|
```
|
||
|
Local Development → Git Repository → GitHub Actions → AWS Deployment
|
||
|
```
|
||
|
|
||
|
### 9.2 CI/CD 파이프라인
|
||
|
- **Frontend**: Vite Build → S3 Upload → CloudFront Invalidation
|
||
|
- **Backend**: Lambda Package → AWS SAM Deploy
|
||
|
- **Database**: Migration Scripts 자동 실행
|
||
|
|
||
|
### 9.3 환경 분리
|
||
|
- **Development**: 로컬 환경
|
||
|
- **Staging**: AWS 환경 (소규모)
|
||
|
- **Production**: AWS 환경 (본격 서비스)
|
||
|
|
||
|
## 10. 기술 선택 근거
|
||
|
|
||
|
### 10.1 React vs Vue.js
|
||
|
- **선택**: React 18
|
||
|
- **근거**: 더 큰 생태계, TypeScript 지원 우수, 개발자 풀 확보 용이
|
||
|
|
||
|
### 10.2 Zustand vs Redux
|
||
|
- **선택**: Zustand
|
||
|
- **근거**: 더 간단한 API, 보일러플레이트 최소화, 번들 사이즈 작음
|
||
|
|
||
|
### 10.3 PostgreSQL vs MySQL
|
||
|
- **선택**: PostgreSQL
|
||
|
- **근거**: JSON 지원 우수, 확장성, 오픈소스 안정성
|