운동 기록이 다음 계획을 바꾸게 만들기 — 풀업 30
중량을 바꿔 운동을 저장해도 다음 목표가 기본값으로 돌아왔습니다. 목표 입력과 실제 완료 기록을 분리하고, 완료 이력으로 다음 계획을 다시 계산하는 규칙을 만들었습니다.
턱걸이 30회를 목표로 풀업 30을 만들며 직접 사용했습니다. 중량을 바꿔 저장했는데 다음 운동을 열면 목표가 기본값으로 돌아왔습니다. 운동은 기록됐지만 다음 계획은 그 기록을 읽지 않는 상태였습니다.
앱 구현에는 AI의 도움을 받았습니다. 저는 직접 사용하며 이 문제를 발견했고, 무엇을 완료 기록으로 인정하며 어떤 기록이 다음 목표를 바꾸는지 제품 규칙과 검증 조건을 정했습니다. 이 글은 그 한 가지 판단을 다룹니다.
목표 숫자와 완료한 운동을 분리했다
운동 화면의 목표 숫자와 실제 수행은 다른 데이터입니다. 목표를 올렸다고 측정 최고 기록까지 올라가면 이력을 믿을 수 없습니다. 측정한 적이 없다면 최고 기록은 미측정으로 남기고, 첫 계획의 계산값만 따로 사용했습니다.
저장값을 입력창에 다시 채우는 것만으로는 원래 문제가 해결되지 않았습니다. 추천 계산이 여전히 과거 값을 읽기 때문입니다. 대상 날짜보다 이전에 완료한 운동을 순서대로 읽어 다음 목표를 계산하도록 바꿨습니다. 중량 운동이 예정됐어도 맨몸으로 했다면 맨몸 기록으로 취급하고, 휴식일과 미기록 날짜는 완료한 운동으로 세지 않았습니다. 과거 기록을 수정하면 그 이후 계획도 다시 계산합니다.
예를 들어 7.5kg으로 각 5회씩 5세트를 두 번 완료하고 증량 폭이 2.5kg이라면, 다음 목표는 10kg으로 각 세트 3회입니다. 중간에 5kg에서 7.5kg으로 무게를 바꿨다면 5kg에서의 성공 횟수는 이어 세지 않습니다. 이 숫자는 개인 운동 성과가 아니라 앱 규칙을 설명하는 예시입니다.
기록 카드에는 그날 실제로 한 일을, 운동 화면에는 그 이력에서 계산한 다음 목표를 보여줬습니다. 목표와 수행을 같은 숫자로 다루지 않으니 과거 수정이 미래 계획을 바꾸는 이유도 설명할 수 있었습니다.
입력 중인 숫자는 완료 기록이 아니었다
계산이 완료 이력만 읽어도, 입력란의 목표 횟수가 자동으로 저장되면 다시 잘못된 기록이 생깁니다. 완료한 세트와 진행 중인 세트를 구별하고 마지막 세트 차례부터 새 기록을 저장할 수 있게 했습니다. 화면이 마지막 세트의 실제 수행을 별도로 인증하는 구조는 아닙니다. 과거 완료 기록을 수정할 때는 새 운동처럼 세트를 다시 진행시키지 않았습니다.
입력 중인 초안도 완료 이력과 분리했습니다. 저장에 성공한 뒤에는 완료 기록을 보여주고, 수정은 별도 행동으로 열었습니다. 초안 → 완료한 수행 → 다음 계획의 상태가 섞이지 않아야 했습니다.
제가 확인한 범위
AI의 구현 도움을 받으면서 직접 사용해 발견한 오류와 규칙의 반례를 고정 사례로 만들었습니다. 미측정 상태에서는 최고 기록을 만들지 않는지, 중량이 바뀌면 이전 중량의 성공 횟수를 이어 세지 않는지, 과거 완료 기록을 고치면 이후 계획이 다시 계산되는지를 테스트와 화면에서 대조했습니다. 실제 사용 중 기본값으로 돌아오던 경로를 완료 이력 기반 계산으로 바꿨습니다. 여러 사람이 장기간 사용했을 때 훈련 성과가 좋아졌다는 자료는 없습니다.
이후 기록을 잃지 않고 앱 구조를 Next.js·React·TypeScript로 옮기고 계정·오프라인 동기화를 더했습니다. 이는 이 글의 운동 규칙과는 다른 후속 과제입니다. 로컬 에뮬레이터와 테스트에서 기록 보존을 확인했지만, 실제 iPhone·Android의 장시간 오프라인 동작과 배포된 서버 규칙까지 입증한 것은 아닙니다.
이 사례의 기준은 기능의 개수가 아니라 오늘 완료한 수행만 내일의 목표를 바꾸게 하는 것이었습니다.