핏트래커 — 운동 기록 & 친구 챌린지
운동 기록과 친구 챌린지를 묶은 1인 사이드 프로젝트의 데모 스냅샷입니다.
데모 스냅샷
이것은 큐레이션된 데모 스냅샷입니다. 실제 프로젝트 데이터는 검토 후 공개됩니다.
PRD
섹션 구성 ↔ 업계 표준 PRD 템플릿 대응
| 업계 통용 PRD 섹션 | 본 fixture 섹션 | 깊이 메모 |
|---|---|---|
| Problem Statement | 문제 정의 | 기록 도구 파편화·3주 이탈 관찰 |
| Success Metrics | 성공 지표 | WAU 1,000 (3개월), 7일 스트릭 리텐션 35% |
| Non-Functional Requirements | 비기능 요구 | 기록 입력 중앙값 30초, 오프라인 큐 (expo-sqlite) |
| (도메인 고유) | 데이터 프라이버시 | 헬스 데이터 최소 수집 + 사용자 삭제권 |
프로젝트 개요
핏트래커는 개인 운동 기록과 친구 챌린지를 결합한 모바일 헬스 앱입니다. 혼자 운동하는 사람이 의지를 유지하기 어렵다는 문제를, 친구와의 스트릭 경쟁과 챌린지 시스템으로 해결합니다. 1인 사이드 프로젝트로 시작하여 Vooster로 기획부터 태스크 분배까지 15분 만에 구조화했습니다. 타겟 시장은 국내 헬스·홈트·러닝 인구 약 1,500만 명 중 디지털 기록 의향을 가진 20-40대입니다. MVP 출시 후 3개월 내 WAU 1,000명을 목표로 합니다. 앱의 핵심 가치는 "30초 기록, 30일 스트릭, 친구와 함께"입니다. Vooster가 생성한 PRD와 태스크 트리를 그대로 AI 코딩 에이전트에게 전달해 개발을 완료했습니다. 기록의 마찰을 줄이고 소셜 동기를 더해 이탈율을 업계 평균의 절반 수준으로 낮추는 것이 제품 전략의 핵심입니다.
문제 정의
운동 습관을 꾸준히 유지하려는 사람들은 기록 도구의 파편화와 동기 부족이라는 이중 장벽에 막힙니다. 구체적으로 다음 세 가지 상황이 이탈을 가속합니다. 첫째, 범용 메모앱(네이버 메모, Apple Notes)은 통계 집계가 되지 않아 "내가 얼마나 했는지" 감을 줄 수 없습니다. 둘째, 엑셀 스프레드시트는 모바일에서 입력이 불편하고 시각화가 없어 지속 사용 동기가 약합니다. 셋째, 기성 트래커 앱(Strava, Garmin Connect)은 GPS 기기 의존도가 높아 헬스장 실내 운동에는 과잉 스펙입니다. 결과적으로 사용자는 평균 3주 내 이탈하고, 운동 기록 스트릭이 한 번 끊기면 재시작 동기를 잃습니다. 소셜 연결(친구 챌린지, 리더보드)이 부재할 때 이탈 속도는 더욱 빨라집니다. 핏트래커는 이 문제를 "30초 기록 UX + 통계 대시보드 + 챌린지 소셜 레이어"로 해결합니다. 기록의 습관화를 위해 인지적 부담을 최소화하는 것이 가장 중요한 설계 원칙입니다.
타겟 페르소나
페르소나 A — 1인 러너 / 홈트레이너 (가명: 김지수)
Role: 직장인, 30대 초반, 주 4회 아침 러닝 또는 홈트 루틴 실행 운동 패턴: 운동 경력 3년차, 기록 도구를 1년에 2-3번씩 교체하며 연속성이 없음 일상 Pain:
- 매주 운동 일지를 메모앱에 기록하지만 월별 통계가 없어 성취감이 낮음
- 스트릭이 끊기면 재시작 동기가 크게 떨어짐
- 운동 직후 기록 앱을 찾는 것 자체가 귀찮아 중간에 포기 사용 맥락:
- 운동 직후 땀이 식기 전에 30초 내 빠른 입력을 원함
- 주간 목표 달성 여부를 홈 화면 한눈에 확인하고 싶음 Current alternatives: 네이버 메모, 스마트폰 기본 건강앱(걸음 수만 추적) 채택 트리거: 친구가 챌린지 초대 링크를 보내면 앱을 처음 열게 됨 핵심 니즈: 통계 시각화 + 스트릭 게이미피케이션 + 마찰 없는 입력 UX
페르소나 B — 헬스장 동호회 운영자 (가명: 박민준)
Role: 동호회장, 20대 후반-30대, 15-20명 규모 직장인 헬스 모임 운영 운동 패턴: 주 5회 헬스, 4년간 동호회 운영 경험 일상 Pain:
- 회원별 운동 기록을 카카오톡 단체채팅으로 공유하면 정보가 묻힘
- 월간 챌린지 달성률 집계가 매번 수작업으로 30분 이상 소요됨
- 모든 회원에게 앱 설치를 강제하기 어려움 사용 맥락:
- 월간 챌린지를 선언하고 참여자 달성률을 리더보드로 실시간 공유
- 비설치자도 현황을 웹뷰로 조회할 수 있어야 함 Current alternatives: 카카오톡 단체채팅 + 구글 스프레드시트 수기 집계 채택 트리거: 챌린지 공유 URL을 카카오톡에 붙여넣기만 해도 비설치자 현황 조회 가능 핵심 니즈: 챌린지 생성·공유 → 실시간 리더보드 → 자동 집계
페르소나 C — 헬스 입문자 (가명: 이서연)
Role: 대학원생, 20대 중반, 헬스 입문 3개월차 운동 패턴: PT 3개월 이후 자가 운동 전환, 동기 부족으로 이탈 직전 상태 일상 Pain:
- 뭘 얼마나 했는지 기억이 안 나고 성취감이 없음
- 혼자 하면 포기하기 쉽지만 함께할 친구가 없음
- 운동 기록 앱이 너무 복잡해 보여 시작을 못함 사용 맥락:
- 운동 후 "오늘도 했다"는 확인 피드백이 필요
- 친구 1명과의 소규모 챌린지면 충분 Current alternatives: PT 다이어리(종이), 인스타 인증 (불규칙) 채택 트리거: 인스타그램 피드에서 친구의 스트릭 인증 게시물을 보고 설치 핵심 니즈: 낮은 진입 장벽 + 1:1 친구 챌린지 + 즉각적 성취 피드백
사용자 스토리
-
US-001: As a solo exerciser, I want to log a workout in under 30 seconds, so that I can capture data immediately after exercise without friction. Acceptance Criteria:
- 입력 화면 진입부터 저장까지 탭 3회 이하로 완료 가능
- 운동 종류·시간·강도를 단일 화면에서 입력 가능
- 오프라인 상태에서도 로컬 저장 후 온라인 복구 시 자동 동기화
- 저장 성공 후 홈 화면에서 당일 운동 기록을 즉시 확인 가능
-
US-002: As a user, I want to see my current streak and weekly stats on the home screen, so that I stay motivated to maintain my workout habit daily. Acceptance Criteria:
- 홈 화면 진입 시 현재 스트릭 일수와 이번 주 운동 횟수 즉시 표시
- 스트릭이 끊겼을 때 재시작 유도 배너와 함께 최장 스트릭 기록 표시
- 7일·30일 스트릭 달성 시 축하 애니메이션 및 알림 트리거
- 주간 목표 달성 시 홈 화면에서 완료 배지 시각화
-
US-003: As a gym club organizer, I want to create a 30-day challenge and invite members via a link, so that I can track group completion without relying on a group chat. Acceptance Criteria:
- 챌린지 생성 후 공유 URL 원탭 복사 가능
- 초대 링크 수신자가 앱 미설치 상태에서도 웹뷰로 챌린지 현황 조회 가능
- 리더보드에서 참여자별 달성률 실시간 업데이트
- 챌린지 종료 시 생성자에게 최종 결과 요약 알림 발송
-
US-004: As a user, I want to receive a push notification when I haven't logged a workout for 2 days, so that I remember to keep my streak going. Acceptance Criteria:
- 2일 연속 비입력 시 오전 8시 Expo Push Notifications 발송
- 알림 탭 시 운동 기록 입력 화면으로 딥링크 이동
- 설정 화면에서 알림 시간대 커스터마이징 및 비활성화 가능
- 알림 발송 이력이 중복 방지 테이블에 기록되어 재발송 차단
-
US-005: As a user, I want to view monthly workout statistics by type, so that I can understand whether my training is balanced across different exercise categories. Acceptance Criteria:
- 월별 운동 종류별 시간 합산 바 차트 표시
- 전월 대비 증감률 수치 및 방향 아이콘 표시
- 데이터 없는 달은 빈 상태 UI로 처리하여 오해 방지
- 특정 운동 종류 탭 시 해당 월 기록 상세 리스트 조회 가능
-
US-006: As a challenge participant, I want to see where I rank on the leaderboard, so that friendly competition keeps me engaged throughout the challenge period. Acceptance Criteria:
- 챌린지 리더보드에서 참여자 순위·달성률 표시
- 본인 행 하이라이트로 빠른 자기 순위 확인 가능
- 챌린지 종료 후 최종 결과 요약 화면 및 공유 버튼 노출
- 내가 1등일 때 상단에 왕관 아이콘 등 시각적 강조 제공
-
US-007: As a user, I want my workout history to be available offline, so that I can review past records even when I have no network connection. Acceptance Criteria:
- 최근 30일 운동 기록 SQLite 로컬 캐시 유지
- 네트워크 복구 시 자동 동기화, 충돌 시 서버 타임스탬프 우선
- 오프라인 상태 시 상단 배너로 명시적 안내
- 동기화 완료 시 성공 토스트 메시지 표시
-
US-008: As a new user, I want to complete onboarding in under 2 minutes, so that I can start logging my first workout without feeling overwhelmed. Acceptance Criteria:
- 온보딩 화면 3단계 이하(운동 목표 선택 → 알림 설정 → 첫 기록 유도)
- 각 단계 건너뛰기(Skip) 옵션 제공
- 온보딩 완료 후 즉시 첫 운동 기록 입력 화면으로 이동
- 목표 운동 횟수 설정이 홈 화면 주간 목표 배지에 즉시 반영
핵심 기능 명세
F1. 운동 기록 입력 & 히스토리 조회
목적: 운동 직후 마찰 없는 빠른 기록과 과거 기록 조회로 습관 형성 지원 동작:
- 운동 종류(러닝·홈트·헬스·수영 등) 선택
- 시간·강도 슬라이더 입력
- 메모(선택 사항) 작성 후 저장
- 캘린더 뷰에서 날짜별 운동 기록 아이콘 표시 및 상세 조회
- 오프라인 상태에서는 로컬 SQLite에 임시 저장, 온라인 복구 시 동기화
- 저장된 기록은 24시간 이내 수정 가능 우선순위: MUST 성공 신호: 기록 입력 소요시간 중앙값 30초 이하 / 7일 재방문율 60% 이상
F2. 스트릭 & 통계 대시보드
목적: 연속 운동 일수(스트릭)와 주간·월간 통계 시각화로 지속 동기 유지 동작:
- 홈 화면 상단에 현재 스트릭 일수·최장 스트릭·이번 주 운동 횟수 표시
- 주간·월간 운동 시간 바 차트 제공
- 스트릭 7일/30일 달성 시 축하 애니메이션 트리거
- 스트릭이 끊기면 재시작 유도 배너 및 이전 최장 스트릭 표시
- 가입 이후 전체 누적 통계 요약 페이지 제공 우선순위: MUST 성공 신호: 7일 스트릭 유지율 35% 이상 / 30일 스트릭 유지율 15% 이상
F3. 친구 챌린지 생성 & 참여
목적: 소셜 압력을 활용한 지속 동기 강화 및 신규 유저 바이럴 유입 동작:
- 챌린지 이름·기간·목표 횟수 설정
- 공유 링크 생성(1탭 복사) 및 카카오톡·문자 공유
- 참여자 달성률 리더보드 실시간 표시
- 비설치자는 웹뷰로 현황 조회 가능
- 진행률 50% 달성 시 참여자 전원에게 동기 부여 알림 발송 우선순위: SHOULD 성공 신호: 활성 유저 중 챌린지 생성·참여율 25% 이상 / 챌린지 완주율 40% 이상
F4. 푸시 알림 & 스트릭 리마인드
목적: 스트릭 유지를 위한 시의적절한 개입으로 이탈 방지 동작:
- 2일 연속 비입력 시 Expo Push Notifications 발송
- 알림 탭 시 운동 기록 화면으로 딥링크 이동
- 설정에서 알림 시간대·빈도 조정 가능
- opt-out 기능 제공
- 스트릭 복구 패스(월 1회): grace period 내 기록 시 스트릭 유지 우선순위: SHOULD 성공 신호: 알림 opt-in율 50% 이상 / 알림 후 당일 기록 전환율 30% 이상
F5. 오프라인 기록 & Supabase 동기화
목적: 네트워크 불안정 환경에서도 운동 기록 연속성 보장 동작:
- expo-sqlite로 운동 기록 로컬 저장
- 네트워크 복구 시 Supabase Auth 세션 기반 자동 동기화
- 충돌 시 서버 타임스탬프 우선 정책 적용
- 동기화 상태 배너로 사용자에게 명시적 안내
- 동기화 실패 시 재시도 큐에 등록, 다음 온라인 시 자동 재처리 우선순위: SHOULD 성공 신호: 오프라인 기록 후 Supabase 동기화 성공률 99% 이상
성공 지표
-
7일 스트릭 유지율: 신규 가입 후 7일 연속 운동 기록을 유지한 유저 비율.
- 목표: 35% (피트니스 앱 업계 평균 20-25% 대비 +10%p)
- 측정: 가입 후 7일째 기준, 7일 연속 기록 유저 수 / 전체 신규 가입자 수
- 비고: 스트릭 유지율은 프로덕트 핵심 가치 검증의 주요 north-star 지표
-
30일 스트릭 유지율: 가입 후 30일 연속 운동 기록 달성 비율.
- 목표: 15%
- 측정: 가입 후 30일째 기준, 30일 연속 기록 유저 수 / 전체 신규 가입자 수
- 비고: 30일 달성자는 유료화 전환 후보 세그먼트로 별도 관리
-
WAU (주간 활성 유저): 주 1회 이상 운동 기록을 입력한 유저 수.
- 목표: 출시 3개월 내 WAU 1,000명 달성
- 측정: 매주 월~일 집계 기간 내 1회 이상 기록 입력 유저 수
- 비고: DAU/WAU 비율도 함께 추적하여 일 단위 활성도 확인
-
친구 챌린지 생성·참여율: 활성 유저(WAU) 중 챌린지를 생성하거나 참여한 유저 비율.
- 목표: 25%
- 측정: (챌린지 생성 유저 + 챌린지 참여 유저) / WAU
- 비고: 챌린지 완주율(40% 목표)도 별도 트래킹하여 소셜 기능 품질 검증
-
기록 입력 소요시간 중앙값: 운동 기록 입력 화면 진입부터 저장 완료까지 소요 시간.
- 목표: 중앙값 30초 이하
- 측정: 앱 내 이벤트 로그(screen_enter → save_success) 타임스탬프 차이 중앙값
- 비고: P90 소요시간도 측정하여 이상치 유발 UX 문제 탐지
비기능 요구사항
- 성능: 운동 기록 저장 요청의 서버 응답 시간 목표 500ms 미만 (P95 기준, 모바일 4G 환경). 앱 콜드 스타트 3초 이내. 이미지(프로필 사진) 업로드 최대 5MB, 지원 포맷 JPG/PNG.
- 오프라인 기록: 네트워크 단절 시 expo-sqlite로 로컬 저장 후 온라인 복구 시 Supabase로 자동 동기화. 충돌은 서버 타임스탬프 우선 정책으로 해결. 마지막 동기화 시각을 설정 화면에 표시하여 사용자 확인 가능.
- 접근성: iOS VoiceOver 및 Android TalkBack 대응 — 모든 주요 인터랙션 엘리먼트에 accessibilityLabel·accessibilityHint 필수. WCAG 2.1 AA 수준 색 대비 충족. Dynamic Type(동적 폰트 크기) 대응 필수.
- 다국어: ko/en 2개 로케일 지원. i18n 키 기반 텍스트 관리로 추가 로케일 확장 시 코드 변경 최소화. RTL 레이아웃 지원은 V2로 이월.
- 보안: Supabase Auth JWT 기반 API 인증. PostgreSQL Row Level Security(RLS)로 타 유저 데이터 접근 차단. 앱 백그라운드 전환 시 민감 화면 블러 처리.
- 플랫폼 지원: iOS 16+ / Android 13+ 지원. Expo SDK 최신 stable 버전 유지. JS 레이어 핫픽스는 Expo OTA(Over-the-Air) 업데이트로 배포.
데이터 프라이버시
운동 기록(운동 종류·시간·강도·선택적 위치 정보)은 사용자의 신체 활동 패턴을 반영하는 민감 정보입니다. 핏트래커는 개인정보 처리에 다음 원칙을 적용합니다.
- 수집 최소화:
- 운동 기록 저장에 필수적인 항목(운동 종류, 시간, 강도)만 기본 수집
- 위치 정보는 GPS 트래킹을 명시적으로 opt-in한 야외 러닝에서만 수집
- 선택적 메모 필드는 로컬에만 저장하는 옵션 제공 (서버 전송 opt-in)
- 챌린지 공유 범위 제어:
- 챌린지 참여 시 공개 정보는 닉네임과 달성률(%)에 한정
- 상세 운동 기록(종류·강도 등)은 본인만 열람 가능
- 챌린지 공개 범위(초대받은 참여자만 / 링크 보유자 전체)를 사용자가 선택 가능
- 기록 보관 및 삭제 정책:
- 서비스 탈퇴 시 30일 이내 모든 개인 운동 데이터 완전 삭제
- 사용자는 앱 내 설정에서 특정 기간 기록을 즉시 삭제 가능
- 삭제 요청은 soft delete 후 24시간 내 hard delete로 처리
- PIPA 준수:
- 개인정보 보호법(PIPA) 기준 개인정보 처리방침 공개
- 건강 관련 민감 정보 수집 시 일반 이용약관과 별도 동의 절차 적용
- 데이터 이전성:
- 전체 운동 기록을 CSV 형식으로 내보내기(export) 가능
- 플랫폼 종속(vendor lock-in) 방지
- iOS/Android 시스템 백업에 데이터 포함 여부를 사용자가 설정 가능
스코프 경계
V1에서 제공하지 않는 것:
- 생체신호(심박수·칼로리 소모·혈중 산소) 웨어러블 / HealthKit / Google Fit 연동 → 하드웨어 의존성과 인증 비용이 높아 V2로 이월
- 영양 관리 및 식단 기록 기능 → 도메인이 달라 별도 앱 또는 V2+ 연동 모듈로 분리 예정
- 유료 퍼스널 트레이너 코칭 또는 AI 운동 처방 서비스 → 전문가 자격 검증 요구 사항이 복잡하여 PMF 확인 후 검토
- 라이브 스트리밍 운동 클래스 기능 → 미디어 인프라 비용 및 안전 관리 리소스 미확보
- 팀·조직 단위 구독 플랜 또는 기업용 어드민 관리 콘솔 → B2B 전환은 소비자 PMF 확인 후 검토
- 다른 피트니스 서비스(제3자 앱)와의 운동 기록 임포트/익스포트 연동 → API 표준화 비용이 높아 V2 로드맵에 포함
기술 스택 & 아키텍처 개요
- Frontend: React Native (Expo) Expo managed workflow를 채택하여 iOS/Android 빌드 파이프라인 단순화 우선. EAS Build/Submit으로 App Store · Play Store 배포 자동화.
- Backend: Supabase (PostgreSQL + Auth + Storage) Supabase Auth로 이메일 / Google OAuth 로그인 구현. Row Level Security(RLS)로 유저별 데이터 격리. Storage는 프로필 이미지 업로드에 사용.
- 알림: Expo Push Notifications 단일 API로 iOS APNs / Android FCM을 추상화하여 크로스플랫폼 푸시 처리. 알림 스케줄링은 Supabase Edge Function + cron trigger로 서버 사이드 처리.
- 로컬 저장소: expo-sqlite 기반 오프라인 캐시. 온라인 복구 시 Supabase REST API로 배치 동기화.
- 주요 제약: Expo managed workflow로 arbitrary native module 직접 추가 불가. 고급 Bluetooth/생체인식 연동 필요 시 V2에서 bare workflow 전환 검토.
태스크 트리
Sprint 1 — 인증 & 기본 기록
인증 시스템과 운동 기록 기본 기능
-
[TASK-001] 사용자 인증 구현
DONE(complexity: 3, urgency: 5, importance: MUST)Supabase Auth를 사용하여 이메일/소셜 로그인 구현. 세션 관리 포함.
- ST-001-1: 로그인 UI 구현
DONE - ST-001-2: Supabase Auth 연동
DONE
- ST-001-1: 로그인 UI 구현
-
[TASK-002] 운동 기록 CRUD
IN_PROGRESS(complexity: 4, urgency: 4, importance: MUST)Supabase DB에 운동 기록 테이블 생성 및 CRUD 기능 구현.
- ST-002-1: DB 스키마 설계
DONE - ST-002-2: 운동 기록 화면 구현
IN_PROGRESS
- ST-002-1: DB 스키마 설계
Sprint 2 — 소셜 기능
친구 초대 및 챌린지 시스템
-
[TASK-003] 친구 챌린지 기능
BACKLOG(complexity: 5, urgency: 3, importance: SHOULD)챌린지 생성, 초대, 달성률 비교 기능 구현.