💪 세션 진행 (멘토 흐름)
Status: Draft · Layer: 💪 멘토 · Updated: 2026-05-13
관련 결정: 3A 강사 페르소나 · 3E 운영 모델 · 4A 세션 종류 · 4B 세션 포맷 · 4C AI 역할 · 3G 정산
📡 API: 세션 · 멘토 · AI
🗄️ Data: 3. Schedule · 4. Reservation · 5. Records · 6. AI
현재 코드: apps/partner/src/pages/session-detail-page.tsx, dashboard-page.tsx
1. 배경
멘토 = 1시간에 2 회원 cover (방 A 30분 → 방 B 30분 stagger). 기존 강사 앱은 60분 단일 세션 모델. 30분 단위 stagger 운영 + AI 가이드 협력 + Pro 인증 단가 자율 + 5분 내 기록 입력 등 전면 개편.
2. 정책서 락된 사항
강사 페르소나 (3A) — 파트타임 잡 모델
- 배달기사처럼, 원할 때 슬롯 오픈, 원하는 만큼 일함
- 자격증 보유자 누구나 (Pro 인증) + 자격증 없는 일반 멘토
- 영업·CS·정산 부담 ❌ (본사 처리)
강사 운영 모델 (3E) — Hybrid
- 프리랜서 계약 (직고용 ❌)
- 본사가 마케팅·예약·결제·CS·세금 전부 대행
- 슬롯 자유 오픈 + 의무 슬롯 (Phase 1 코어 12명)
세션 구조 (4B + 4D + 5A)
- 회원 1세션 = 90분 (카디오 30분 + 방 60분)
- 방 60분 중 멘토 30분 1:1 + 자율 30분 (AI 가이드)
- 30분 stagger: 정각 시작 4방 + 30분 시작 4방
- 멘토 1시간 = 방 A (T~T+30) + 이동 (T+30~T+35) + 방 B (T+35~T+60)
AI 역할 (4C)
- AI가 회원 세션 운동 설계
- 멘토는 그 가이드 + 본사 프로그램에 따라 코칭 (설계 ❌)
- 본사가 강사 교육 프로그램 제공
정산 (3G)
- 일반 멘토: 회당 X원 고정 (회원 1명 30분 = 1회)
- Pro 인증: 회당 자율 단가 (본사 min~max)
- 격주 입금
3. 현재 코드 vs 새 시스템
| 영역 | 현재 (apps/partner) |
새 시스템 |
|---|---|---|
| 세션 단위 | 60분 1 회원/방 | 30분 1:1 × 2 방 (1시간에 2 회원) |
| 슬롯 모델 | TimeSlot (60분, 자유) | MentorBlock (30분 단위, stagger) |
| 멘토 라벨 | coach (general) | verified / pro_certified |
| 단가 | 고정 (settlement에서 계산) | 일반 고정 + Pro 자율 |
| AI 가이드 | ❌ 없음 | 세션 전 회원 추천 운동 노출 |
| 세션 기록 | 564줄 페이지 (입력 무겁) | 5분 내 입력 UX 재설계 |
| 인계 메모 | next_plan 텍스트 | next_plan + AI 학습용 |
| 본사 프로그램 | ❌ 없음 | Exercise Library + Phase 가이드 |
4. 멘토 시나리오 (1시간 = 2 회원 cover)
4.1 슬롯 오픈 (D-N일 전)
캘린더 (4주 보기) → 30분 단위 그리드 (요일 × 시간)
- 회색 = 미선택
- 흰색 = 가능 (open 등록 가능)
- 클릭 → open으로 토글
- 파랑 = 예약 잡힘 (회원 매칭됨)
저장 후 = 자동 매칭 큐에 진입.
4.2 매칭 알림 (회원 예약 시 받음)
📩 푸시:
"5/15 (화) 19:30 방 A에 회원 X 매칭됨"
[회원 프로필 보기] [확인]
마이페이지 일정에 자동 추가.
4.3 세션 당일 (T-15분 ~ T+90)
| 시각 | 멘토 액션 | 시스템 |
|---|---|---|
| T-30분 | 푸시: “30분 후 방 A 진입 (회원 X)” | 알림 |
| T-15분 | 푸시 + 회원 프로필 미리보기 화면 | 회원 이력·인계 메모·오늘 추천 |
| T~T+25 | (멘토 대기 시간 — 다른 일정 가능) | 회원은 카디오존에서 운동 |
| T+25 | “방 A 회원이 자율 운동 시작” 알림 | 회원 = 방 A 자율 30분 시작 |
| T+30 | (다음 1시간 슬롯 시작) | |
| T+30~T+60 | 방 A에서 회원 X 30분 1:1 | 운동 가이드·체크리스트 |
| T+60~T+65 | 방 B로 이동·체크 | |
| T+65~T+90 | 방 B에서 회원 Y 30분 1:1 | |
| T+90 | 두 세션 모두 기록 입력 (10분 내) | 5분 내 입력 UX |
→ 결과: 1시간(60분) 동안 2 회원 = 정산 2회 회수.
4.4 세션 기록 입력 (T+90 이후)
- 운동·세트·중량·rep (대부분 AI가 default 채움, 멘토 보정)
- 폼 이슈 (1-2줄)
- 다음 세션 인수인계 (3-5줄, AI에 학습됨)
- 회원 컨디션 메모 (선택)
4.5 멘토 노쇼·지각 처리
| 케이스 | 결과 |
|---|---|
| T+10분 미도착 | 알림 → 운영 매니저 통보 |
| T+15분 미도착 (노쇼) | 회원에게 회차 +1 보상, 멘토 등급 패널티 + 정산 차감 |
| 6h 전 본인 취소 | 패널티 ❌ |
| 6h 이내 본인 취소 | 회원 회차 +1 보상, 멘토 등급 패널티 |
5. 화면 요구사항
5.1 슬롯 캘린더 (/schedule)
컴포넌트: schedule-page.tsx (개편)
2026년 5월
────────────────────────────────
월 화 수 목 금 토 일
06:00 [ ] [ ] [ ] [ ] [ ] [ ] [ ]
06:30 [ ] [ ] [ ] [ ] [ ] [ ] [ ]
...
19:00 [✓] [✓] [✓] [ ] [ ] [ ] [ ] ← 예약 잡힘 (파랑)
19:30 [✓] [○] [✓] [ ] [ ] [ ] [ ] ← ○ = 매칭 대기 (회색)
20:00 [○] [○] [○] [ ] [ ] [ ] [ ]
...
범례: [ ] 미선택 · [○] open (매칭 대기) · [✓] 매칭됨
- 클릭 = 토글 (미선택 ↔ open)
- 48h 이내 변경 = 운영 매니저 승인 필요
- 6h 이내 = 패널티 경고
5.2 오늘 일정 (/)
컴포넌트: dashboard-page.tsx (개편)
오늘 일정 — 2026-05-15 (화)
────────────────────────
19:30 방 A · 회원 김OO (재예약 4회차)
20:00 방 B · 회원 이OO (첫 세션)
21:00 방 A · 회원 박OO
21:30 방 B · 회원 정OO
이번 격주 누적: 12 세션 · 예상 정산 240,000원
[일정 보기] [슬롯 변경]
5.3 세션 진입 화면 (T-15분 자동 진입)
컴포넌트: session-pre-page.tsx (신규)
T-15분 알림 → 클릭
회원 김OO (32세, 4회차)
────────────────────────────
🎯 오늘 목표 (AI 추천)
• 자율 30분: 데드 4×65kg (지난번 60kg 성공)
• 멘토 30분: 스쿼트 4×55kg, 런지 3×30kg
📋 직전 세션 인계 (5/8 박멘토)
"코어 약함, 데드 시 허리 보호 신경.
다음에 플랭크 보강 추천."
📊 회원 컨디션 (사전 입력)
수면: 7h, 통증: 없음, 에너지: 보통
[운동 라이브러리] [세션 시작]
5.4 세션 진행 중 (T+30 입장 시)
컴포넌트: session-active-page.tsx (신규)
회원 김OO · 방 A · 19:30
─────────────────────────
[남은 시간: 28:00]
오늘 진행 운동:
✓ 스쿼트
1세트: 50kg × 8 [완료]
2세트: 55kg × 8 [완료]
3세트: 55kg × 7 (1회 모자람)
4세트: ___ [입력]
□ 런지 (3세트 × 10)
□ 사이드 플랭크 (3세트 × 30초)
[다음 운동] [메모 추가]
세트마다 빠른 입력 (숫자만, 5초 이내).
5.5 세션 기록 입력 (T+90 이후)
컴포넌트: session-detail-page.tsx (재설계 — 5분 내)
세션 완료 - 회원 김OO (5/15 19:30)
────────────────────────────────
1️⃣ 운동 기록 (대부분 자동 채워짐)
✏️ 수정만 필요 — [편집]
2️⃣ 폼 이슈 (1-2줄)
[_____ 데드 시 허리 약간 굽음. 무게 ↓ 후 자세 잡고 ↑ 추천]
3️⃣ 다음 세션 인계 (3-5줄, AI 학습) ⭐
[_____ 데드 폼 안정 시 67.5kg 시도 가능.
하체 보강 (런지 ↑) 추천.
코어 약점 - 플랭크 시작.]
4️⃣ 컨디션 메모 (선택)
[_____]
[다음 회원으로] [기록 저장]
UX 목표: 3 필드 5분 내 입력.
5.6 정산 화면 (/earnings)
컴포넌트: earnings-page.tsx (개편 — 정산 PRD 참고)
이번 격주 (5/1 - 5/14)
──────────────────────
누적 세션: 24 회
예상 정산: 480,000원
기본 정산 (24회 × 20,000) = 480,000
차감 항목: 0
다음 입금: 5/16 (금)
[명세서 다운로드]
6. 데이터 모델 (멘토 측)
type MentorTier = 'verified' | 'pro_certified'
type MentorBlockStatus = 'open' | 'assigned' | 'completed' | 'cancelled'
interface MentorBlock {
id: string
mentorId: string
startAt: string // 30분 단위 (정각 또는 30분)
status: MentorBlockStatus
assignedSessionId?: string
assignedAt?: string
}
interface MentorSchedule {
mentorId: string
blocks: MentorBlock[]
weeklyRecurrence?: { // 매주 반복 슬롯 (옵션)
weekday: number
hour: number
minute: 0 | 30
}[]
}
interface SessionRecord {
id: string
sessionId: string
mentorId: string
performedAt: string
exercises: ExercisePerformed[]
formNotes: string // 1-2줄
handoverNotes: string // 3-5줄 — AI 학습용
memberCondition?: string
enteredAt: string // 입력 시각 (5분 내 SLA 측정)
totalVolumeKg?: number // 자동 계산
}
interface ExercisePerformed {
name: string
sets: ExerciseSet[]
note?: string
}
interface ExerciseSet {
weight?: number
reps: number
completed: boolean
modifiedBy?: 'mentor' | 'ai' // 누가 입력했는지
}
interface MentorTodaySchedule {
date: string
sessions: {
sessionId: string
memberId: string
memberName: string
memberRebookCount: number // 재예약 N회차
startAt: string
roomNumber: number
aiRecommendation: AIRecommendation
memberCondition?: string
}[]
estimatedEarning: number
}
7. API 통신
7.1 새 엔드포인트
GET /api/mentors/me/schedule?from=YYYY-MM-DD&to=YYYY-MM-DD
Response: MentorSchedule
POST /api/mentors/me/blocks
Body: { startAt }
Response: MentorBlock
DELETE /api/mentors/me/blocks/:id // 슬롯 닫기
Response: { cancellationFee?: number, penalty?: 'tier_warning' }
GET /api/mentors/me/today
Response: MentorTodaySchedule
GET /api/sessions/:id/pre-info // 세션 직전 회원 정보
Response: {
memberId, memberName, rebookCount,
aiRecommendation,
lastHandoverNotes: [{date, mentor, text}],
memberCondition
}
POST /api/sessions/:id/record
Body: { exercises, formNotes, handoverNotes, memberCondition? }
Response: { sessionRecord, aiUpdated: true }
GET /api/mentors/me/exercise-library?category=lower|upper|core|cardio
Response: { exercises: ExerciseTemplate[] }
8. 엣지 케이스
| 케이스 | 처리 |
|---|---|
| 멘토 지각 (T+10) | 자동 알림 (회원·운영) |
| 멘토 노쇼 (T+15 미도착) | 회원 회차 +1 보상, 멘토 등급 -1 + 정산 차감 |
| 6h 이내 본인 취소 | 회원 보상 + 멘토 패널티 |
| 6h 전 본인 취소 | 패널티 ❌. 회원에게 다른 멘토 자동 재매칭 |
| 동시 두 방 cover 어려움 (회원 1명 지각 등) | 운영 매니저 알림 → 1 회원 일정 조정 |
| 회원 노쇼 | 멘토는 정상 정산 (회원 회차만 차감) |
| 멘토가 회원 운동을 수정 (AI 추천 따르지 않음) | 시스템 기록 → AI 학습 신호 (다음 추천 보정) |
| 멘토가 본사 프로그램과 다른 운동 가르침 | 1차 = 가이드 알림 / 반복 = 등급 평가 영향 |
| 세션 기록 입력 24h 누락 | 알림 → 48h 후 자동 default 기록 (정산 영향 ↓) |
9. 측정 지표
| 지표 | 목표 |
|---|---|
| 멘토 정시 입장 비율 | ≥ 95% |
| 세션 기록 5분 내 입력 비율 | ≥ 80% |
| 24h 내 기록 입력 비율 | ≥ 99% |
| AI 추천 채택 비율 (멘토가 따라간 비율) | ≥ 70% |
| 멘토 슬롯 안정성 (취소율) | ≤ 5% |
| 6h 이내 취소 | ≤ 1% |
10. 구현 작업 분해
10.1 페이지 개편 (apps/partner/)
src/pages/schedule-page.tsx— 30분 단위 그리드 + 48h/6h 룰src/pages/dashboard-page.tsx— 오늘 일정 + 예상 정산src/pages/session-detail-page.tsx— 5분 내 입력 UX (564줄 → 200줄 목표)src/pages/session-pre-page.tsx(신규) — 세션 전 회원 정보·AI 추천src/pages/session-active-page.tsx(신규) — 세션 진행 중 운동 체크src/pages/earnings-page.tsx— 정산 화면 (별도 PRD)
10.2 컴포넌트
src/components/SlotGrid.tsx— 30분 단위 캘린더src/components/SessionPreCard.tsx— 회원 정보 + AI 추천 + 인계src/components/ExerciseSetInput.tsx— 빠른 세트 입력 (5초 이내)src/components/HandoverNoteEditor.tsx— AI 학습 안내 + 3-5줄 입력
10.3 서비스 / 스토어
src/services/schedule.ts— 슬롯 CRUDsrc/services/session.ts— 세션 기록 저장src/store/usePartnerStore.ts— 일정·세션·정산 상태
10.4 타입
packages/api-types/src/mentor.ts— MentorBlock, MentorSchedulepackages/api-types/src/session-record.ts— 위 정의
| 2026-05-13 | 초안 |
| 2026-05-13 | 정책서 6개 cross-ref + 현재 코드 vs 새 모델 + 5 시나리오 + 6 화면 + API·작업 분해 상세화 |