Skip to content

dajutalk/backend

Repository files navigation

Stock Trading Platform API

ν”„λ‘œμ νŠΈ κ°œμš”

μ‹€μ‹œκ°„ 주식 데이터와 μ‚¬μš©μž 인증이 ν†΅ν•©λœ μ’…ν•© 주식 거래 ν”Œλž«νΌμž…λ‹ˆλ‹€. WebSocket을 ν†΅ν•œ μ‹€μ‹œκ°„ 데이터 슀트리밍, μ±„νŒ… μ‹œμŠ€ν…œ, λͺ¨μ˜νˆ¬μž κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

μ£Όμš” κΈ°λŠ₯

  • μ‚¬μš©μž 인증: JWT + 카카였 μ†Œμ…œ 둜그인
  • μ‹€μ‹œκ°„ 주식 데이터: 50개 μ£Όμš” 주식 + 10개 μ•”ν˜Έν™”ν
  • WebSocket μ‹€μ‹œκ°„ 슀트리밍: μ‹œμ„Έ 데이터 + μ±„νŒ…
  • μ‹€μ‹œκ°„ μ±„νŒ…: μ’…λͺ©λ³„ μ±„νŒ…λ°©
  • λͺ¨μ˜νˆ¬μž: 가상 거래 μ‹œμŠ€ν…œ
  • AI 챗봇: OpenAI 기반 투자 상담

기술 μŠ€νƒ

Backend

  • Framework: FastAPI 0.104+
  • Database: MySQL 8.0 + SQLAlchemy ORM
  • Authentication: JWT + OAuth2 (카카였)
  • Real-time: WebSocket
  • External APIs: Finnhub (주식), OpenAI (챗봇)
  • Environment: Python 3.9+

Frontend ꢌμž₯사항

  • Framework: React 18+ / Next.js 13+
  • Real-time: WebSocket Client
  • State Management: Redux Toolkit / Zustand
  • UI: Material-UI / Tailwind CSS
  • Charts: Chart.js / Recharts

ν”„λ‘œμ νŠΈ ꡬ쑰

juda/
β”œβ”€β”€ stock/backend/                 # λ°±μ—”λ“œ 루트
β”‚   β”œβ”€β”€ main.py                   # FastAPI μ•± μ§„μž…μ 
β”‚   β”œβ”€β”€ core/
β”‚   β”‚   └── config.py            # ν™˜κ²½ μ„€μ •
β”‚   β”œβ”€β”€ auth/                    # 인증 μ‹œμŠ€ν…œ
β”‚   β”‚   β”œβ”€β”€ auth_routes.py       # 인증 API λΌμš°ν„°
β”‚   β”‚   β”œβ”€β”€ auth_service.py      # JWT 토큰 관리
β”‚   β”‚   β”œβ”€β”€ kakao_service.py     # 카카였 OAuth
β”‚   β”‚   β”œβ”€β”€ models.py            # μ‚¬μš©μž λͺ¨λΈ
β”‚   β”‚   └── schemas.py           # Pydantic μŠ€ν‚€λ§ˆ
β”‚   β”œβ”€β”€ api/                     # REST API
β”‚   β”‚   β”œβ”€β”€ stock.py             # 주식 데이터 API
β”‚   β”‚   └── chat.py              # μ±„νŒ… API
β”‚   β”œβ”€β”€ services/                # λΉ„μ¦ˆλ‹ˆμŠ€ 둜직
β”‚   β”‚   β”œβ”€β”€ stock_service.py     # 주식 데이터 처리
β”‚   β”‚   β”œβ”€β”€ auto_collector.py    # μžλ™ 데이터 μˆ˜μ§‘
β”‚   β”‚   └── cache_service.py     # 캐싱 관리
β”‚   β”œβ”€β”€ websocket_routes.py      # WebSocket μ—”λ“œν¬μΈνŠΈ
β”‚   β”œβ”€β”€ websocket_manager.py     # WebSocket μ—°κ²° 관리
β”‚   β”œβ”€β”€ stockDeal/               # λͺ¨μ˜νˆ¬μž
β”‚   β”‚   └── mock_investment.py   # 가상 거래
β”‚   β”œβ”€β”€ chatbot/                 # AI 챗봇
β”‚   β”‚   └── chat_router.py       # 챗봇 API
β”‚   β”œβ”€β”€ database.py              # DB μ„€μ • 및 λͺ¨λΈ
β”‚   β”œβ”€β”€ utils/
β”‚   β”‚   └── logger.py            # λ‘œκΉ… μ„€μ •
β”‚   β”œβ”€β”€ test/                    # ν…ŒμŠ€νŠΈ 도ꡬ
β”‚   β”‚   β”œβ”€β”€ test_stock_quote_api.py
β”‚   β”‚   └── fix_crypto_table.py
β”‚   └── docs/                    # API λ¬Έμ„œ
β”‚       β”œβ”€β”€ websocket_usage.md
β”‚       β”œβ”€β”€ websocket_chat_usage.md
β”‚       β”œβ”€β”€ stock_quote_api_usage.md
β”‚       └── frontend_integration_guide.md
β”œβ”€β”€ .env                         # ν™˜κ²½λ³€μˆ˜ μ„€μ •
└── README.md                    # 이 파일

