화면 공유 (host→guest) — 코드레벨 동작 흐름 P2코드레벨

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

화면 공유 (host→guest) — 코드레벨 동작 흐름 P2 코드레벨: 입력: 개요 · 범위, 주요 처리 단계: 캡처 · 해상도 제약 startScreenShare L75–152, 결과: 파일 · 라인 레퍼런스 흐름
동작 흐름 요약
  1. 입력: 개요 · 범위
  2. 주요 처리 단계: 캡처 · 해상도 제약 startScreenShare L75–152
  3. 결과: 파일 · 라인 레퍼런스
문서 읽는 법 · 설명식

이 문서는 이렇게 읽으면 됩니다

화면 공유 (host→guest) — 코드레벨 동작 흐름의 핵심을 설명식으로 먼저 안내합니다. 기술적 결론과 원문 근거는 아래 본문에 보존되어 있습니다.

핵심 흐름 펼쳐 보기
  1. 비유와 핵심 질문으로 먼저 전체 구조를 잡습니다.
  2. 실제 컴포넌트·파일·데이터 흐름을 따라 내려갑니다.
  3. 코드 라인과 주의사항에서 구현 근거를 확인합니다.
  • 개요 · 범위
  • 핸드셰이크 시퀀스
  • 캡처 · 해상도 제약 startScreenShare L75–152
작성일: 2026-06-14 대상: 개발자 — 치료사 화면 공유 흐름 파악 핵심 파일: hooks/use-screen-share.ts

개요 · 범위

치료사(호스트)가 자기 화면을 아동(게스트)에게 실시간 공유하는 기능. getDisplayMedia로 화면을 캡처해 V1 P2P(#11, connectionId="screen-share")로 전송한다.

host 전용 시작: 시작은 호스트만(role==="host"). 게스트는 수신 전용. 시그널링은 소켓, 미디어는 useWebRTC P2P(#11)를 그대로 재사용.

핸드셰이크 시퀀스

[호스트] startScreenShare → getDisplayMedia(video 제약, audio) → emit host-screen-share-start2 [게스트] handleHostScreenShareStart → webRTC.connect() → emit guest-screen-share-ready [호스트] handleGuestScreenShareReady → webRTC.connect() → addTrack(video/audio) [게스트] useWebRTC.onTrackReceived → 화면 렌더 [종료] 호스트 stopScreenShare → emit host-screen-share-stop2 → 게스트 webRTC.disconnect()

"게스트 준비 후 트랙 추가" 순서: 호스트가 stream을 먼저 잡아두고(start2), 게스트가 P2P 연결을 깔고 ready를 보내야(ready) 호스트가 트랙을 add한다. 게스트 준비 전 add하면 트랙이 유실될 수 있다.

캡처 · 해상도 제약 startScreenShare L75–152

  • getDisplayMedia({video: VIDEO_CONSTRAINTS, audio: true}) — 오디오 포함 시도(브라우저 미지원이면 영상만 진행, 경고).
  • 고해상도 다운스케일: 캡처 width > 1280이면 applyConstraints(LOW_RESOLUTION_CONSTRAINTS)로 낮춤(아동 기기/대역폭 보호).
  • 오디오 트랙 enabled는 isAudioEnabled 토글로 제어.

트랙 추가 · 자동 종료 handleGuestScreenShareReady L241

  • 게스트 ready 수신 → webRTC.connect() → stream의 video/audio 트랙을 webRTC.addTrack(P2P 송신, onnegotiationneeded #11).
  • 브라우저 "공유 중지" 연동: video track.onended(사용자가 브라우저 UI에서 공유 중지) → stopScreenShare() 자동 호출.
  • 종료: 호스트 stop → cleanup(트랙 stop) + host-screen-share-stop2 → 게스트 webRTC.disconnect().

함정 · 주의

  • 준비 후 add 순서 준수: start2 → guest ready → addTrack. 순서를 줄이면(게스트 미준비 시 add) 화면이 안 뜸.
  • connectionId="screen-share" 격리: 세션 릴레이(session-audio)·미디어(host-audio)와 같은 useWebRTC지만 connectionId가 달라 시그널링이 분리. connectionId 누락 시 다른 P2P와 이벤트 교차(#11).
  • 오디오 미지원 브라우저: getDisplayMedia audio가 없을 수 있음 → 영상만 진행. includeAudio 기대 시 분기 필요.
  • 고해상도 부하: 1280 초과는 다운스케일하지만, 아동 기기 동시 디코드 부하 고려(영상 끊김 bug와 동일 맥락).
  • track.onended 자동 종료: 브라우저 UI 공유 중지와 앱 stop이 둘 다 cleanup을 부른다 — 중복 호출 idempotency 확인.

파일 · 라인 레퍼런스

파일/심볼역할
use-screen-share.ts (startScreenShare L75, handleGuestScreenShareReady L241)화면 공유 본체
use-web-rtc.ts (connectionId screen-share)P2P 전송(#11)
components/sections/share-screen.tsx화면 공유 UI