1. 프로젝트 소개
이번 프로젝트는 단순한 게임 구현을 넘어, 실시간성과 보안에 초점을 맞춘 **'UNO Multiplayer Game'**입니다. 2~4인이 실시간으로 방을 만들어 카드 게임을 즐길 수 있으며, Spring Boot와 React라는 현대적인 기술 스택을 활용해 안정적인 게임 환경을 구축했습니다.
2. 사전 요구사항 (Prerequisites)
이 프로젝트를 실행하기 위해 필요한 개발 환경입니다.
- Backend: Java 21 이상
- Frontend: Node.js 18 이상
3. 주요 핵심 기능
- 🌐 WebSocket(STOMP) 기반 실시간 동기화
- Pub/Sub 모델을 활용해 게임 내 모든 액션(카드 내기, 드로우, 턴 변경)을 실시간으로 모든 플레이어에게 전송합니다.
- 🛡️ 서버 사이드 룰 엔진 (UnoRuleEngine)
- 클라이언트가 아닌 서버에서 모든 게임 로직을 관리합니다. 특히 손패 정보를 서버에서만 보관하여 클라이언트 변조를 통한 치트를 원천 차단했습니다.
- 🃏 UNO 오리지널 룰 완벽 구현
- 숫자 카드는 물론 SKIP, REVERSE, +2, WILD, +4 등 특수 카드를 모두 구현했습니다.
- 2인 플레이 시 REVERSE가 SKIP으로 작동하는 세부 룰까지 적용되어 있습니다.
- 🏠 로비 및 방 시스템
- 6자리 초대 코드를 통해 친구와 같은 방에 입장하여 게임을 시작할 수 있습니다.
4. 기술적 의사결정 및 아키텍처
- Java 21 Record 활용: 카드(Card) 정보를 불변 값 객체인 record로 선언하여 데이터 무결성을 보장했습니다.
- In-Memory Store: 게임 데이터의 휘발성을 고려하여 ConcurrentHashMap 기반의 메모리 저장소를 구현, Redis 없이도 멀티스레드 환경에서 안전하게 데이터를 관리합니다.
- Zustand 상태 관리: 프론트엔드에서는 가벼운 Zustand를 사용해 WebSocket으로 넘어오는 실시간 게임 상태를 효율적으로 처리합니다.
5. 프로젝트 구조
- Backend: UnoRuleEngine(도메인 로직), GameService(흐름 제어), STOMP Controller 등으로 분리되어 유지보수가 용이합니다.
- Frontend: Lobby, WaitingRoom, GameBoard로 이어지는 직관적인 페이지 구조와 useWebSocket 커스텀 훅을 통한 통신 관리가 특징입니다.
6. 마치며
단순한 토이 프로젝트를 넘어 WebSocket 통신과 서버 측 유효성 검사 로직을 깊게 고민해 볼 수 있었던 프로젝트였습니다. 실시간 멀티플레이어 게임 개발의 메커니즘을 이해하고 싶은 분들에게 좋은 참고 사례가 될 것입니다.
📌 GitHub Repository: https://github.com/wjsskagur/uno-game