[PonsLink] 실시간 방에서 상태가 어긋나는 순간을 먼저 봐야 했다
실시간 방은 처음 들어갈 때보다 다시 들어올 때 더 어렵다. 처음 입장은 빈 상태를 만들면 된다. 이미 채팅이 쌓이고 파일이 공유되고 화면 권한이 바뀐 뒤에 돌아오는 사람은, 연결만 성공하면 되는 게 아니라 같은 맥락으로 돌아와야 한다.
처음에는 그 차이를 얕봤다. 카메라와 마이크가 켜지는지, ICE가 붙는지처럼 눈에 보이는 연결 문제부터 고쳤다. 로그에 재연결 성공이 찍히면 일단 안심했다. 그런데 사용자 기억에 남는 사고는 다른 얼굴이었다. 한 사람은 새 파일을 보고, 다른 사람은 옛 목록을 본다. 권한은 서버에서 바뀌었는데 UI는 예전 버튼을 보여 준다. 연결은 살아 있는데 방이 둘로 쪼개진 느낌이 난다. 사용자는 그 장면을 재연결 실패가 아니라 “이 제품이 거짓말한다”로 읽는다.

연결 성공과 상태 일치가 다른 문제인 이유
재연결 이벤트는 통신 이벤트처럼 보이지만, 제품 안에서는 상태 재조립 트리거다. 소켓이 다시 열렸다는 사실만으로는 채팅 커서, 파일 전송 진행, 참가자 권한, 현재 화면 모드가 같은 시각을 가리킨다는 보장이 없다.
스냅샷만 있으면 지금 일어나는 변화가 늦다. 이벤트 스트림만 있으면 중간에 들어온 사람은 맥락을 모른다. 방은 현재 상태를 한 번에 보여주는 층과, 이후 변화를 밀어주는 층을 같이 가져야 했다. 둘 중 하나만 믿으면 복구가 반쪽이다.
특히 같은 “재연결”이라는 이름 아래 서로 다른 복구가 필요하다. 노트북이 잠겼다 돌아온 사람, 휴대폰으로 다시 들어온 사람, 방 안에서 권한만 바뀐 사람은 필요한 진실의 범위가 다르다. 이벤트 이름에 속지 않고, 어떤 스냅샷을 다시 그릴지부터 갈라야 했다.

현장에서 먼저 드러난 실패 신호
영상이 연결되어 있는데 채팅이 늦게 붙거나, 공유 파일 상태가 사람마다 다르거나, 관리 권한이 바뀌었는데 메뉴가 그대로면 사용자는 세부 원인을 따지지 않는다. 그냥 불안해한다. 그 불안은 단일 버그 티켓보다 오래 남는다.
재현이 어려울수록 변명처럼 들린다. “우리 로그에는 재연결 성공으로 찍혀 있습니다”는 내부 문장일 뿐이다. 화면이 어긋난 순간 제품의 공유 진실은 이미 깨져 있다. 연결 로그가 깨끗해도 참가자 사이에 보이는 세계가 다르면, 그 제품은 신뢰 경쟁에서 진다.
그래서 지표의 우선순위를 바꿨다. 재연결 성공률만 올려 놓고 끝내지 않기로 했다. 돌아왔을 때 핵심 상태가 같은지를 복구의 정의로 두었다. 다시 붙는 것만으로는 부족하다. 같아야 한다.
재진입에서 상태가 갈라진 순간
서버가 권위로 들고 있어야 할 것과, 세션 임시값으로 버려도 되는 것을 나눴다.
권한, 방 구성, 공유 자원의 확정 상태는 서버 스냅샷을 다시 받는 쪽으로 모았다. 로컬에만 있던 UI 잔상이나 진행 중 애니메이션 값은 재진입 시 미련 없이 버린다. 버린 뒤 서버 진실로 다시 그린다. “로컬이 더 최신일 수도 있다”는 감에 기대면, 사람마다 다른 최신이 생긴다.
재동기화 중에는 조용히 덮지 않기로 했다. 화면이 맞춰지는 동안 사용자가 옛 버튼을 누르면 충돌이 커진다. 짧게라도 상태를 맞추는 중이라는 문장을 보여주고, 맞춘 뒤에 입력을 받는 편이 싸게 먹혔다.
충돌이 났을 때의 규칙도 미리 적었다. 같은 파일을 두 관점이 다르게 알고 있으면 어느 쪽을 살릴지, 이벤트 순서와 스냅샷 버전 중 무엇을 최종으로 볼지를 재연결 핸들러 밖에서 정해 두지 않으면, 복구 코드가 즉석 중재자가 된다. 즉석 중재는 재현 불가능한 사고를 만든다.

UI와 지원 문장에 남긴 것
내부 상태 이름과 사용자 문장을 먼저 맞추려 했다. 개발 용어를 화면에 흘리면 사용자는 배우지 않고 제품이 어렵다고만 학습한다. “재연결 중”과 “방 상태 맞추는 중”은 같은 소켓 이벤트에서 나와도 사용자에게 다른 기대를 만든다. 후자가 정직하다.
지원 답변도 같은 이름을 쓰게 했다. 로그 필드, 화면 카피, 고객 답변이 서로 다른 단어를 쓰면 같은 사고를 세 번 설명하게 된다. 상태 기계와 문장이 같아야 운영 비용이 줄어든다.
마치며
스냅샷과 이벤트 이중 구조는 구현과 테스트 비용이 크다. 재진입 시나리오를 권한 변경, 절전, 네트워크 전환, 다중 탭까지 나눠 보면 끝이 잘 안 보인다. 그래도 연결 성공만 자랑하는 제품보다는, 돌아왔을 때 같은 방을 보여 주는 제품이 오래 간다.
이 글의 판단은 단순하다. 실시간 방에서 복구의 본체는 통신 재수립이 아니라 공유 진실의 재조립이다. 그 순서를 늦게 배울수록, 사용자는 끊김보다 어긋남을 더 오래 기억한다.