서비스·생활

Gym Grow How

세트 기록을 근육별 주간 총부하량으로 집계해 근성장 운동량을 관리하는 Next.js + Supabase 운동 기록 웹앱.

분야서비스·생활플랫폼Web (PWA)기술Next.js 16 · React 19 · TypeScript · Supabase (Auth · Postgres · RLS) · react-body-highlighter · Service Worker · node:test저장소비공개
훈련 지도: 최근 7일 근육별 환산 세트를 인체 지도로 보여 줍니다.
훈련 지도: 최근 7일 근육별 환산 세트를 인체 지도로 보여 줍니다.
세트 입력: 이전 기록, 무게·횟수·여유(RIR), 드롭 세트.
세트 입력: 이전 기록, 무게·횟수·여유(RIR), 드롭 세트.
근육별 주간 훈련량.
근육별 주간 훈련량.
루틴: 운동별 세트 수와 반복 범위.
루틴: 운동별 세트 수와 반복 범위.

왜 만들었나

일반 운동 앱은 운동별 기록만 보여줘서, 이번 주에 근육별로 운동량이 충분했는지와 실제 수행 능력이 좋아졌는지를 판단하기 어려웠다.

주요 기능

  • 근육별 주간 환산 세트·총중량 집계(주동근 1, 보조근 0.5 가중치)
  • 같은 운동·같은 기구끼리 최고 세트 비교와 더블 프로그레션 증량 판단
  • 추정 1RM(Epley)·수행지수·노력 체크 등 수행 분석
  • 인체 지도 시각화, Fleek CSV 가져오기·내보내기
  • 오프라인 대기열 동기화 PWA, 한국어·영어·러시아어

숫자로 보면

기본 운동 233개 · 근육 16개 분류
운동 예시 이미지 446장
엔진·분석 단위 테스트 43개

어떻게 동작하나

  1. 세트 기록

    세트 종류·무게·반복·RIR을 입력하고 드롭 세트는 직전 무게의 80%를 원판 단위로 반올림해 붙인다.

    src/sets.ts
  2. 로컬 저장·동기화

    변경을 행 단위 대기열에 넣어 Supabase로 보내고, 실패하면 남겨 두었다가 재전송한다.

    app/store.ts
  3. 주간 집계

    사용자 시간대의 월요일 기준 주로 묶어 근육별 환산 세트·총중량·훈련 일수를 계산한다.

    src/engine.ts
  4. 운동 사전 매핑

    운동마다 주동근·보조근 기여도와 기구 종류를 정의해 집계에 쓴다.

    src/library.ts
  5. 수행 분석

    추정 최대 무게, 42일 기준선 대비 수행지수, 증량 예상과 체성분 추세를 계산한다.

    src/analysis.ts
  6. 화면 표시

    인체 지도와 근육량 예상 카드로 주간 결과를 보여준다.

    app/bodymap.tsx

구조

Supabase가 인증과 행 단위 보안(본인 기록만)이 걸린 records 테이블을 제공하고, 집계는 저장 없이 클라이언트에서 매번 재계산한다.

Next.js 앱React 19 · PWA
로컬 상태localStorage · 동기화 대기열
집계 엔진engine.ts · analysis.ts
운동 사전233개 운동 · 근육 기여도
SupabaseAuth · Postgres · RLS
  • 로컬 상태 → Supabase: 행 단위 동기화
  • 집계 엔진 → Next.js 앱: 주간 리포트

비공개 저장소라 소스 코드 링크와 코드 발췌는 싣지 않았습니다.

어려웠던 점

한 세트를 근육마다 더하면 데드리프트 1세트가 하체에 2~3세트로 부풀려져서, 부위 단위로는 가장 큰 가중치로 한 번만 세는 규칙을 따로 두었다. 1RM 추정이 고반복에서 부정확한 점을 고려해 반복 상한을 두고, 미기록 RIR은 보수적으로 처리했다.