μ„€μΉ˜ 및 μ„€μ •

1. ν™˜κ²½ μš”κ΅¬μ‚¬ν•­

# Python 3.9+ ν•„μˆ˜
python --version

# MySQL 8.0+ ν•„μˆ˜
mysql --version

2. ν”„λ‘œμ νŠΈ 클둠 및 μ˜μ‘΄μ„± μ„€μΉ˜

git clone <repository-url>
cd juda

# κ°€μƒν™˜κ²½ 생성 (ꢌμž₯)
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# μ˜μ‘΄μ„± μ„€μΉ˜
pip install fastapi[all] sqlalchemy pymysql python-multipart
pip install requests python-jose[cryptography] passlib[bcrypt]
pip install python-dotenv websockets openai

3. ν™˜κ²½λ³€μˆ˜ μ„€μ •

.env νŒŒμΌμ„ μƒμ„±ν•˜κ³  λ‹€μŒ λ‚΄μš©μ„ μ„€μ •ν•˜μ„Έμš”:

# λ°μ΄ν„°λ² μ΄μŠ€ μ„€μ •
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=your_mysql_password
DB_NAME=stock_db

# API ν‚€
FINNHUB_API_KEY=your_finnhub_api_key
OPENAI_API_KEY=your_openai_api_key

# JWT 인증
JWT_SECRET_KEY=your_very_secure_random_secret_key_here
JWT_ALGORITHM=HS256
JWT_EXPIRE_MINUTES=1440

# 카카였 둜그인 (선택사항)
KAKAO_CLIENT_ID=your_kakao_app_key
KAKAO_REDIRECT_URI=https://dajutalk.com/auth/kakao/callback

# ν”„λ‘ νŠΈμ—”λ“œ URL
FRONTEND_URL=https://dajutalk.com

# 개발 ν™˜κ²½μ—μ„œλŠ” λ‹€μŒκ³Ό 같이 μ„€μ •
# KAKAO_REDIRECT_URI=http://localhost:8000/auth/kakao/callback
# FRONTEND_URL=http://localhost:3000

4. λ°μ΄ν„°λ² μ΄μŠ€ μ„€μ •

# MySQL에 λ°μ΄ν„°λ² μ΄μŠ€ 생성
mysql -u root -p
CREATE DATABASE stock_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
exit

# ν…Œμ΄λΈ” μžλ™ 생성 (μ„œλ²„ μ‹œμž‘ μ‹œ μžλ™μœΌλ‘œ 생성됨)

5. API ν‚€ λ°œκΈ‰

Finnhub API ν‚€ (ν•„μˆ˜)

  1. https://finnhub.io νšŒμ›κ°€μž…
  2. API ν‚€ λ°œκΈ‰
  3. .env νŒŒμΌμ— FINNHUB_API_KEY μ„€μ •

OpenAI API ν‚€ (챗봇 κΈ°λŠ₯용)

  1. https://openai.com 계정 생성
  2. API ν‚€ λ°œκΈ‰
  3. .env νŒŒμΌμ— OPENAI_API_KEY μ„€μ •

카카였 둜그인 (선택사항)

  1. https://developers.kakao.com μ•± 생성
  2. JavaScript ν‚€ 볡사
  3. .env νŒŒμΌμ— KAKAO_CLIENT_ID μ„€μ •

μ„œλ²„ μ‹€ν–‰

cd stock/backend
python main.py

# λ˜λŠ” uvicorn으둜 μ‹€ν–‰
uvicorn stock.backend.main:app --host 0.0.0.0 --port 8000 --reload

μ„œλ²„ μ‹€ν–‰ ν›„ λ‹€μŒ URLμ—μ„œ 확인:

API μ—”λ“œν¬μΈνŠΈ

인증 API (/auth)

Method Endpoint μ„€λͺ…
POST /auth/signup νšŒμ›κ°€μž…
POST /auth/login 둜그인
POST /auth/logout λ‘œκ·Έμ•„μ›ƒ
GET /auth/me ν˜„μž¬ μ‚¬μš©μž 정보
POST /auth/check-email 이메일 쀑볡 확인
POST /auth/check-nickname λ‹‰λ„€μž„ 쀑볡 확인
GET /auth/kakao/redirect 카카였 둜그인 μ‹œμž‘

