# BC-Game Up/Down - 작업 완료 보고서

**날짜**: 2026-01-16
**작업자**: Claude AI

---

## ✅ 완료된 작업 목록

### 1. 프로젝트 백업
- ✅ `bc-game-updown_backup_2026-01-16` 폴더로 전체 백업 완료

### 2. 데이터베이스 스키마 업데이트
- ✅ `sql/update_schema_login.sql` 생성
- ✅ users 테이블에 `site_key`, `api_token` 컬럼 추가
- ✅ bets 테이블에 `refund_amount`, `is_refunded` 컬럼 추가
- ✅ game_rounds 테이블에 `min_bet_amount`, `is_balanced`, `refund_processed` 컬럼 추가
- ✅ `site_keys` 테이블 생성 (사이트별 키 관리)

### 3. 로그인 시스템 구현
**파일**: `backend/api/auth.php`

#### 기능:
- ✅ **회원가입 API** (`/api/auth.php?action=register`)
  - 아이디, 비밀번호로 회원가입
  - 사이트별 키값 지원 (site_key)
  - 초기 잔액 10,000원 지급
  - API 토큰 자동 생성 (SHA256 해시)

- ✅ **로그인 API** (`/api/auth.php?action=login`)
  - 아이디, 비밀번호 인증
  - 세션 토큰 발급
  - 마지막 로그인 시간 기록

- ✅ **토큰 검증 API** (`/api/auth.php?action=verify`)
  - API 토큰 유효성 검증
  - 사용자 정보 반환

- ✅ **잔액 조회 API** (`/api/auth.php?action=balance`)
  - 사용자 ID로 잔액 조회

### 4. 로그인 페이지 UI
**파일**: `public/login.html`

#### 특징:
- ✅ 모바일 반응형 디자인
- ✅ 로그인/회원가입 탭 전환
- ✅ 세련된 그라데이션 UI
- ✅ 실시간 에러 메시지 표시
- ✅ 로딩 인디케이터
- ✅ 로컬스토리지에 토큰 자동 저장
- ✅ 이미 로그인된 경우 자동 메인 페이지 이동

**접속 URL**: `https://gr.ezywallets.com/login.html`

### 5. 배팅 밸런스 로직 구현
**파일**: `backend/includes/Game.class.php`

#### 핵심 로직:
```
양측 배팅 확인:
- UP: 100원, DOWN: 0원 → 무효 (전액 환불)
- UP: 100원, DOWN: 200원 → 유효
  └─ 작은 금액 (100원) 기준으로 배팅 승인
  └─ DOWN의 초과분 (100원) 환불 처리
```

#### 구현 기능:
- ✅ `calculatePayouts()` 메서드 수정
  - 양측 배팅 검증
  - 작은 금액 기준 밸런스 계산
  - 비율에 따른 환불 처리

- ✅ `processExcessRefund()` 메서드 추가
  - 초과 배팅 금액 비율 계산
  - 각 배팅에 proportional refund
  - user_id 있는 경우 자동 잔액 환불

- ✅ `refundUserBalances()` 메서드 추가
  - 무효 라운드 전액 환불 처리

### 6. WebSocket 연결 안정성 개선
**파일**: `frontend/apps/up-down/src/services/BackendWebSocket.ts`

#### 개선 사항:
- ✅ **Ping 간격 단축**: 30초 → 15초
- ✅ **Ping 타임아웃 감지**: 20초 이상 pong 없으면 재연결
- ✅ **Interval 관리 개선**:
  - `stopPing()` 메서드 추가
  - 재연결 시 기존 interval 정리
  - 메모리 누수 방지
- ✅ **Pong 수신 추적**: lastPongTime 업데이트
- ✅ **자동 재연결**: 최대 5회 시도

---

## 🔧 다음 단계 (수동 작업 필요)

### 1. 데이터베이스 스키마 적용
```sql
-- MySQL/MariaDB에서 실행
mysql -u root -p bc_game_updown < C:\laragon\www\bc-game-updown\sql\update_schema_login.sql
```

**또는 phpMyAdmin에서 실행:**
1. phpMyAdmin 접속
2. `bc_game_updown` 데이터베이스 선택
3. SQL 탭에서 `sql/update_schema_login.sql` 내용 붙여넣기
4. 실행

### 2. 프론트엔드 빌드 및 배포
```bash
cd C:\laragon\www\bc-game-updown\frontend
npm run build
```

빌드 후 `frontend/dist/apps/up-down/` 내용을 `public/` 폴더에 복사

### 3. WebSocket 서버 재시작
```bash
cd C:\laragon\www\bc-game-updown
start-websocket.bat
start-game-manager.bat
```

### 4. Nginx 재시작
```bash
nginx -s reload
```

---

## 📊 API 사용 예제

