<PonsLink/>
작업
글
주제
시리즈
카테고리
연락
⌘K 검색
About
코드와 제품으로

코드와 제품으로

연결되는 세계

연결되는 세계

PonsLink는 만남 뒤 요청을 세션으로 잇고, PonsWarp는 서버 보관 없이 파일을 직접 전송합니다. 이 블로그는 기능 소개보다 설계 판단과 운영 증거를 남깁니다.

연락처

[email protected]github.com/DeclanJeon

운영

콘텐츠는 WordPress headless CMS, 공개 UI는 Next.js입니다.

초안 미리보기
© 2026 PonsLink Blog|Next.js · WordPress REST · Framer Motion
Local-first · Backup-before-deploy

[PonsLink] 요청-세션 라이프사이클 설계 — 공개 데스크에서 자동 아카이브까지

Declan Jeon·2026년 8월 7일

  • 개발 회고

PonsLink의 핵심 UX 원칙은 다섯 단계다. 방(룸)은 네 번째 단계에 불과하다. 이 글은 그 다섯 단계가 API·DB·프론트 라우트에 어떻게 내려앉는지 정리한다. 1. Request Intake — 공개 데스크 방문자는 `/public-desk/:identifier`로 들어온다. API는 `GET /public-desk/:identifier`, `POST /public-desk/:identifier/requests`를 제공한다. 별칭 경로(`/public-aliases/:alias`)도 동일 패턴이다. 요청이 저장되면 방문자에게 `request-status/:token` 추적 링크가 발급된다. 여기서 중요한 판단: 계정이 없어도 요청을 남길 수 &#8230; Read more

PonsLink의 핵심 UX 원칙은 다섯 단계다. 방(룸)은 네 번째 단계에 불과하다. 이 글은 그 다섯 단계가 API·DB·프론트 라우트에 어떻게 내려앉는지 정리한다.

5단계 워크플로

1. Request Intake — 공개 데스크

방문자는 `/public-desk/:identifier`로 들어온다. API는 `GET /public-desk/:identifier`, `POST /public-desk/:identifier/requests`를 제공한다. 별칭 경로(`/public-aliases/:alias`)도 동일 패턴이다. 요청이 저장되면 방문자에게 `request-status/:token` 추적 링크가 발급된다.

여기서 중요한 판단: 계정이 없어도 요청을 남길 수 있어야 한다. 전문가는 링크 하나로 상담 목적과 맥락을 먼저 받는다.

2. Review & Approval — 검토·수락

호스트는 라운지(`/lounge/requests`)에서 요청을 본다. 액션은 수락/거절/정보 요청/일정 제안이다.

– 라운지 내부: `POST /lounge/requests/:id/{accept,decline,propose-time,request-information}`

– 토큰 기반(이메일 링크): `POST /request-actions/:token/{accept,decline,respond,propose-time,direct-call}`

상태 변화는 `GET /request-status/:token/events`로 방문자가 실시간 추적한다. AI 요약·답변 초안(`…/ai/summary`, `…/ai/reply-draft`)은 OpenRouter를 경유한다. "자동 수락"은 없다. 판단 권한은 전문가에게 남긴다.

3. Condition/Payment — 일정·결제 게이트

수락 후에도 바로 방에 들어가지 못할 수 있다. 일정 확정, 구독, 1회 결제(드롭 패스)가 게이트다.

– 구독: `POST /subscriptions/checkout`, `GET /subscriptions/me`

– 1회 결제: `POST /payments`, 공급자별 complete/capture

– 세션 접근 확인: `GET /session-access/:roomTitle`

결제 확정은 웹훅 원장으로만 이뤄진다. 프론트의 "결제 완료 화면"은 힌트일 뿐, 권한의 근거가 아니다.

4. Professional Session — 전문 세션 룸

게이트를 통과하면 `/room/:roomTitle` 또는 `/join/:roomTitle`로 들어간다. Socket.IO(`/socket.io`)로 시그널링하고, 미디어는 P2P 메시 우선·필요 시 SFU/TURN이다.

룸 API 표면:

– 채팅 `…/chat/messages`

– 파일 `…/files/uploads`, `…/file-transfers`

– 화이트보드 `…/whiteboards`

– 코워치 `…/cowatch/sessions`

– 폰캐스트 `…/ponscast/playlists`

– 미디어 트랙 mute/unpublish

– 음성/자막 `GET /speech/*`, `…/speech/transcripts`

– 번역 `POST /translation/translate`

이 기능들은 "회의 링크"가 아니라 준비된 상담 도구로 묶여 있다. 요청 맥락이 세션 안으로 들어와야 한다.

5. Auto-Archive — 자동 보관

세션 중 `POST /rooms/:id/meeting-records/start`로 기록을 시작하고, segment를 쌓은 뒤 `finalize`한다. 결과는 `/lounge/meeting-records`에 요청과 연결되어 남는다. 후속 조치는 다시 1단계 요청으로 이어질 수 있다.

실패 모드를 먼저 설계한다

– 요청만 쌓이고 응답이 없으면 → 만료 크론/`POST /lounge/requests/expire`

– 결제는 됐는데 웹훅이 늦으면 → 멱등성 키 + 이벤트 원장 + reconcile 크론

– 세션 중 재연결 → `replayStore`로 누락 시그널 복구

– 파일이 API 메모리를 뚫고 지나가면 → 금지. R2 직접 전송만 허용

라이프사이클을 제품의 척추로 두면, 기능 추가가 "또 하나의 버튼"이 아니라 "어느 단계의 상태 전이인가"로 평가된다. 다음 글은 4단계의 실시간 인프라 — 시그널링과 TURN — 를 깊게 본다.

Related

관련 운영 노트

같은 주제에서 이어서 읽기 좋은 글입니다.

  • [Blueprint L3] Pons 포트폴리오 — 의존성 0, 단일 index.html이 오래 가는 이유

    의존성 0, 단일 index.html 41KB. 디자인 토큰 SSOT와 13개 제품 쇼케이스로 만든 정적 포트폴리오가 오래 가는 이유.

  • [Blueprint L2] PonsLink Control Tower — Threads에 dry-run으로 쏘는 이유

    Python Threads 컨트롤타워. cardnews 재사용→생성 폴백, n8n 패치, dry-run 기본 게이트로 안전하게 쏘는 자동발행.

  • [Blueprint L1] PonsLink P2P Room — WebRTC 화상회의를 BFF로 감싼 이유

    React SPA와 Express BFF가 Socket.IO로 시그널링하고, 미디어는 mesh로 가는 2티어. TURN 그랜트와 presence lease로 룸을 만든 화상회의.

댓글

아직 댓글이 없습니다.

현재 이 글의 댓글은 닫혀 있습니다.