WebRTC, signaling, Mesh, DataChannel, 상태 동기화 설계 흐름
WebRTC offer 충돌은 내부의 상태 문제였지만 사용자에게는 연결이 멈춘 화면으로 보였다. 이를 상태 머신과 명시적인 복구 규칙으로 다룬 기록이다.
WebRTC는 연결의 문을 열어 주지만 그 뒤의 질서까지 만들어 주지는 않는다. 신호 교환과 입장 순서, 메시지 채널과 파일 채널이 조금만 어긋나도 사용자는 연결 자체를 불안하게 느낀다. 브라우저가 직접 연결되면 서버 부담도 줄고 구조도 단순해질 것이라 기대했다. 그러나 연결 뒤의 상태 관리와 순서 보장, 실패 복구는 여전히 제품의 몫이었다. 연결이 성립했다는 이벤트만 전달해서는 방이 안정적으로 움직이지 않았다.
Mesh 연결은 단순해 보였다. 참여자끼리 직접 연결하면 작은 방에서는 구조를 이해하기 쉽다. 하지만 한 단계의 실패가 사용자에게는 연결 전체의 불안으로 보인다는 점이 곧 드러났다. 신호 교환과 입장 순서, 메시지 채널과 파일 채널이 정확히 맞아야 했다. 내부에서는 이벤트 하나가 늦은 것처럼 보여도 사용자는 연결됐다고 느끼지 못한다. Mesh의 단순함은 연결 수를 줄이는 데서 끝나지 않고 실패했을 때 무엇을 다시 시도할지까지 포함해야 했다.
처음에는 DataChannel을 하나만 열어도 충분하다고 생각했다. 브라우저끼리 직접 붙고, 그 통로로 채팅도 보내고 파일 조각도 보내고 PonsCast 제어 메시지도 보내면 구조가 단순해 보였다. 방 안의 모든 실시간 메시지가 같은 길을 지나가니 디버깅도 쉬울 거라고 봤다. 그제야 제목으로 남긴 '[PonsLink DataChannel 하나에 모든 메시지를 태우면 왜 위험할까'이 기능 홍보가 아니라, 내가 붙잡고 있던 판단 기준에 가깝다는 걸 인정했다.
서버가 미디어를 나르지 않으면 편해질 줄 알았다. 트래픽 비용이 줄고 인코딩 부담도 클라이언트 쪽으로 가니 운영이 단순해 보였다. 그 문장은 절반만 맞았다. 막상 해보니 사라지는 건 미디어 운반뿐이었다. 세션 권한, 기능 허용, 중계 자격, 업로드 주소, 방 권한, 실패 문장 번역은 그대로 남았다. 미디어를 안 나를수록 제어면 경계가 더 선명해야 제품이 안전해졌다.
놓친 이벤트와 중복 요청은 서로 다른 오류처럼 보이지만 사용자에게는 같은 결과로 남는다. 한 번 보낸 요청이 사라지거나, 같은 요청이 두 번 처리되면 화면의 상태와 실제 상태가 어긋난다. PonsLink의 요청 흐름을 만들면서 이 문제를 뒤늦게 분리했다. 요청을 먼저 받고, 상태를 바꾸고, 방이나 다음 단계로 넘기는 과정에서 이벤트가 한 번 빠져도 다시 확인할 수 있어야 했다.
PonsLink를 운영하면서 가장 자주 받는 질문은 단순하다. "이 서비스, 실제로 어떻게 붙어 있어요?" 마케팅 문구로는 "요청-우선 세션 데스크"라고 말하지만, 그 문장 뒤에는 nginx 한 줄, Node 컨테이너 한 개, Postgres 두 개의 DB, Redis, coturn, SFU, R2, 결제 공급자 네 곳이 동시에 움직인다. 이 글은 2026-08-07 기준 ssh pon...
서비스를 오래 굴리면 스키마가 제품 결정을 배신한다. PonsLink도 예외가 아니었다. 한때는 "users 하나면 되겠지"로 시작했다가, 지금은 같은 Postgres 인스턴스 안에 두 개의 DB를 둔다. ponslink22테이블와 ponswarp15테이블. 이 글은 2026-08-07 실측 덤프를 기준으로 그 구조를 해설한다.
PonsLink의 핵심 UX 원칙은 다섯 단계다. 방룸은 네 번째 단계에 불과하다. 이 글은 그 다섯 단계가 API·DB·프론트 라우트에 어떻게 내려앉는지 정리한다.
실시간 제품을 만들면 처음엔 영상이 붙는 순간에 환호한다. 그다음 주부터는 NAT 뒤의 사용자, 회사 방화벽, 모바일 전환, 재연결 폭풍을 상대한다. PonsLink의 시그널링·TURN·SFU 구성은 그 실패를 제품 상태로 다루기 위한 결과다.
결제는 "성공 페이지를 보여주면 끝나는 일"이 아니다. PonsLink는 Polar를 활성 공급자로 두고, PayPal·LemonSqueezy·Stripe 웹훅 경로를 함께 유지한다. 공급자가 늘수록 문제는 기능이 아니라 중복·지연·재시도다.