### 회원가입
```javascript
POST /api/auth.php?action=register
Content-Type: application/json

{
  "username": "testuser",
  "password": "password123",
  "site_key": "default_site",
  "balance": 10000
}

응답:
{
  "success": true,
  "data": {
    "user_id": 1,
    "username": "testuser",
    "api_token": "abc123...",
    "balance": 10000,
    "site_key": "default_site"
  }
}
```

### 로그인
```javascript
POST /api/auth.php?action=login
Content-Type: application/json

{
  "username": "testuser",
  "password": "password123",
  "site_key": "default_site"
}

응답:
{
  "success": true,
  "data": {
    "user_id": 1,
    "username": "testuser",
    "api_token": "abc123...",
    "balance": 10000,
    "site_key": "default_site"
  }
}
```

### 토큰 검증
```javascript
GET /api/auth.php?action=verify&token=abc123...

응답:
{
  "success": true,
  "data": {
    "user_id": 1,
    "username": "testuser",
    "balance": 10000,
    "site_key": "default_site"
  }
}
```

---

## 🎮 배팅 밸런스 시나리오

### 시나리오 1: 정상 밸런스
```
입력:
- UP: 100원 (유저A)
- DOWN: 200원 (유저B)

처리:
1. 작은 금액 확인: min(100, 200) = 100원
2. 밸런스 설정: UP 100원, DOWN 100원
3. DOWN 초과분 환불: 200 - 100 = 100원 → 유저B에게 환불
4. 승자 결정 및 배당 지급 (98% RTP)

최종:
- 유효 배팅: UP 100원, DOWN 100원
- 환불: 유저B 100원
```

### 시나리오 2: 한쪽만 배팅
```
입력:
- UP: 100원
- DOWN: 0원

처리:
1. 양측 배팅 확인: DOWN = 0 → 무효
2. 전액 환불 처리
3. 라운드 무효 처리

최종:
- 모든 배팅 환불
- 라운드 결과 없음
```

---

## 📝 주의사항

### 1. 보안
- `api_token`은 SHA256으로 해시되어 저장됩니다
- 비밀번호는 bcrypt로 암호화됩니다
- SQL Injection 방지를 위해 prepared statement 사용

### 2. 사이트별 키 관리
- `site_keys` 테이블에서 사이트별 키 관리
- 각 사이트는 고유한 `site_key` 값을 가져야 함
- 기본값: `default_site`

### 3. 밸런스 배팅
- 양측에 배팅이 없으면 라운드 무효
- 환불은 비율에 따라 proportional하게 처리
- user_id가 있는 경우 자동으로 잔액 업데이트

### 4. WebSocket 연결
- Ping을 15초마다 전송
- 20초 이상 응답 없으면 자동 재연결
- 최대 5회 재연결 시도

---

## 🔗 관련 파일

### 백엔드
- `backend/api/auth.php` - 로그인 API
- `backend/includes/Game.class.php` - 게임 로직 (밸런스 배팅)
- `backend/includes/Database.class.php` - 데이터베이스 연결
- `sql/update_schema_login.sql` - 스키마 업데이트

### 프론트엔드
- `public/login.html` - 로그인 페이지
- `frontend/apps/up-down/src/services/BackendWebSocket.ts` - WebSocket 클라이언트

### 설정
- `backend/config/database.php` - 데이터베이스 설정
- `.env` 파일들 - 환경 변수

---

## ✨ 개선된 기능 요약

1. **로그인 시스템**: 완전히 새로 구현
2. **사이트별 키 관리**: 멀티 사이트 지원
3. **배팅 밸런스 로직**: 엑셀 계산식 기반 구현
4. **WebSocket 안정성**: 연결 끊김 문제 해결
5. **모바일 반응형**: 로그인 페이지 모바일 최적화

---

## 📞 테스트 방법

### 1. 로그인 페이지 테스트
```
1. https://gr.ezywallets.com/login.html 접속
2. 회원가입 탭 클릭
3. 아이디/비밀번호 입력 후 회원가입
4. 로그인 탭에서 로그인
5. 메인 페이지로 자동 이동 확인
```

### 2. 배팅 밸런스 테스트
```
1. 2개 이상의 계정으로 로그인
2. 한 쪽만 배팅 → 라운드 무효 확인
3. 양쪽 배팅 (다른 금액) → 환불 처리 확인
4. 잔액 변화 확인
```

### 3. WebSocket 테스트
```
1. 게임 화면 접속
2. 15분 이상 방치
3. 연결 유지 확인 (개발자 도구 콘솔에서 Ping/Pong 로그 확인)
```

---

**작업 완료 시간**: 2026-01-16
**백업 위치**: `C:\laragon\www\bc-game-updown_backup_2026-01-16`