주식 데이터 API (/api/stocks)

Method Endpoint μ„€λͺ…
GET /api/stocks/quote?symbol=AAPL κ°œλ³„ 주식 μ‹œμ„Έ
GET /api/stocks/history/{symbol}?hours=24 주식 νžˆμŠ€ν† λ¦¬
GET /api/stocks/symbols 지원 주식 λͺ©λ‘
GET /api/stocks/crypto/{symbol} μ•”ν˜Έν™”ν μ‹œμ„Έ
GET /api/stocks/crypto/symbols 지원 μ•”ν˜Έν™”ν λͺ©λ‘

μ±„νŒ… API (/api/chat)

Method Endpoint μ„€λͺ…
GET /api/chat/rooms ν™œμ„± μ±„νŒ…λ°© λͺ©λ‘
GET /api/chat/rooms/{symbol} νŠΉμ • μ±„νŒ…λ°© 정보

λͺ¨μ˜νˆ¬μž API (/mock)

Method Endpoint μ„€λͺ…
POST /mock/buy 가상 맀수
POST /mock/sell 가상 맀도
GET /mock/portfolio 포트폴리였 쑰회
GET /mock/balance 가상 μž”κ³  쑰회

AI 챗봇 API (/chatbot)

Method Endpoint μ„€λͺ…
POST /chatbot/chat AI 투자 상담

πŸ”Œ WebSocket μ—”λ“œν¬μΈνŠΈ

μ‹€μ‹œκ°„ 데이터

# 전체 μ‹œμž₯ 데이터
wss://dajutalk.com/ws/main

# κ°œλ³„ 주식 데이터
wss://dajutalk.com/ws/stocks?symbol=AAPL

# κ°œλ³„ μ•”ν˜Έν™”ν 데이터  
wss://dajutalk.com/ws/crypto?symbol=BTC

μ‹€μ‹œκ°„ μ±„νŒ…

# μ’…λͺ©λ³„ μ±„νŒ…λ°©
wss://dajutalk.com/ws/chat?symbol=AAPL&nickname=μ‚¬μš©μžλͺ…&user_id=123

ν”„λ‘ νŠΈμ—”λ“œ 톡합 κ°€μ΄λ“œ

인증 κ΅¬ν˜„ μ˜ˆμ‹œ

// νšŒμ›κ°€μž…
const formData = new FormData();
formData.append('email', 'user@example.com');
formData.append('password', 'password123');
formData.append('nickname', 'μ‚¬μš©μž');

fetch('https://dajutalk.com/auth/signup', {
    method: 'POST',
    body: formData,
    credentials: 'include'  // μ€‘μš”: μΏ ν‚€ 포함
});

// 둜그인
const formData = new FormData();
formData.append('email', 'user@example.com');
formData.append('password', 'password123');

fetch('https://dajutalk.com/auth/login', {
    method: 'POST',
    body: formData,
    credentials: 'include'
});

WebSocket μ‹€μ‹œκ°„ 데이터

// 전체 μ‹œμž₯ 데이터 ꡬ독
const socket = new WebSocket('wss://dajutalk.com/ws/main');

socket.onmessage = (event) => {
    const data = JSON.parse(event.data);
    if (data.type === 'market_update') {
        // UI μ—…λ°μ΄νŠΈ
        updateStockData(data.data.stocks);
        updateCryptoData(data.data.cryptos);
    }
};

// κ°œλ³„ μ’…λͺ© ꡬ독
const appleSocket = new WebSocket('wss://dajutalk.com/ws/stocks?symbol=AAPL');

μ±„νŒ… κ΅¬ν˜„

// μ±„νŒ…λ°© μ—°κ²°
const chatSocket = new WebSocket('wss://dajutalk.com/ws/chat?symbol=AAPL&nickname=μ‚¬μš©μž&user_id=123');

// λ©”μ‹œμ§€ 전솑
chatSocket.send(JSON.stringify({
    type: 'chat_message',
    message: 'μ•ˆλ…•ν•˜μ„Έμš”!'
}));

// λ©”μ‹œμ§€ μˆ˜μ‹ 
chatSocket.onmessage = (event) => {
    const data = JSON.parse(event.data);
    displayMessage(data.username, data.message);
};

ν…ŒμŠ€νŠΈ 도ꡬ

주식 μ‹œμ„Έ API ν…ŒμŠ€νŠΈ

cd stock/backend/test

# 단일 쑰회
python test_stock_quote_api.py AAPL

# μ‹€μ‹œκ°„ λͺ¨λ‹ˆν„°λ§ (5초 간격)
python test_stock_quote_api.py AAPL --monitor --interval 5

