ISSUE · 원인 확정 · 픽스 PR 오픈

PPI-1174 — 진행자 네트워크 재연결 후 그룹 모니터링 뱃지 복구 안 됨

마지막 업데이트 2026-07-30

작성 2026-07-30 브랜치 PPI-1174 PR #942 영역 모니터 대시보드 · 통합 모니터링

한 줄 결론

진행자측 네트워크 순단으로 소켓이 새 socket.id로 재연결되면 그룹 카드뷰의 group-monitoring-claim peer가 재등록되지 않는다. 진행자는 카드뷰를 계속 보고 있는데도 서버 입장에선 "그룹 모니터링 중인 진행자 없음"이 되어, 통합 모니터링 진행자 뱃지가 회색으로 남는다. 새로고침 전까지 유지된다.

2026-04-25 통합 모니터링 도입(#496) 이후 상시 존재해온 누락이다. 같은 문제를 룸 단위에서는 PPI-1012(3c143f4b, #714)에서 이미 고쳤지만, 그룹 훅에는 같은 패치가 들어가지 않았다.

"표시 버그"로 축소하면 안 되는 이유
소실된 것은 뱃지 상태값이 아니라 서버의 클레임 peer 자체다. 뱃지 외에 그룹 "진행자 내보내기" 대상 누락, monitor-group-{groupId} 룸 구독 끊김(그룹 알림·아동 전송상태 미수신)이 함께 따라온다.

인과 체인

진행자측 네트워크 순단 (transport close) ↓ 서버 disconnect 핸들러가 socketId 일치하는 peer 전부 삭제 ↓ presence · 룸 미디어 peer · group-monitoring-claim 모두 제거 Socket.IO 자동 재연결 (새 socket.id) ↓ presence 재등록 O (use-monitor-socket 의 connect 핸들러 → MONITOR_CONNECTED) 룸 미디어 재조인 O (use-monitor-session) HOST_START_GROUP_MONITORING 재발송 X ← hasStartedRef 가드로 최초 1회만 발송 ↓ connectedHosts 에 그룹 클레임 없음 → 대시보드는 assignedHostName 만 남김 ↓ 통합 모니터링 진행자 뱃지 회색 유지 (+ 내보내기 대상 누락 + monitor-group 알림 끊김) ↓ 진행자 새로고침 → 훅 재마운트 → 클레임 재생성 → 뱃지 복구

실사례 타임라인 — 진행자 리나 / 그룹 80ed8d8d (2026-07-30)

09:20:50 카드뷰 진입 · 소켓 pWI2Ya-AvRLUydJpAASl → 클레임 group-monitoring:892ff4b4:80ed8d8d:pWI2Ya… 생성 (뱃지 파랑)
09:23:17 transport close → 서버가 같은 socketId peer 전부 정리 (클레임 포함)
09:23:19 재연결 U7mRkIrTyf6jMJsQAAS3 · Monitor 리나 connected(presence)만 복구, started monitoring group 없음
09:25:34 두 번째 transport close → 재연결 vTNsD0yhaACdAaPXAATW, 역시 클레임 미복구
09:30~09:51 Guest step updated · Host transport state … RTT 7~8ms 정상 — 화면·스텝 동기화는 멀쩡
09:48:45 스크린샷: 리나 회색 칩 (같은 화면의 해나는 파랑)
09:51:41 새로고침 → started monitoring group 80ed8d8d 뱃지 복구
대조군 — 같은 화면의 해나(파란 칩)
해나의 그룹 클레임은 09:27:28 생성 후 해당 소켓에 disconnect가 없었다. 즉 "누가 순단을 겪었는가"만으로 회색/파랑이 갈렸다.

왜 뱃지만 살아나지 않는가 — 복구되는 것 / 안 되는 것

상태재연결 복구 경로결과
presence peer use-monitor-socket.ts connectMONITOR_CONNECTED 복구
룸 미디어 peer
{hostId}-{roomId}-{tabId}
use-monitor-session.ts:325 재조인 복구 (영상·스텝 동기화 정상)
룸 모니터링 클레임
(1:1 포커스뷰)
use-room-monitoring.ts:145-166 — PPI-1012에서 추가 복구 (카드뷰는 이 훅을 쓰지 않음)
그룹 모니터링 클레임
group-monitoring-claim
없음hasStartedRef 가드로 최초 1회만 발송 미복구 ← 본 이슈

뱃지 판정이 클레임 단일 경로인 근거

통합 모니터링 카드의 파란 칩은 live-sessions.tsx:199monitoringNames로 결정되고, 그 소스는 ① 포커스뷰 모니터(session.monitoringHostName) ② groupMonitorsByGroupId(connectedHosts 중 peerKind === "group-monitoring-claim") 둘뿐이다. 카드뷰의 룸 미디어 peer는 monitoringRoomId가 없어 getRoomListisMonitoring 판정에 들어가지 않는다. 따라서 카드뷰 진행자의 유일한 표시 근거가 그룹 클레임이다.

동반 영향

  1. 뱃지 회색broadcast-utils.ts getConnectedHosts에서 제외
  2. 그룹 "진행자 내보내기" 대상 누락peersHandlers.ts:112,141monitoringGroupId + claim peerKind로 monitors를 뽑는다
  3. monitor-group-{groupId} 룸 이탈 — 클레임 등록 시 socket.join(monitoring-handlers.ts:308)하므로, 재조인이 없으면 GUEST_TRANSPORT_STATE(아동 전송상태)·GROUP_ALERT_BROADCAST를 못 받는다. 카드뷰는 getRoomMonitors(monitoringRoomId 필요) 대상이 아니라 이 룸 경로에만 의존한다

판별법

1. 서버 (Grafana Loki · ppi-socket-prod)

# 클레임 생성/삭제 대조 — 삭제 뒤 재등록 로그가 없으면 확정
{instance="ppi-socket-prod"} |= "monitoring group"
{instance="ppi-socket-prod"} |= "<hostId 앞 8자>" |~ "Cleaning up peer|monitoring group"

2. 클라이언트 (LogRocket · 진행자 세션)

3. 대조 (1:1은 정상이라는 확인)

# 같은 시간대 룸 클레임은 재등록된다 (PPI-1012 경로)
09:23:13  Cleaning up peer monitoring:2bf8a401…-monitoring-ac9ed028…_30 after disconnect
09:23:35  Host 2bf8a401…-monitoring-ac9ed028…_30 started monitoring ac9ed028…_30   ← 자동 재등록

수정 내용

apps/web/features/monitor/group-monitoring/model/use-group-monitoring.ts 한 파일. 서버 변경 없음.

+ const hasRegisteredRef = useRef(false);

  const emitStart = useCallback(() => {
    socket.emit(SOCKET_EVENTS.HOST_START_GROUP_MONITORING, { groupId, hostId, displayName });
+   hasRegisteredRef.current = true;
  }, [groupId, hostId, hostName]);

+ // 소켓 재연결 시 그룹 카드뷰 클레임 재등록 (룸 단위는 PPI-1012)
+ useEffect(() => {
+   const handleReconnect = () => {
+     if (hasRegisteredRef.current) emitStart();
+   };
+   socket.on("connect", handleReconnect);
+   return () => { socket.off("connect", handleReconnect); };
+ }, [emitStart]);
검증 현황
tsc --noEmit 통과(잔여 에러는 .next 생성 타입의 기존 이슈). 실동작(순단 → 뱃지 복구)은 브라우저 확인 필요: 카드뷰 탭에서 DevTools Network offline→online 토글 → 콘솔 [useGroupMonitoring] Socket reconnected, re-registering group monitoring claim 확인 → 대시보드 홈 탭에서 칩이 파란색으로 돌아오는지 확인. 소켓 서버 로그에 started monitoring group이 다시 찍히는지도 함께 본다.

교훈 · 재발 방지

관련 자료