← 개발일지

친구랑 방 만들어 하면 자꾸 끊긴다 — 커스텀 방 연결 버그 모음

2기기 실증에서 시작

커스텀 방(초대 링크로 친구와 플레이)은 호스트 하나에 게스트 여럿이 붙는 별(star) 토폴로지다. 듀얼 매칭의 1:1 구조와 다르다. 기기 두 대 놓고 처음부터 끝까지 붙여보니 바로 걸렸다. 코드는 맞았는데 실기기 앞에서 자꾸 어긋났다.

TOCTOU가 세 군데서 반복됐다

duel 시그널링에서 이미 잡았던 TOCTOU(확인 시점과 사용 시점 사이 경합) 패턴이 커스텀 방에서 또 나왔다. 게스트의 answer 적용 경로, 호스트의 handleSignal 처리, 재연결 시 subscribeGuest 중복 호출까지 — 위치만 바꿔 세 번 등장했다. 패턴을 아니까 고치는 건 빨랐다. 어디 더 있을지는 grep으로 훑었다.

끊김과 강퇴를 혼동하던 문제

일시적 네트워크 끊김을 영구 강퇴로 처리하고 있었다. 와이파이가 잠깐 끊긴 사용자가 방에서 쫓겨났다. 방 정원 4인이 실제로는 강제 안 되던 문제, 게스트가 새로고침 후 재입장할 때 호스트 쪽 재배선이 막히던 문제도 같은 시기에 나왔다. 재연결 케이스를 처음부터 충분히 안 짠 결과였다.

한 명이 나가도 게임은 안 끝나야 한다

다인 방에서 한 명이 이탈하면 전체 게임이 끝나버리던 판정 로직을 다시 짰다. 2인 대전과 달리 다인 방은 누가 나가도 남은 사람끼리 계속돼야 하는데 초기 구현이 그걸 안 하고 있었다. 포기(forfeit)가 다른 참가자에게 전파 안 되던 버그, 게임 시작 직전 handshake 중간에 게스트가 방치되던 문제까지 고쳐서 아홉 개를 마감했다.

재감사 라운드에서 앞서 고쳤다고 표시했던 항목 중 하나(게스트측 처리)가 실은 절반만 고쳐진 걸 다시 발견했다. 한 번 닫힌 항목도 재확인이 필요했다.