1. 프로젝트 소개

이번 프로젝트는 단순한 게임 구현을 넘어, 실시간성보안에 초점을 맞춘 **'UNO Multiplayer Game'**입니다. 2~4인이 실시간으로 방을 만들어 카드 게임을 즐길 수 있으며, Spring BootReact라는 현대적인 기술 스택을 활용해 안정적인 게임 환경을 구축했습니다.

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

 

반응형

+ Recent posts