모두의포트폴리오
PE · FDE 직군을 위한 포트폴리오 밀키트
예전 판입니다 (1판)이 문서는 2026-08-02 에 새 판으로 개정됐습니다. 산출물을 결과 표시 대시보드에서 사람이 확정해야 다음 세트가 열리는 운동 중 화면으로 바꾸고, 1주차를 기준편과 같은 닷새로 맞췄습니다.최신 판 보기 →
경력플랜핏 · Product Engineer

운동 기록에서 플랜 이행과 정체를 짚고 다음 운동을 추천하는 도구

플랜핏 공고에서 뽑은 세 가지 시그널.

플랜핏은 국내 1위 피트니스 앱의 운동 이행 데이터를 가진 곳이라, 운동 이행·정체를 짚고 다음 운동을 추천하는 이 도구는 플랜핏의 실제 운동 기록이 있어야 추천을 검증한다.

01

개인 맞춤 운동 플랜

'개인 맞춤 플랜부터 운동 진행 경험'. 이행 점검+다음 운동 추천이 그 경험의 핵심.

맞춤운동플랜
02

직관적·효과적 경험

'직관적이고 효과적인 피트니스 경험'. 정체·과부하를 짚어주는 게 효과의 토대.

피트니스경험앱
03

1인 스쿼드 PE

'기획-디자인-개발 1인 스쿼드'. 점검+추천이 혼자 E2E 로 만들 만한 문제.

Product Engineer경험설계

포트폴리오 요약

운동 세션 기록을 받아 플랜 이행과 정체·과부하를 규칙으로 짚고, 다음 운동을 근거와 함께 추천하는 1주 포트폴리오(부상 가드 포함).

고객 정의

플랜핏 PE. 사용자가 자신의 정체를 모른 채 운동하던 경험을, 이행 점검 + 다음 운동 추천 도구로 바꾸고 싶은 사람.

고민 지점

세션에 계획·수행·RPE를 붙이면, 도구가 (a) 이행·정체·과부하를 규칙으로 짚고 (b) 다음 운동을 부상 가드와 함께 추천한다.

주차별 일정

1주차여기까지로 완성

이행 점검 + 다음 운동 추천

운동 세션을 받아 플랜 이행·정체·과부하를 짚고 다음 운동을 근거와 함께 추천하는 동작하는 도구(부상 가드).

  1. 1일 · 운동 세션·플랜 스키마 설계 + 이행·정체·과부하 판정 규칙 + 부상 가드 정의
  2. 2-3일 · 운동 기록 ingest(Python) + 이행/과부하 규칙 + Zod 검증
  3. 4일 · 다음 운동 추천 생성(근거 인용) + 부상 가드
  4. 5일 · 코칭 대시보드(React)이행·정체·다음 운동·근거 한 화면
  5. 6일 · 일부러 만든 결측·경계·미등록 운동 30종으로 점검/가드가 안 깨지는지 확인 + 5% 사람 확인
  6. 7일 · 7일치 시연 영상 + 직접 만든 정답과 비교한 기준선여기까지가 1주차 완성품
2주차선택 성장

추천 타당도 검증

트레이너 2명 라벨과 추천 타당도 일치도(κ)를 재고, 과부하 가드 적중률을 보여주는 대시보드.

  1. 8-9일 · 트레이너 2명 라벨과 추천 타당도 일치도 측정(Cohen’s κ) + 과부하 가드 적중률
  2. 10-11일 · 부위별 과부하 기준 보정 + 추천 임계 튜닝
3주차선택 성장

진행 추적 + 주간 코칭

주간 운동 진행을 추적하고 정체 시 플랜을 자동 조정하는 단계.

  1. 12-14일 · 주간 진행 추적 + 정체 시 플랜 자동 조정
  2. 15일 · 진행 추적 시연 + 3주 통합 영상

데모 · 측정 지표

01

운동 기록을 넣으면 이행·정체와 다음 운동 추천이 근거와 함께 나오는 걸 시연한다

02