# νŠΉμ • μ‹œκ°„ λ™μ•ˆ λͺ¨λ‹ˆν„°λ§
python test_stock_quote_api.py AAPL --monitor --duration 60

λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ” μˆ˜μ •

# μ•”ν˜Έν™”ν ν…Œμ΄λΈ” μž¬μƒμ„±
python test/fix_crypto_table.py

상세 λ¬Έμ„œ

ν”„λ‘œμ νŠΈμ˜ 각 κΈ°λŠ₯에 λŒ€ν•œ μƒμ„Έν•œ λ¬Έμ„œλŠ” docs/ ν΄λ”μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€:

개발 ν™˜κ²½ μ„€μ •

ν™˜κ²½ ꡬ뢄

ν”„λ‘œλ•μ…˜ ν™˜κ²½ (κΈ°λ³Έκ°’)

# API URL
API_URL=https://dajutalk.com
# WebSocket URL  
WS_URL=wss://dajutalk.com

개발 ν™˜κ²½

# API URL
API_URL=http://localhost:8000
# WebSocket URL
WS_URL=ws://localhost:8000

CORS μ„€μ •

기본적으둜 λ‹€μŒ 도메인이 ν—ˆμš©λ©λ‹ˆλ‹€:

  • https://dajutalk.com
  • https://www.dajutalk.com
  • http://localhost:3000 (개발용)
  • http://localhost:3001 (개발용)

λ‘œκΉ…

λͺ¨λ“  λ‘œκ·ΈλŠ” μ½˜μ†”μ— 좜λ ₯되며, λ‹€μŒ 레벨둜 κ΅¬λΆ„λ©λ‹ˆλ‹€:

  • INFO: 일반 정보
  • WARNING: 경고사항
  • ERROR: 였λ₯˜ λ°œμƒ

λ¬Έμ œν•΄κ²°

자주 λ°œμƒν•˜λŠ” 문제

  1. λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° μ‹€νŒ¨

    • MySQL μ„œλ²„ μ‹€ν–‰ 확인
    • .env 파일의 DB μ„€μ • 확인
  2. API ν‚€ 였λ₯˜

    • Finnhub API ν‚€ μœ νš¨μ„± 확인
    • API μ‚¬μš©λŸ‰ μ œν•œ 확인
  3. WebSocket μ—°κ²° λŠκΉ€

    • λ°©ν™”λ²½ μ„€μ • 확인
    • ν”„λ‘μ‹œ μ„€μ • 확인
  4. 카카였 둜그인 μ‹€νŒ¨

둜그 확인

# μ„œλ²„ 둜그 μ‹€μ‹œκ°„ 확인
tail -f /var/log/stock-api.log

# λ˜λŠ” μ½˜μ†”μ—μ„œ 직접 확인
python main.py

배포

ν”„λ‘œλ•μ…˜ ν™˜κ²½ μ„€μ •

  1. ν™˜κ²½λ³€μˆ˜ μ„€μ •

    # ν”„λ‘œλ•μ…˜ ν™˜κ²½ (κΈ°λ³Έκ°’)
    KAKAO_REDIRECT_URI=https://dajutalk.com/auth/kakao/callback
    FRONTEND_URL=https://dajutalk.com
    
    # 개발 ν™˜κ²½
    KAKAO_REDIRECT_URI=http://localhost:8000/auth/kakao/callback
    FRONTEND_URL=http://localhost:3000
  2. HTTPS μ„€μ •

    • SSL μΈμ¦μ„œ μ„€μ •
    • λ³΄μ•ˆ μΏ ν‚€ ν™œμ„±ν™”
  3. λ°μ΄ν„°λ² μ΄μŠ€ μ΅œμ ν™”

    • 인덱슀 μ„€μ •
    • 컀λ„₯μ…˜ ν’€ μ‘°μ •
  4. λͺ¨λ‹ˆν„°λ§ μ„€μ •

    • 둜그 μˆ˜μ§‘ μ‹œμŠ€ν…œ ꡬ좕
    • μ„±λŠ₯ λͺ¨λ‹ˆν„°λ§ 도ꡬ 연동

λΌμ΄μ„ μŠ€

이 ν”„λ‘œμ νŠΈλŠ” MIT λΌμ΄μ„ μŠ€λ‘œ μ œκ³΅λ©λ‹ˆλ‹€.

κΈ°μ—¬ν•˜κΈ°

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

지원

λ¬Έμ œκ°€ λ°œμƒν•˜κ±°λ‚˜ 질문이 μžˆμœΌμ‹œλ©΄ GitHub Issuesλ₯Ό 톡해 λ¬Έμ˜ν•΄ μ£Όμ„Έμš”.


μ΅œμ’… μ—…λ°μ΄νŠΈ: 2025λ…„ 06μ›”

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages