녹화 예약
사용자의 WebSocket 예약과 영상 매칭 과정
문서 정보
- 작성일: 2026-03-02
- 최종 업데이트: 2026-03-02
- 버전: v1.0.0
- 관련 코드:
src/modules/recording/
개요
사용자는 앱에서 체육관 녹화를 예약합니다. 예약은 WebSocket 기반으로 동작하며, 예약 시 Recording과 일정(Schedule, UserSchedule) 엔티티가 생성됩니다.
Recording은 두 가지 경로로 생성될 수 있습니다:
| 생성 경로 | 설명 |
|---|---|
| 사용자 예약 | WebSocket으로 녹화 예약 시 생성 |
| Webhook 자동 생성 | R2 webhook 수신 시 해당 시간대의 Recording이 없으면 자동 upsert |
WebSocket 예약 흐름
네임스페이스
/recordings
이벤트
이벤트 상세
| 이벤트 | 방향 | 설명 |
|---|---|---|
FETCH_INFO | Client → Server | 체육관 코드로 체육관/코트 정보 조회, 위치 검증 포함 |
RESERVE | Client → Server | 녹화 예약 (Recording + Schedule + UserSchedule 생성) |
CHECK_STATUS | Client → Server | 현재 예약 상태 조회 |
CANCEL | Client → Server | 활성 예약 취소 |
관련 코드: src/modules/recording/gateways/recording.gateway.ts
위치 검증
사용자가 실제로 체육관 내에 있는지 검증합니다.
| 방식 | 환경변수 | 검증 방법 |
|---|---|---|
| GPS | LOCATION_VALIDATION_TYPE=GPS | Haversine 거리 계산, 체육관 좌표 + 반경 |
| IP | LOCATION_VALIDATION_TYPE=IP | IP 화이트리스트 매칭 |
Recording과 Video의 관계
하나의 Recording에 여러 Video(10분 단위)가 연결됩니다.
Recording (14:00 ~ 15:00 녹화 세션)
├── Video (14:00 ~ 14:10) - timeSlot 0
├── Video (14:10 ~ 14:20) - timeSlot 1
├── Video (14:20 ~ 14:30) - timeSlot 2
├── Video (14:30 ~ 14:40) - timeSlot 3
├── Video (14:40 ~ 14:50) - timeSlot 4
└── Video (14:50 ~ 15:00) - timeSlot 5
각 Video는 다시 멀티카메라 영상을 포함합니다:
Video (14:00 ~ 14:10)
└── metadata.videoResources[]
├── CAM-FRONT: { r2: {...}, stream: {...} }
└── CAM-SIDE: { r2: {...}, stream: {...} }
KokSync
녹화 종료 시점에 BullMQ 작업이 트리거됩니다. KokSync는 사용자가 녹화 중 생성한 콕(Kok) 데이터를 Firestore에서 PostgreSQL로 동기화하여, 콕과 해당 시간대의 Video를 매칭합니다.