이번 주는 웹소켓을 활용한 마피아 게임 개발에서 많은 문제를 해결하는 과정의 연속이었다. 특히 유저의 세션 관리, 브로드캐스팅 지연, 연결 종료 감지 관련한 이슈들이 계속 발생했다.
✔ 유저 재접속 시 세션 유지 문제 해결
socket.id
가 아닌 userId
를 기반으로 기존 세션을 복구하도록 수정 ✔ 이벤트 브로드캐스팅 지연 문제 해결
io.to(roomId).emit()
방식을 활용하여 모든 유저가 동시에 이벤트를 받을 수 있도록 개선 ✔ 소켓 연결 종료 감지 개선
disconnect
이벤트가 지연되거나 호출되지 않는 문제를 해결하기 위해 disconnecting
이벤트 활용 pingTimeout
을 조정하여 유저의 네트워크 연결 상태를 더 빠르게 감지 이번 주는 정말 정신없이 바빴다. 🤯
웹소켓 기반의 실시간 시스템이 생각보다 훨씬 예민하고, 단순한 로직처럼 보여도 실제 구현 과정에서는 많은 변수가 존재한다는 것을 체감했다.
디버깅이 어렵고, 한 가지 문제가 해결되면 또 다른 문제가 튀어나왔다.
재접속 문제를 해결하면, 이벤트 브로드캐스팅이 꼬이고
브로드캐스팅을 고치면, 연결 해제 감지가 늦게 되고...
하지만 문제를 해결할 때마다 성취감을 느꼈고, 코드가 점점 개선되는 걸 보면서 뿌듯했다.
특히 Redis를 도입하고, 클라이언트 재접속 문제를 해결했을 때 "이제 제대로 동작하는구나!"라는 느낌을 받았다.
네트워크와 실시간 이벤트를 다루는 데 자신감이 조금 붙었다.
하지만 아직도 개선해야 할 부분이 많다는 생각에 완벽하게 해결했다는 느낌은 들지 않는다.
이제 좀 더 체계적으로 설계를 다듬고, 테스트를 강화해야 할 것 같다.
이번 주에 배운 가장 중요한 것들:
웹소켓 기반의 실시간 시스템에서는 "세션 관리"가 핵심이다.
단순히 socket.id
를 사용하면 재접속 시 새 ID가 부여되어 기존 정보를 유지할 수 없다.
따라서 userId
또는 sessionId
기반으로 유저를 관리해야 한다.
Redis 같은 외부 저장소를 활용하면 확실한 상태 관리를 할 수 있다.
브로드캐스팅 이벤트는 신중하게 관리해야 한다.
socket.emit()
은 개별 전송이므로, 브로드캐스팅하려면 io.to(roomId).emit()
같은 방 단위 전송을 활용해야 한다.
클라이언트 네트워크 상태에 따라 이벤트가 손실될 가능성이 있으므로, 패킷 로깅 및 재전송 메커니즘도 고려해야 한다.
웹소켓 연결 종료 감지는 여러 가지 방법이 있다.
disconnect
이벤트가 호출되지 않는 경우도 있으므로, disconnecting
을 활용하면 더 정확하게 감지할 수 있다.
pingTimeout
을 조정하면 네트워크가 끊긴 유저를 더 빠르게 감지할 수 있다.
추가로, 클라이언트에서 heartbeat
을 주기적으로 보내는 방식도 고려할 수 있다.
다음 주부터는 이번 주에 배운 내용을 기반으로 더 나은 시스템을 만들 계획이다.
Redis를 활용한 유저 세션 복구 시스템 최적화
현재는 단순한 userId
기반 복구지만, 게임 상태까지 저장하는 방식으로 확장할 예정
브로드캐스트 이벤트 로직 테스트 및 최적화
여러 네트워크 환경에서 지연이 발생하지 않는지 테스트
이벤트 로깅 및 모니터링 시스템 도입
네트워크 상태에 따른 유저 연결 관리 개선
pingTimeout
조정뿐만 아니라, 클라이언트에서 주기적으로 heartbeat
을 보내는 방식도 실험할 계획
이번 주는 해결해야 할 문제들이 많았지만, 그만큼 성장할 수 있었던 한 주였다. 다음 주는 더욱 체계적으로 설계하고, 테스트를 강화하는 방향으로 발전해야겠다!