오늘 하루 동안 웹소켓을 활용한 마피아 게임에서 몇 가지 주요한 문제가 발생했다.
클라이언트의 재접속 시 기존 세션 유지 문제
이벤트 브로드캐스팅 지연
소켓 연결이 끊긴 유저 처리
disconnect 이벤트가 늦게 감지되거나 아예 호출되지 않는 경우가 있었음. 기존 세션 유지 문제 해결
socket.handshake를 활용하여 기존의 userId를 저장하고, 재접속 시 기존 세션을 찾도록 변경.
Redis를 사용하여 유저의 연결 상태를 관리하고, 재접속 시 기존 정보를 불러오도록 수정.
브로드캐스팅 지연 문제 해결
socket.emit을 활용하는 방식 대신 io.to(roomId).emit()을 사용하여 특정 방에 있는 모든 클라이언트가 동일한 타이밍에 받을 수 있도록 수정.
네트워크 지연을 의심하여 WebSocket 패킷 로깅을 추가하여 문제를 추적.
소켓 연결 해제 감지 개선
disconnecting 이벤트를 활용하여 클라이언트의 연결이 해제되기 직전에 유저 상태를 업데이트하도록 변경.
pingTimeout을 줄여서 네트워크가 끊어진 유저를 더 빠르게 감지하도록 설정.
세션 유지는 웹소켓 기반의 실시간 애플리케이션에서 필수적인 기능이다. Redis 같은 외부 저장소를 활용하면 더 안정적으로 관리할 수 있다.
브로드캐스팅은 단순한 emit이 아니라 네트워크 지연을 고려해야 한다. 로깅을 적극 활용하여 실시간 이벤트가 정확하게 전달되는지 확인하는 것이 중요하다.
유저의 연결 종료를 감지하는 방법은 여러 가지가 있다. disconnecting을 활용하는 것이 더 빠르고 정확할 수도 있다.
내일 할 일: