🏢 세션 시스템 (플랫폼 백엔드)
Status: Draft 관련 결정: 4A 세션 종류 · 4B 포맷 · 4D 공간 · 4C AI 역할 · 5A 예약 📡 API: 세션 · 예약 · 시스템·Cron 🗄️ Data: 3. Schedule · 4. Reservation · 5. Records · 6. AI
1. 배경
본사 시스템이 슬롯 스케줄링·매칭·세션 데이터·AI 학습을 책임. 회원·멘토 둘 다 본사 시스템 위에서 움직임.
2. 핵심 컴포넌트
A. 슬롯 스케줄러
- 방 슬롯: 60분 단위, 30분 stagger (정각 4방 + 30분 4방)
- 카디오 슬롯: 30분 단위, 자리 수 = 6
- 방 슬롯의 멘토 점유: 방 60분 중 멘토 30분 (T+30~T+60) — 멘토 입장에서 별도 트랙
- 회원 예약 = 카디오 30 + 방 60 연속 세트
B. 멘토 매칭
- 슬롯 오픈 시 = 멘토가 본인 가능 슬롯을 30분 단위로 등록 (1시간 = 2 슬롯)
- 회원 예약 시 AI가 가능한 멘토 3명 추천 (수동 모드) 또는 자동 매칭 (자동 모드)
- 이전 멘토 우선 매칭 (회원 익숙함 + 멘토 인수인계 연속성)
- 회원 24h 거절권: 거절 시 다른 멘토 재매칭
C. AI 운동 설계
- 입력: 회원 직전 N세션 기록 + 본사 표준 프로그램 + 회원 컨디션
- 출력: 다음 세션 운동 시퀀스 (자율 30분 + 멘토 30분)
- 강사 인계 메모도 입력에 포함 (암묵지 명시화)
D. 세션 기록 저장
- 세션마다 표준 schema로 저장 (운동·세트·중량·rep·폼·인수인계·컨디션)
- AI 학습 데이터로 누적
- 회원 본인이 열람 가능 (운동 이력 시각화)
3. 데이터 모델
Member (회원)
├─ id, profile, persona signals
└─ exercise history (joined)
Mentor (멘토)
├─ id, profile, 인증 등급 (일반 / Pro 인증)
└─ slot opens (joined)
Room (방, 지점당 8개)
├─ id, store_id, capacity
└─ slots (joined)
CardioSeat (카디오 자리, 지점당 6)
├─ id, store_id
RoomSlot (방 60분 슬롯, 30분 stagger)
├─ id, room_id, start_at (정각 / 30분)
├─ member_id (예약 시), status
CardioSlot (카디오 30분 슬롯)
├─ id, seat_id, start_at, member_id
MentorBlock (멘토 30분 단위 가능 시간)
├─ id, mentor_id, start_at, status (open/assigned)
Session (회원 1세션 = 카디오 + 방 + 멘토 30분 묶음)
├─ id, member_id, mentor_id (방의 T+60 30분 동안의 멘토)
├─ cardio_slot_id, room_slot_id, mentor_block_id
├─ status (booked / checked-in / in-progress / completed / no-show / cancelled)
SessionRecord (멘토 입력)
├─ id, session_id
├─ exercises (jsonb): [{name, sets, weight, reps, ...}]
├─ form_notes (text)
├─ handover_notes (text, AI 학습용)
├─ member_condition (text)
AIRecommendation (다음 세션 추천)
├─ id, member_id, generated_at
├─ next_session_plan (jsonb)
├─ source: 최근 N세션 기록 IDs
Rating (회원 평가)
├─ id, session_id, member_id, mentor_id, score (1-5), comment
4. API 엔드포인트 (주요)
POST /reservations— 회원 예약 생성 (카디오+방+멘토 동시 점유)POST /mentor/slots— 멘토 슬롯 오픈GET /sessions/today— 회원·멘토 오늘 일정POST /sessions/:id/check-in— 회원 QR 체크인POST /sessions/:id/record— 멘토 세션 기록 저장GET /members/:id/next-recommendation— AI 다음 운동 제안POST /sessions/:id/rating— 회원 평가
5. 슬롯 stagger 알고리즘 (예시)
시각 | 방 A (정각 시작) | 방 B (30분 시작) | 카디오 자리 사용
12:00 | 회원 X 방 입장 | 회원 W 진행 중 | 회원 Y가 12:00-12:30 사용
12:30 | 회원 X 자율 끝, 멘토 입장 | 회원 W 종료, 청소 | 회원 Z가 12:30-13:00 사용
13:00 | 회원 X 종료, 청소 | 회원 Y 방 입장 | 회원 A가 13:00-13:30 사용
13:30 | 회원 Z 방 입장 | 회원 Y 자율 끝, 멘토 입장 | ...
→ 멘토 1명이 12:30~13:00 방 A, 13:30~14:00 방 B 식으로 1시간에 2 회원.
6. 다른 레이어 영향
- 👤 유저: 예약·체크인·AI 가이드·평가 UI는 이 API 위에서
- 💪 멘토: 슬롯 오픈·일정·세션 기록·정산 UI도 이 API 위에서
7. 엣지 케이스
- 멘토 슬롯과 방 슬롯 매칭 실패 (멘토 풀 부족): 회원에게 예약 불가 안내 + 대기 큐
- 카디오 자리 부족 (6자리 < 동시 회원 8명): 회원 동선 stagger로 4명씩 카디오 → 시간 안 맞으면 거절
- 세션 중 회원 부상: 즉시 종료 처리 + 회차 보상
8. 측정 지표
- 슬롯 매칭 성공률 ≥ 95%
- API p95 응답 200ms 이내
- AI 추천 생성 시간 < 3초
| 2026-05-13 | 초안 |