프로젝트: Snowpeak Game — 실시간 멀티플레이 협동 타이쿤 게임 기간: 2025.12.15 ~ 2026.01.07 (커밋 309dae5 ~ 957ab29) 스택: Java 17, Spring Boot 3.x, Spring WebSocket(STOMP + SockJS), Redis(Lettuce), React + Phaser 3, @stomp/stompjs


1. 한 줄 요약

브라우저 게임은 UDP를 쓸 수 없어 TCP 위의 WebSocket(STOMP) 으로 캐릭터 위치를 동기화해야 했습니다.

이 구조에서 생기는 이동 지연·끊김과 입장 시점 상태 불일치를 줄이기 위해

① 클라이언트 전송 빈도 제한(Throttle), ② 선형 보간(Lerp), ③ 서버 역할 분리, ④ 접속/퇴장 이벤트 브로드캐스트,

⑤ 신규 입장자 초기 상태 동기화(SYNC)를 단계적으로 적용했습니다.


2. 배경: 왜 TCP로 실시간 게임을 만들었나

2-1. 일반적인 게임 서버는 UDP를 쓴다

구분 TCP UDP
전달 보장 보장 (손실 시 재전송) 보장 안 함
순서 보장 보장 보장 안 함
지연 특성 패킷 하나가 유실되면 뒤 패킷이 모두 대기 (Head-of-Line Blocking) 유실된 패킷만 버리고 다음 패킷 바로 처리
실시간 게임 적합성 낮음 높음

위치 데이터는 "최신 값 하나만 의미 있는" 데이터입니다. 100ms 전 위치가 유실됐다면 다시 받을 필요 없이 다음 위치를 쓰면 됩니다.

그래서 FPS·MMO 같은 게임은 UDP 위에 필요한 신뢰성만 직접 구현합니다.

2-2. 그런데 이 프로젝트는 UDP를 쓸 수 없었다

결론: 프로토콜 자체를 바꾸기보다, "TCP라는 제약 안에서 체감 지연을 얼마나 줄일 수 있는가" 를 과제로 잡았습니다.