dilling-backend
중앙 백엔드 도메인
새 서버를 만들지 않고 기존 Spring 서버에 시설, 코트, 주문, 촬영 세션, 영상 자산, 다운로드 토큰을 추가합니다.
각 레인은 독립적으로 개발할 수 있지만, RecordingSession 상태가 전체 흐름의 기준점입니다.
dilling-backend
새 서버를 만들지 않고 기존 Spring 서버에 시설, 코트, 주문, 촬영 세션, 영상 자산, 다운로드 토큰을 추가합니다.
dilling-camera-gateway
백엔드에서 받은 세션 작업을 polling으로 가져가고, 녹화와 업로드 콜백을 보냅니다.
dilling-play
QR 랜딩, 결제, 동의, 상태 조회, 다운로드 페이지를 앱 설치 없이 모바일 웹으로 제공합니다.
dilling-admin
고객 화면은 넣지 않고 시설주와 운영자가 실패 건, 영상 상태, 정산 예정 금액을 확인하는 화면만 붙입니다.
01
dilling-backend 안에서 상태 모델과 API 계약을 먼저 잠급니다.
2-3일
엔티티, 마이그레이션, 관리자 조회 API
02
현장 장비가 백엔드 세션을 받아 녹화할 수 있게 만듭니다.
3-4일
polling, heartbeat, recording events
03
이용자가 dilling-play QR에서 결제하면 촬영 세션이 자동 생성됩니다.
3-5일
주문 생성, 결제 웹훅, 동의 기록
04
원본 업로드 후 다운로드 토큰으로 영상 링크를 제공합니다.
3-5일
asset registration, signed download, expiry
05
실패, 환불, 정산, 장비 상태를 한 화면에서 봅니다.
2-3일
운영 대시보드, 재시도, 환불 대상 표시
고객이 보는 화면과 운영자가 보는 화면을 섞지 않고, 카메라 제어는 현장 서버에 남기는 것이 운영 기준입니다.
dilling-backendPlay 도메인, 결제 웹훅, 세션 상태 머신, 다운로드 권한, 정산 데이터를 담당합니다.
dilling-camera-gateway카메라 제어, 예약 녹화, 로컬 파일 보관, 업로드, 이벤트 콜백을 담당합니다.
dilling-play고객 QR 랜딩, 결제, 동의, 영상 준비 상태, 다운로드 화면을 담당합니다.
dilling-admin시설/코트/장비/세션/환불/정산을 보는 운영 콘솔을 담당합니다.
결제, 녹화, 업로드, 압축, 다운로드는 서로 다른 시스템에서 일어나므로 엔티티와 이벤트를 분리해야 합니다.
실무 기준
사용자는 `READY`만 보면 되지만, 운영자는 `RECORDING`, `UPLOADING`, `PROCESSING`, `FAILED`를 모두 봐야 합니다.
PlayVenue시설 단위, 시설주, 정산율, 기본 보관 기간
PlayCourt코트 단위, 종목, QR 토큰, 기본 가격, 기본 촬영 시간
PlayCameraDevice게이트웨이와 카메라 상태, heartbeat, 설치 위치
PlayOrder결제 주문, 휴대폰 암호화, 동의 버전, 결제 상태
PlayRecordingSession촬영 시작/종료, 실제 녹화 시간, 실패 코드
PlaySessionEvent녹화, 업로드, 처리, 실패, 재시도 이벤트 로그
PlayVideoAsset원본, 압축본, 썸네일, 파일 크기, 처리 상태
PlayDownloadToken만료 토큰, 사용 횟수, 강제 폐기
PlaySettlement시설주 정산 금액, 정산율, 지급 예정일, 지급 상태
GET /api/play/courts/by-qr/{qrToken}POST /api/play/ordersGET /api/play/orders/{orderId}/statusGET /api/play/watch/{downloadToken}GET /api/play/gateways/{gatewayId}/jobsPOST /api/play/gateways/{gatewayId}/heartbeatPOST /api/play/sessions/{sessionId}/eventsPOST /api/play/sessions/{sessionId}/assetsGET /api/admin/play/sessionsPOST /api/admin/play/sessions/{sessionId}/retryPOST /api/admin/play/sessions/{sessionId}/mark-refund-requiredGET /api/admin/play/settlementsNext decision