프로젝트: 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
브라우저 게임은 UDP를 쓸 수 없어 TCP 위의 WebSocket(STOMP) 으로 캐릭터 위치를 동기화해야 했습니다.
이 구조에서 생기는 이동 지연·끊김과 입장 시점 상태 불일치를 줄이기 위해
① 클라이언트 전송 빈도 제한(Throttle), ② 선형 보간(Lerp), ③ 서버 역할 분리, ④ 접속/퇴장 이벤트 브로드캐스트,
⑤ 신규 입장자 초기 상태 동기화(SYNC)를 단계적으로 적용했습니다.
| 구분 | TCP | UDP |
|---|---|---|
| 전달 보장 | 보장 (손실 시 재전송) | 보장 안 함 |
| 순서 보장 | 보장 | 보장 안 함 |
| 지연 특성 | 패킷 하나가 유실되면 뒤 패킷이 모두 대기 (Head-of-Line Blocking) | 유실된 패킷만 버리고 다음 패킷 바로 처리 |
| 실시간 게임 적합성 | 낮음 | 높음 |
위치 데이터는 "최신 값 하나만 의미 있는" 데이터입니다. 100ms 전 위치가 유실됐다면 다시 받을 필요 없이 다음 위치를 쓰면 됩니다.
그래서 FPS·MMO 같은 게임은 UDP 위에 필요한 신뢰성만 직접 구현합니다.
결론: 프로토콜 자체를 바꾸기보다, "TCP라는 제약 안에서 체감 지연을 얼마나 줄일 수 있는가" 를 과제로 잡았습니다.