BUG ANALYSIS · 2026-06-30

자동전환 OFF 대기 중 설정 후 영상이 자동전환되는 이슈

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

재현경로: 게스트 수업 대기(고양이 화면) → 호스트 수업 진입 → 자동전환 OFF 변경 후 대기 → 수업 시작 → 영상 종료 시 다음 스텝으로 자동 전환

문제 타이틀

자동전환 OFF가 게스트 영상 종료 로컬 전환에 반영되지 않는 상태 분리 버그

강한 원인 후보

호스트 설정 모달의 settings.autoTransitionEnabled와 SFU room의 autoTransitionEnabled가 별도 상태로 유지된다.

핵심 반례

monitor-dashboard의 useRoomAutoTransition으로 OFF하면 SFU room에 반영되어 게스트로 브로드캐스트된다.

1. 이슈 요약

2. 최종 재현 경로

게스트가 /client-guest/session으로 진입하고 수업 대기(고양이 화면) 상태가 된다.
소켓 서버는 room/router를 만들 때 autoTransitionEnabled: true를 기본값으로 둔다.
호스트가 /app/main/meet/[roomId]에 들어와 설정 모달에서 자동전환을 OFF로 바꾼다.
이 설정 변경은 components/pages/host.tsx의 로컬 settings만 갱신한다. SFU room 상태에는 SET_AUTO_TRANSITION을 보내지 않는다.
호스트가 게스트 입장을 승인하면 서버는 여전히 room 기본값인 autoTransitionEnabled: trueguest-approved2 payload로 보낸다.
게스트는 이 값을 세션 상태에 저장하고, 영상 종료 시 autoTransitionEnabled === true로 판단해 goToNextStep()을 호출한다.
결과적으로 호스트 UI에서는 OFF처럼 보였지만, 게스트 로컬 영상 종료 경로에서는 ON 상태로 동작한다.

3. 코드 레벨 원인

A. 서버 room 기본값은 ON

apps/socket/src/mediasoup/routerManager.ts:24-34
room = {
  ...,
  autoTransitionEnabled: true, // default: true for new system
}

getAutoTransitionEnabled()도 room이 없으면 true를 반환한다(routerManager.ts:140-142). 따라서 명시적으로 SFU room 상태를 OFF로 바꾸지 않으면 게스트가 받는 값은 ON이다.

B. 게스트 입장/승인 시 서버 값이 전달된다

apps/socket/src/sfu-socket/handlers/room-handlers.ts:171-184
const autoTransitionEnabled = routerManager.getAutoTransitionEnabled(roomId);
socket.to(guestId).emit(SOCKET_EVENTS.GUEST_APPROVED2, {
  resourceFileNames,
  autoTransitionEnabled,
  externalSttEnabled,
});

게스트는 이 값으로 pendingAutoTransitionEnabled와 세션 상태를 세팅한다.

apps/web/entities/guest-socket/model/use-guest-socket.ts:97-101
setPendingAutoTransitionEnabled(data.autoTransitionEnabled ?? true);
apps/web/entities/guest-page-session/model/use-guest-page-session.ts:625-635
setAutoTransitionEnabled(enabled);
aiSessionRef.current.updateAutoTransitionEnabled(enabled);

C. 호스트 설정 모달은 로컬 settings만 바꾼다

apps/web/components/pages/host.tsx:984-1012
const handleSettingsConfirm = (newSettings) => {
  ...
  setSettings(newSettings);
  ...
}

여기에는 SOCKET_EVENTS.SET_AUTO_TRANSITION, sessionRelay.toggleAutoTransition(), 또는 SFU room 상태 갱신 호출이 없다. 즉 “수업 시작 전 자동전환 OFF”가 게스트가 참조하는 room 상태와 분리된다.

D. 영상 종료 시 게스트 로컬 전환은 게스트 상태를 기준으로 한다

apps/web/shared/ui/guest-layout-content.tsx:113-118
props.session.notifyVideoEnd();
if (autoTransitionEnabled) {
  props.session.goToNextStep();
}

따라서 게스트가 승인 payload에서 true를 받으면, 호스트 로컬 설정이 OFF여도 영상 종료 순간 게스트는 다음 스텝으로 이동한다.

4. 반증 루프

가설검증 결과판정
영상 컴포넌트가 OFF를 무시하고 항상 goToNextStep() 한다.GuestLayoutContent는 영상 종료에서 if (autoTransitionEnabled)로 게이트한다.기각
서버가 OFF 값을 게스트에게 전송하지 않는다.SFU room 상태가 OFF라면 GUEST_APPROVED2에 OFF가 실려 간다. 다만 호스트 설정 모달 변경은 SFU room 상태를 바꾸지 않는다.부분 수정
호스트 UI의 OFF와 게스트가 보는 OFF가 서로 다른 상태이다.host.tsx 로컬 settingsrouterManager.rooms[roomId].autoTransitionEnabled가 별도로 존재한다.유지

5. 정상/반례 경로

6. 의심 파일/라인

7. 해결 방향

  1. 권장: handleSettingsConfirm에서 autoTransitionChanged가 true면 SFU room에도 SOCKET_EVENTS.SET_AUTO_TRANSITION을 emit한다. 그러면 대기 중인 게스트에게도 AUTO_TRANSITION_UPDATED가 브로드캐스트된다.
  2. 보완: GUEST_APPROVED2 payload 기준도 호스트 로컬 설정이 아니라 단일 source of truth인 room 상태로 유지하되, 호스트 설정 UI가 반드시 그 상태를 갱신하게 만든다.
  3. 검증: 재현 경로에서 OFF 변경 직후 게스트 콘솔에 Auto-transition updated { enabled:false }가 찍히고, 영상 종료 후 Notifying video ended는 찍히되 Moving to next step이 없어야 한다.

8. 결론

이 이슈의 본질은 영상 컴포넌트 자체가 OFF를 무시하는 것이 아니라, 수업 시작 전 호스트 설정 모달의 OFF 값이 게스트가 사용하는 SFU room autoTransition 상태로 전파되지 않는 상태 소스 분리다. 서버 room 기본값이 ON이기 때문에, 게스트는 승인 시 ON을 받고 영상 종료 시 정상 코드 경로대로 자동 전환한다.