14단계
14단계 — gRPC·WebRTC 실시간 경계를 비용 가드로 닫기
0회 조회
목차
14단계 — gRPC·WebRTC 실시간 경계를 비용 가드로 닫기
실시간 기능은 연결이 된다는 이유만으로 운영 가능한 기능이 되지 않습니다. 내부 서비스 호출은 계약·deadline·fallback을 가져야 하고, 음성·영상은 브라우저 권한·NAT·릴레이 비용·세션 수명까지 제품 계약에 들어가야 합니다.
예시 서비스에 적용한 경계
gRPC는 서비스 경계에만 둔다
Java API와 Python 음성 엔진 사이에 proto/voice/v1/voice.proto를 둡니다. Synthesize, ListVoices, GetCapabilities는 명시된 메시지와 request_id를 사용하고, Java client는 deadline과 bounded executor를 적용합니다. gRPC가 준비되지 않으면 기존 REST TTS 경계로 명시적으로 fallback하므로 공개 HTTP API와 DB·SSE 텍스트 방은 그대로 유지됩니다.
protobuf 필드를 추가할 때는 기존 번호를 재사용하지 않고, 서버가 모르는 필드를 무시해도 안전하도록 optional·기본값·호환 가능한 응답을 설계합니다. timeout은 실패 원문이나 사용자 입력을 로그에 남기지 않고 안전한 errorType으로 수렴시킵니다.
WebRTC는 음성 검토의 일시적 보조 경로다
방의 원본은 PostgreSQL에 저장되는 텍스트 메시지와 SSE 알림입니다. WebSocket은 방 입장과 offer·answer·ICE 후보를 전달하는 signaling만 담당하고, 미디어는 peer 간 P2P audio track으로 흐릅니다. SDP·ICE·익명 사용자 ID는 DB·Redis·로그·분석 이벤트에 저장하지 않습니다.
현재 topology는 최대 8명의 p2p-mesh 음성만 허용합니다. 영상 track은 지원하지 않으며, SFU·MCU·coturn 컨테이너도 기본 배포에 넣지 않습니다. 참가자 ID는 방 안에서만 쓰는 짧은 ephemeral ID이고, 기존 익명 identity는 handshake에서 검증만 합니다.
비용 가드의 실제 계약
WEBRTC_VOICE_ENABLED=false가 기본값이므로 브라우저 마이크 권한 요청·WebSocket 연결·ICE 수집이 시작되지 않습니다.WEBRTC_ICE_SERVERS, TURN URL·사용자·credential은 명시적으로 함께 설정할 때만 전달합니다. 기본값에는 STUN/TURN도 없습니다.- 영상은 API 응답에서도
videoEnabled=false로 고정합니다. 음성 기능을 켜도 영상 트래픽은 열리지 않습니다. - 방 참가자는 최대 8명, 세션은 기본 30분이며 서버와 클라이언트가 모두 만료를 닫습니다. signaling rate와 payload 크기도 제한합니다.
- 미디어는 Caddy나 Java API를 경유하지 않습니다. TURN을 추가할 때는 별도 고정비·릴레이 GB·피크 동시 세션 예산을 먼저 승인하고, 실제 relay 비율을 계측한 뒤 opt-in으로 켭니다.
- 비용 검토 전에는 텍스트 방을 정상적인 대체 경로로 표시합니다. 음성 실패가 텍스트 기록을 삭제하거나 방 사용을 막지 않습니다.
기본 차단과 승인된 opt-in
voice·ICE·TURN·video를 닫고 텍스트 방을 계속 제공합니다.
고정비·relay GB·동시 세션 예산과 계측을 먼저 확인합니다.
relay 비율·오류·세션 상한을 넘으면 즉시 음성을 닫고 텍스트로 돌아갑니다.
다섯 관점의 인수 증거
| 관점 | 확인할 것 |
|---|---|
| 기획 | 음성의 목적·최대 세션·비용 승인자와 영상 미지원 상태가 요구사항에 적혀 있는가 |
| 디자인 | 잠금 사유, 마이크 권한 전 상태, 연결 실패, 텍스트 fallback을 사용자가 이해하는가 |
| 개발 | protobuf 호환성, deadline, signaling 인증·rate limit, SDP 비저장, session TTL 테스트가 있는가 |
| 사용자 | 비용 가드가 켜져도 텍스트 방으로 계속 기록하고 검토할 수 있는가 |
| 운영 | gRPC health/capability, WebRTC enabled·TURN 설정, 릴레이 트래픽과 rollback 기준을 확인할 수 있는가 |
완료는 “브라우저에서 연결됨”이 아니라 다음을 모두 만족할 때로 판정합니다. gRPC 계약 테스트와 fallback 테스트가 통과하고, WebRTC cost-guard 테스트가 기본 차단을 증명하며, 실제 DB·API·프론트엔드 smoke가 기존 텍스트 방을 통과하고, 비용 승인 없는 환경에는 TURN/video 설정이 없는 상태입니다.
관련 읽기: gRPC 음성 경계, 비용 가드 WebRTC 음성 리뷰
이 글에서 만나는 용어
🎉 운영 가능한 서비스 만들기 — 경계·성능·복구·배포 14단계 완주를 축하해요
이어서 어떤 걸 배워 볼까요?