굴 안의 너굴이
실시간 온라인 멀티플레이 숨바꼭질 게임. 플레이어는 찾는 팀과 숨는 팀으로 나뉘어 제한된 공간에서 술래잡기를 즐길 수 있으며, 다양한 아이템을 활용하여 다이나믹한 숨바꼭질을 즐길 수 있습니다.
컴퓨터실 쉬는 시간에 친구들과 하던 플래시 게임을 다시 만든 실시간 멀티플레이 게임입니다.
게임을 구현하는 것보다 300명 넘는 동시 접속을 견디는 서버와 판정을 서버 한 곳에서 하는 구조를 만드는 데 초점을 뒀습니다. 모든 판정을 서버가 하는 Server-Authority 모델로 플레이어마다 같은 게임 상태를 보게 하고, 매 프레임 전체 브로드캐스트를 이벤트가 생길 때 필요한 플레이어에게만 보내는 방식으로 바꿔 트래픽을 줄였습니다.
동시성 제어, 토큰 인증, 상태 머신으로 게임 생명주기를 관리하는 것까지 서버 쪽을 맡았습니다.
- ▸Server-authority 모델 도입으로 한 게임을 같이 즐기는 클라이언트들의 요청을 서버에서 통제하여 일관된 환경 유지
- ▸게임 진행 라이프 사이클 구현 (게임 시작, 진행, 종료 관리)
- ▸WebSocket을 활용한 실시간 멀티플레이어 동기화
- ▸아이템 효과 시스템 구현: 아이템 효과 로직, 적용 메커니즘, 지속 시간 관리, 우선순위 알고리즘 개발
- ▸인증/인가 시스템 구현
- ▸전적 집계 및 통계 시스템 개발: 쿼리 튜닝 및 인덱스 최적화를 통한 대량 데이터 조회 성능 향상, 커서 기반 페이징으로 offset 기반 페이징의 성능 문제 해결, 배치 작업 최적화를 통한 통계 집계 처리
- ▸맵 축소 전략 및 게임 밸런스 로직 개발
- ▸Selenium을 활용한 자동 QA 테스트 구현 (Web 기반 게임의 기능 및 성능 검증)
Java의 ConcurrentQueue를 활용하여 비동기 요청 처리 시스템을 구축하여 300명 이상의 동시 접속자를 안정적으로 지원했습니다. MySQL의 MVCC와 트랜잭션 격리수준을 활용하여 동시 게임 상태 업데이트 시 데이터 일관성을 보장하고, 분산환경에서의 동시성 제어를 위해 낙관적 락과 비관적 락을 적절히 조합하여 구현했습니다.
숨기·탐색·아이템·탈락 판정을 서버에서 처리하는 아키텍처로 모든 플레이어가 같은 판정 결과를 받게 했습니다.
WebSocket을 통한 양방향 실시간 통신으로 플레이어 액션과 게임 상태를 즉시 동기화했습니다.
solution300명 이상의 동시 접속자를 처리하기 위해 서버 아키텍처를 설계했습니다. 게임 로직과 네트워크 I/O를 분리하여 병목 현상을 해소하고, 비동기 처리와 스레드 풀 최적화를 통해 CPU 자원을 효율적으로 활용했습니다. 또한 동시성 제어 메커니즘을 구현하여 다수의 사용자 요청을 안정적으로 처리할 수 있도록 했습니다.
solution여러 클라이언트가 동시에 요청해도 일관된 게임 상태를 유지하기 위해 중앙 집중식 게임 로직 관리 방식을 도입했습니다. 모든 게임 로직을 서버에서 처리하고, 판정 결과를 클라이언트가 정하지 않게 해 모든 플레이어에게 동일한 게임 상태를 보장했습니다. 다만 이동 좌표는 클라이언트가 보낸 값을 그대로 반영해, 위치 조작까지 막는 구조는 아닙니다.
solution게임 상태 변경 시 필요한 플레이어에게만 선택적 브로드캐스트하도록 최적화했습니다. 프레임 기반 업데이트 대신 이벤트 기반 업데이트를 채택하여 네트워크 트래픽을 대폭 감소시키고 지연 시간을 단축했습니다.
solution여러 아이템 효과가 동시에 적용될 때의 우선순위 알고리즘을 설계했습니다. 아이템 효과 스택 관리, 지속 시간 추적, 효과 적용 순서를 정의하여 일관된 게임 밸런스를 유지했습니다. 동시 발동 시 우선순위에 따라 효과를 적용하고, 중복 효과는 효율적으로 병합하도록 구현했습니다.
solutionWeb 기반 게임의 특성을 활용하여 Selenium을 통한 자동화 테스트를 구현했습니다. 게임 플로우, 로그인/로그아웃, 게임 생성/참여 등 주요 기능에 대한 E2E 테스트를 자동화하여 수동 테스트 시간을 대폭 단축하고 배포 전 품질을 보장했습니다.
방 참가부터 게임 시작까지의 클라이언트-서버 통신 플로우: HTTP를 통한 초기 인증 및 토큰 발급, STOMP over WebSocket을 통한 실시간 게임 상태 동기화
게임의 전체 플로우: 방 생성 및 입장, 레디 상태 관리, 게임 시작 및 진행(숨기/찾기), 승패 판정까지의 게임 라이프사이클
Locust 부하 테스트: 동시 접속자 1000명 시나리오에서 게임 상태 동기화 API p95 Latency 50ms 달성
실제 동시 접속자 300명 이상 유치
Server-Authority 모델로 게임 로직을 서버에 모아 여러 클라이언트가 동시에 요청해도 같은 게임 상태를 유지했습니다. 매 프레임 전체 브로드캐스트를 이벤트 기반 선택 전송으로 바꿔 부하를 줄이고 1,000명 부하 시나리오에서 p95 Latency 50ms를 달성한 것이 가장 의미 있었습니다.
랜덤성 알고리즘, 상태 머신, 토큰 기반 인증, 비동기 처리를 한 프로젝트 안에서 모두 직접 구현해 봤습니다.
기술적 구현과 성능 최적화에 집중하는 과정에서 게임 플레이 메커니즘의 독창성이나 사용자 경험의 차별화에 대한 고민이 부족했습니다.
게임의 핵심 재미 요소와 차별화 포인트를 초기에 명확히 정의하지 못했고, 프로젝트 초반부터 사용자 테스트와 피드백을 수집하는 프로세스가 부재했습니다.
기술 스택을 고르기 전에 무엇이 이 제품의 핵심인지를 먼저 정해야 합니다. 이 게임이 왜 재미있는지를 초기에 묻지 않은 채 기술과 성능에만 집중했습니다.
재미처럼 측정하기 어려운 것도 지표를 만들어 놓고, 프로토타입 단계부터 플레이테스트를 하며 시작하는 편이 낫습니다.









