고전 게임 Pong을 현대적으로 재해석한 실시간 멀티플레이어 게임의 백엔드 서비스입니다. Django와 WebSocket을 활용하여 원활한 게임플레이, 사용자 관리, 실시간 알림을 제공합니다.
- 실시간 게임 엔진:
- WebSocket 기반 240 FPS 게임 엔진
- 정밀한 물리 충돌 처리
- 자동 스코어링 시스템
- 다양한 게임 모드 (1v1, 로컬, AI, 토너먼트)
- 42 OAuth 인증:
- 42 계정 연동
- JWT 기반 사용자 인증
- 토큰 자동 갱신
- 사용자 관리:
- 프로필 수정
- 전적 및 통계 시스템
- 계정 비활성화
- 토너먼트 시스템:
- 실시간 토너먼트 매칭
- 준결승/결승 라운드
- 승자 투표 시스템
- 친구 시스템:
- 친구 추가/수락/거절
- 온라인 상태 확인
- 실시간 알림
- Docker 및 Docker Compose
- 42 OAuth 애플리케이션 설정
# Django
SECRET_KEY=your_secret_key
DEBUG=True
ALLOWED_HOSTS=localhost,127.0.0.1
# Database
POSTGRES_DB=your_db_name
POSTGRES_USER=your_db_user
POSTGRES_PASSWORD=your_db_password
POSTGRES_HOST=db
POSTGRES_PORT=5432
# Redis
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_DB_CACHE=1
REDIS_DB_CHANNEL=2
# 42 OAuth
OAUTH_CLIENT_ID=your_42_client_id
OAUTH_CLIENT_SECRET=your_42_client_secret
OAUTH_REDIRECT_URI=your_redirect_uri
OAUTH_AUTHORIZE_URL=https://api.intra.42.fr/oauth/authorize
OAUTH_TOKEN_URL=https://api.intra.42.fr/oauth/token
OAUTH_USER_API_URL=https://api.intra.42.fr/v2/me
# 저장소 클론:
git clone [repository-url]
cd back_end
# 개발 서버 시작:
docker-compose -f docker-compose.local.yml up --build
# 프로덕션 환경:
docker-compose up --build
서버 접속:
- API:
http://localhost:8000/api/ - WebSocket:
ws://localhost:8000/ws/
자세한 API 문서는 API.md 파일을 참고하세요.
주요 엔드포인트:
/api/users/- 사용자 관리/api/games/- 게임 관련 작업/api/notifications/- 알림/ws/game/- 게임 웹소켓/ws/notification/- 알림 웹소켓
단순히 게임을 즐기는 것을 넘어서, 실시간 멀티플레이어 웹 게임의 백엔드를 직접 구현하여 그 작동 방식을 깊이 이해하고자 시작한 프로젝트입니다. 덕분에 평소에는 추상적으로만 이해했던 실시간 게임 서버의 내부 구조를 명확하게 파악하고, 필요시 분석 및 수정까지 가능한 수준으로 이해도를 높일 수 있었습니다.
- WebSocket 기반 실시간 통신: Django Channels를 활용한 양방향 실시간 통신을 구현하여 지연 없는 게임플레이를 구현했습니다. 특히 240 FPS의 게임 엔진과 60 FPS의 클라이언트 간의 최적화된 상태 동기화를 달성했습니다.
- 물리 엔진 구현: 충돌 감지, 반사각 계산, 속도 벡터 처리 등 게임 물리를 Python으로 구현하며 게임 서버의 핵심 로직을 이해했습니다.
- 상태 관리: 다중 사용자의 게임 상태를 실시간으로 관리하고 동기화하는 과정에서 분산 시스템의 동시성 처리를 경험했습니다.
- 마이크로서비스 구조: 인증, 게임, 알림, 사용자 관리를 독립적인 Django 앱으로 분리하여 확장 가능한 아키텍처를 설계했습니다.
- 캐싱 전략: Redis를 활용한 게임 상태 및 사용자 세션 캐싱으로 성능을 최적화했습니다.
- 보안: JWT 기반 인증, OAuth 통합, HTTPS/SSL 설정을 통해 안전한 서비스 환경을 구축했습니다.
- 코드 품질: pre-commit 훅을 통한 자동화된 코드 검사와 포맷팅으로 일관된 코드 스타일을 유지했습니다.
- 테스트 자동화: 단위 테스트와 통합 테스트를 구현하여 안정적인 서비스 품질을 보장했습니다.
- 문서화: API 문서화를 통해 프론트엔드 팀과의 효율적인 협업 환경을 구축했습니다.
Languages & Frameworks:
Databases:
Authentication & Authorization:
Infrastructure & DevOps:
Protocols & APIs:
Space-Pin-Pong/
├── apps/ # Django 애플리케이션
│ ├── accounts/ # 인증 및 계정 관리
│ ├── games/ # 게임 로직 및 매칭
│ ├── notifications/ # 실시간 알림 시스템
│ └── users/ # 사용자 프로필 및 친구 관리
├── config/ # 프로젝트 설정
│ ├── settings/ # 환경별 설정
│ │ ├── base.py # 기본 설정
│ │ └── local.py # 개발 환경 설정
│ ├── urls.py # URL 라우팅
│ └── asgi.py # ASGI 설정
└── entrypoint/ # Docker 진입점 스크립트
- 게임 엔진: 내부 240 FPS, 클라이언트 60 FPS
- 필드 크기: -500 ~ 500 (X축), -250 ~ 250 (Y축)
- 패들 크기: 10x100 단위
- 공 반지름: 7 단위
- 공 속도: 1000 단위/초
- 패들 속도: 500 단위/초
- 승리 조건: 15점 선취
- 1대1 원격
- 실시간 매칭
- 게임 코드로 초대
- 로컬 게임
- 한 기기에서 두 명이 플레이
- AI 대전
- 컴퓨터와 대결
- 토너먼트
- 4인 토너먼트
- 준결승/결승 방식
- 승자 투표 시스템
python manage.py testpython manage.py makemigrations
python manage.py migrate프로젝트는 다음 도구들을 사용하여 코드 품질을 관리합니다:
- Black: 코드 포맷터 (최대 라인 길이: 120)
- isort: 임포트 문 정렬
- mypy: 타입 체크 (django-stubs 포함)
- flake8: 린터 (최대 라인 길이: 120)
pre-commit 설정:
# pre-commit 설치
pip install pre-commit
# pre-commit 훅 설치
pre-commit install이 프로젝트는 42 School 교육과정의 일부이며, 해당 라이선스 조항을 따릅니다.