# 바이낸스 WebSocket 중계 서버

모든 클라이언트가 동일한 바이낸스 데이터를 받아서 차트가 완전히 동기화되도록 하는 중계 서버입니다.

## 🎯 목적

- **문제**: 각 클라이언트가 바이낸스에 직접 연결하면 네트워크 지연으로 약간씩 다른 데이터를 받아서 차트가 다르게 그려짐
- **해결**: 서버에서 바이낸스 데이터를 받아서 모든 클라이언트에게 동일한 타임스탬프의 동일한 가격을 브로드캐스트

## 📦 설치

```bash
cd C:/laragon/www/bc-game-updown/backend/websocket
npm install
```

## 🚀 실행

### 방법 1: 직접 실행
```bash
node binance-relay-server.js
```

### 방법 2: NPM 스크립트
```bash
npm start
```

### 방법 3: 백그라운드 실행 (Windows)
```bash
start /B node binance-relay-server.js
```

## 📊 서버 정보

- **포트**: 8081
- **WebSocket URL**: ws://localhost:8081
- **Health Check**: http://localhost:8081/health
- **데이터 소스**: Binance WebSocket (실시간 거래 스트림)

## 🔍 Health Check

서버 상태 확인:
```bash
curl http://localhost:8081/health
```

응답 예시:
```json
{
  "status": "ok",
  "clients": 5,
  "binanceConnected": true,
  "uptime": 3600,
  "lastPrice": 88229.83,
  "lastUpdate": 1769440079010
}
```

## 📡 메시지 형식

### 클라이언트로 전송되는 메시지

#### 1. Welcome 메시지
```json
{
  "type": "welcome",
  "message": "Connected to Binance Relay Server",
  "timestamp": 1769440079010,
  "lastPrice": 88229.83
}
```

#### 2. 가격 업데이트
```json
{
  "type": "binance_price",
  "symbol": "BTCUSDT",
  "price": 88229.83,
  "timestamp": 1769440079010,
  "quantity": 0.5,
  "source": "binance_websocket"
}
```

#### 3. 서버 종료
```json
{
  "type": "server_shutdown",
  "message": "Server is shutting down",
  "timestamp": 1769440079010
}
```

### 클라이언트에서 전송 가능한 메시지

#### Ping
```json
{
  "type": "ping"
}
```

응답:
```json
{
  "type": "pong",
  "timestamp": 1769440079010
}
```

## 🛠️ 프론트엔드 연동

프론트엔드는 자동으로 바이낸스 연결을 중계 서버로 리다이렉트합니다.

**binance-interceptor.ts**가 다음을 수행합니다:
1. 바이낸스 WebSocket 연결 감지
2. `ws://localhost:8081`로 리다이렉트
3. 중계 서버 메시지를 바이낸스 형식으로 변환
4. 차트 라이브러리에 전달

## 📈 성능

- **업데이트 빈도**: 실시간 (100ms~200ms마다)
- **지연시간**: < 50ms (로컬 서버)
- **동시 접속**: 제한 없음 (메모리가 허용하는 한)

## 🔧 서버 구조

```
binance-relay-server.js
├── WebSocket 서버 (포트 8081)
│   ├── 클라이언트 연결 관리
│   ├── 메시지 브로드캐스트
│   └── Health Check (HTTP)
│
└── Binance WebSocket 클라이언트
    ├── 실시간 거래 스트림 구독
    ├── 자동 재연결
    └── Ping/Pong (30초마다)
```

## 🐛 문제 해결

### 서버가 시작되지 않음
```bash
# 포트가 이미 사용 중인지 확인
netstat -ano | findstr :8081

# 프로세스 종료
taskkill /PID <PID> /F
```

### 바이낸스 연결 실패
- 인터넷 연결 확인
- 방화벽 설정 확인
- 바이낸스 API 상태 확인: https://www.binance.com/en/support/announcement

### 클라이언트 연결 안 됨
- 중계 서버가 실행 중인지 확인
- Health Check로 서버 상태 확인
- 브라우저 콘솔에서 WebSocket 연결 로그 확인

## 📝 로그

### 서버 시작
```
==================================================
Binance WebSocket Relay Server (Node.js)
==================================================
Starting server on port 8081
==================================================

[Server] ✅ WebSocket server listening on port 8081
[Server] Health check: http://localhost:8081/health
[Server] WebSocket URL: ws://localhost:8081
[Binance] Connecting to Binance WebSocket...
[Binance] ✅ Connected to Binance WebSocket
```

### 클라이언트 연결
```
[Client] ✅ New connection from ::ffff:127.0.0.1 | Total clients: 1
```

### 가격 업데이트 (10초마다)
```
[Binance] 💰 Price: 88229.8300 | Clients: 5 | Total received: 1000
```

### 통계 (60초마다)
```
[Stats] Uptime: 600s | Clients: 5 | Received: 10000 | Sent: 50000
[Stats] Last price: 88229.8300 | Binance: Connected
```

## 🔐 보안

- **로컬 전용**: 현재 localhost에서만 접근 가능
- **방화벽**: 외부 접근을 허용하려면 방화벽 설정 필요
- **인증**: 현재 인증 없음 (필요 시 JWT 등 추가)

## 🚦 상태 코드

- `1000`: 정상 종료
- `1001`: 서버 종료
- `1006`: 연결 끊김 (자동 재연결 시도)

## 📞 지원

문제가 발생하면:
1. Health Check로 서버 상태 확인
2. 서버 로그 확인
3. 브라우저 콘솔 확인

---

**작성일**: 2026-01-27
**버전**: 1.0.0
**Node.js**: v18+ 권장
