플랜핏은 국내 1위 피트니스 앱의 운동 이행 데이터를 가진 곳이라, 운동 이행·정체를 짚고 다음 운동을 추천하는 이 도구는 플랜핏의 실제 운동 기록이 있어야 추천을 검증한다.
'개인 맞춤 플랜부터 운동 진행 경험'. 이행 점검+다음 운동 추천이 그 경험의 핵심.
'직관적이고 효과적인 피트니스 경험'. 정체·과부하를 짚어주는 게 효과의 토대.
'기획-디자인-개발 1인 스쿼드'. 점검+추천이 혼자 E2E 로 만들 만한 문제.
운동 세션 기록을 받아 플랜 이행과 정체·과부하를 규칙으로 짚고, 다음 운동을 근거와 함께 추천하는 1주 포트폴리오(부상 가드 포함).
플랜핏 PE. 사용자가 자신의 정체를 모른 채 운동하던 경험을, 이행 점검 + 다음 운동 추천 도구로 바꾸고 싶은 사람.
세션에 계획·수행·RPE를 붙이면, 도구가 (a) 이행·정체·과부하를 규칙으로 짚고 (b) 다음 운동을 부상 가드와 함께 추천한다.
운동 세션을 받아 플랜 이행·정체·과부하를 짚고 다음 운동을 근거와 함께 추천하는 동작하는 도구(부상 가드).
트레이너 2명 라벨과 추천 타당도 일치도(κ)를 재고, 과부하 가드 적중률을 보여주는 대시보드.
주간 운동 진행을 추적하고 정체 시 플랜을 자동 조정하는 단계.
운동 기록을 넣으면 이행·정체와 다음 운동 추천이 근거와 함께 나오는 걸 시연한다
과부하/부상 위험 입력을 100% 가드로 잡는 걸 시연한다
측정: 가드 규칙, 표본: 위험 50건
일부러 만든 결측·경계·미등록 운동 30종을 넣어도 점검이 멈추지 않고 처리되는 걸 시연한다
위 수치는 더미데이터 자가채점이며, 실제 추천 타당도는 플랜핏 실데이터 + 실 검수자가 있어야 측정 가능. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만든다.
이건 고객·실데이터 없이 혼자 만든 포트폴리오라 모든 수치는 합성 데이터 자가채점이다. 면접에서 '데모 동작 + 실검증 준비 상태'로 솔직히 설명하는 게 오히려 신뢰를 준다
정답을 내가 만들었으니 잘 맞는 게 당연. 그래서 결측·경계·미등록·표기 흔들림 케이스를 더미에 일부러 섞어 쉬운 문제만 푸는 게 아님을 보여준다
부상 안전: 과도한 부하 추천은 절대 하지 않고 통증 신호 시 '강도 낮춤·전문가 권고'로 가드
실제 도입 시 달라지는 것: 실 사용자 체력·운동 분포가 더미와 다르므로 과부하 기준을 실데이터+트레이너 검수로 맞춰야 한다(도입 단계 과제)
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
운동 세션을 묶어 이행·과부하 점검 입력으로 쓴다
| session_id | user_raw | user_key | exercise | planned_sets | done_sets | rpe | pain_flag |
|---|---|---|---|---|---|---|---|
| WS900 | 김OO(영문) | — | 스쿼트 | 4 | — | — | — |
| WS901 | 회원0 | w0 | 데드리프트 | 4 | 0 | 10 | true |
| WS902 | 완벽수행 | w2 | 벤치프레스 | 4 | 4 | 5 | false |
| WS903 | 미등록회원 | — | 스쿼트 | 4 | 2 | — | — |
| WS000 | 회원0 | w0 | 스쿼트 | 4 | 3 | 6 | false |
z.object({ session_id: z.string(), user_raw: z.string(), user_key: z.string().nullable(), exercise: z.string(), planned_sets: z.number(), done_sets: z.number().nullable(), rpe: z.number().nullable(), pain_flag: z.boolean().nullable() }). 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: done_sets/rpe/pain_flag null(미기록), rpe 10·통증 플래그(과부하), done_sets 0, user_key null 미등록, user_raw 국문/영문 병기. 형식 깨뜨리기 시도 3건도 별도로.z.object({ session_id: z.string(), user_raw: z.string(), user_key: z.string().nullable(), exercise: z.string(), planned_sets: z.number(), done_sets: z.number().nullable(), rpe: z.number().nullable(), pain_flag: z.boolean().nullable() })| Python | 운동 기록 ingest + 점검 + eval |
| TypeScript | 추천 렌더 + Zod 검증 |
| Swift | iOS 운동 코칭 뷰 |
| React | 웹 코칭 대시보드 |
| Node.js | 추천 API(`POST /next-workout`) |
| Django | 사용자·플랜 관리 백엔드 |
✓ pass → 그대로 멈춰도 완성품. 더 키우려면 2주차(추천 타당도 검증)로.
✓ pass → 여기서 멈춰도 완결. 더 키우려면 3주차(진행 추적 + 주간 코칭)로.
이행 점검 + 다음 운동 추천
z.object({ session_id: z.string(), adherence: z.enum(['ok','under','overload']), next: z.string(), reason: z.string(), safe: z.boolean() })[
{
"session_id": "WS000",
"adherence": "ok",
"next": "다음 세션 무게 2.5kg 증량",
"reason": "RPE 적정, 전 세트 완수",
"safe": true
},
{
"session_id": "WS901",
"adherence": "overload",
"next": "강도 낮추고 휴식 권장",
"reason": "RPE 10 + 통증 신호",
"safe": false
},
{
"session_id": "WS900",
"adherence": "under",
"next": "데이터 보완 필요",
"reason": "기록 결측",
"safe": true
}
]adherence 규칙·safe 가드는 자동 검증, next 추천 타당성은 트레이너/judge 검증.