과부하/부상 위험 입력을 100% 가드로 잡는 걸 시연한다

측정: 가드 규칙, 표본: 위험 50건

03

일부러 만든 결측·경계·미등록 운동 30종을 넣어도 점검이 멈추지 않고 처리되는 걸 시연한다

정직 경계선

진짜 성능 검증은 여기서 멈춘다

위 수치는 더미데이터 자가채점이며, 실제 추천 타당도는 플랜핏 실데이터 + 실 검수자가 있어야 측정 가능. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만든다.

미리 알아둬야 할 것들

이건 고객·실데이터 없이 혼자 만든 포트폴리오라 모든 수치는 합성 데이터 자가채점이다. 면접에서 '데모 동작 + 실검증 준비 상태'로 솔직히 설명하는 게 오히려 신뢰를 준다

정답을 내가 만들었으니 잘 맞는 게 당연. 그래서 결측·경계·미등록·표기 흔들림 케이스를 더미에 일부러 섞어 쉬운 문제만 푸는 게 아님을 보여준다

부상 안전: 과도한 부하 추천은 절대 하지 않고 통증 신호 시 '강도 낮춤·전문가 권고'로 가드

실제 도입 시 달라지는 것: 실 사용자 체력·운동 분포가 더미와 다르므로 과부하 기준을 실데이터+트레이너 검수로 맞춰야 한다(도입 단계 과제)

더미 데이터

① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.

workout_sessionsTABLE· 12 rows

운동 세션을 묶어 이행·과부하 점검 입력으로 쓴다

② workout_sessions.seed.json 다운로드
① 인라인 샘플 (프리뷰 5 / 12)
session_iduser_rawuser_keyexerciseplanned_setsdone_setsrpepain_flag
WS900김OO(영문)—스쿼트4———
WS901회원0w0데드리프트4010true
WS902완벽수행w2벤치프레스445false
WS903미등록회원—스쿼트42——
WS000회원0w0스쿼트436false
③ 증강 프롬프트 (본인 LLM 에 붙여서 N 배 늘리기)
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건도 별도로.
schema (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 검증
SwiftiOS 운동 코칭 뷰
React웹 코칭 대시보드
Node.js추천 API(`POST /next-workout`)
Django사용자·플랜 관리 백엔드
LLM 선택
model
규칙 기반 이행·과부하 점검 + Claude Sonnet(추천 설명·코칭)
prompt
few-shot 3 + 수치 근거 인용 강제 + 부상 가드 + 추천 schema 강제
rationale
과부하·정체는 RPE/세트 규칙으로, 추천 설명만 LLM. 부상 위험은 가드로 차단.
결정 게이트
1주차 끝1주차 완성품이 자동으로 도는가. 여기까지가 그 자체로 제출 가능한 완성품.

✓ pass → 그대로 멈춰도 완성품. 더 키우려면 2주차(추천 타당도 검증)로.

2주차 끝추천 타당도 검증 결과가 나오는가.

✓ pass → 여기서 멈춰도 완결. 더 키우려면 3주차(진행 추적 + 주간 코칭)로.

재사용 레이어 · 코어 70% / 도메인 30%
core (재사용 가능)
  • 운동 기록 ingest + 이행·과부하 규칙 엔진
  • 다음 운동 추천 + 부상 가드
  • Zod 스키마 강제 검증
  • 코칭 대시보드(React)
  • 5% 인간 spot-check 샘플러
domain (교체 대상)
  • 운동·세트·RPE 스키마
  • 부위별 과부하 기준
  • 운동 표기 정규화
출력 스키마 · workout_output

이행 점검 + 다음 운동 추천

schema (JSON Schema)
z.object({ session_id: z.string(), adherence: z.enum(['ok','under','overload']), next: z.string(), reason: z.string(), safe: z.boolean() })
모범 출력 (3)
[
  {
    "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
  }
]
검증 노트 (자동 vs 수동)

adherence 규칙·safe 가드는 자동 검증, next 추천 타당성은 트레이너/judge 검증.