한 줄 요약
저는 달리기를 좋아합니다. 거의 매일 5~10km 정도를 뛰는데, 아이폰 건강 앱이나 일반 러닝 앱에서 보여주는 데이터가 제가 보고 싶은 방식과는 조금 달랐습니다.
그래서 제 러닝 데이터를 직접 끌어와서 데일리 러닝 대시보드를 만들고, 주간·월간은 대시보드에 AI 코치 분석까지 붙여 블로그 글처럼 읽을 수 있게 만들었습니다.
이런 분들께 도움돼요
운동 기록은 쌓이는데 정작 다시 보지는 않는 분
애플 건강 앱, 스트라바, 나이키런클럽 같은 앱의 화면이 아쉬웠던 분
내 운동 데이터를 내가 원하는 말투와 기준으로 보고 싶은 분
AI를 업무 자동화뿐 아니라 개인 생활 루틴에도 붙여보고 싶은 분
"나에게 필요한 도구는 직접 만든다"는 방식에 관심 있는 분
시작하게 된 이유
저는 제가 필요한 것을 직접 만들어 쓰는 걸 좋아합니다.
업무 자동화든, 블로그 자동화든, 대시보드든, 처음부터 거창하게 만들려고 한 건 아니었습니다. 그냥 제가 매일 불편하다고 느끼는 것을 하나씩 고치다 보니 점점 제 생활에 맞는 시스템이 되었습니다.
러닝 대시보드도 같은 이유로 시작했습니다.
저는 달리기를 좋아합니다. 평소에 5km에서 10km 정도를 자주 뛰고, 하프마라톤이나 마라톤 준비도 합니다. 그러다 보니 아이폰에는 러닝 데이터가 계속 쌓입니다.
그런데 막상 아이폰 건강 앱을 열어보면 이런 생각이 들었습니다.
오늘 몇 km 뛰었는지는 알겠는데,
그래서 내 몸 상태가 좋은 건지 나쁜 건지는 잘 모르겠다.
애플 건강 앱은 데이터를 많이 가지고 있지만, 제가 보고 싶은 질문에 바로 답해주지는 않았습니다.
예를 들면 저는 이런 게 궁금했습니다.
오늘 러닝은 가벼운 조깅이었나, 무리한 훈련이었나?
이번 주는 평소보다 많이 뛴 건가?
하프마라톤 준비는 잘 되고 있나?
최근 피로가 쌓이고 있는 건가?
쉬어야 하는 날인가, 조금 더 뛰어도 되는 날인가?
기존 러닝 앱도 써봤습니다. 그런데 대부분 영어 UI가 많고, 수치가 너무 운동선수용처럼 느껴졌습니다.
또 하나의 문제는 데이터 접근이었습니다.
아이폰 기본 건강 앱에는 운동 기록이 쌓이지만, 그 데이터를 제가 원하는 방식으로 쉽게 끌어와서 가공하기는 어려웠습니다. 화면에서는 볼 수 있지만, 자동화 파이프라인에서 매일 읽고 정리하기에는 불편했습니다.
그래서 HealthFit 앱을 사용했습니다. HealthFit은 아이폰 운동 데이터를 FIT 파일로 내보낼 수 있어서, 제가 만든 파이프라인이 운동 기록을 파일 단위로 읽고 정리하기 좋았습니다.
저는 전 문 선수처럼 분석하고 싶은 게 아니었습니다.
그냥 제가 매일 보고 바로 이해할 수 있는 말로,
오늘은 잘 뛰었음
이번 주는 좀 무리했음
다음 러닝은 천천히 가야 함
이번 달은 체력은 늘었지만 회복이 부족함
이렇게 알려주는 대시보드가 필요했습니다.
그래서 직접 만들기로 했습니다
처음 목표는 단순했습니다.
내 러닝 데이터를 끌어와서
내가 보고 싶은 화면으로 보여주자.
아이폰에 쌓인 운동 데이터는 HealthFit을 통해 FIT 파일로 내보낼 수 있습니다. 그 데이터를 읽어서 거리, 시간, 페이스, 심박, 강도, 훈련 부하 같은 값을 정리했습니다.
그리고 이걸 세 가지 단위로 나눴습니다.
1. 데일리 러닝 대시보드
- 오늘 또는 최근 러닝을 한눈에 보기
2. 주간 러닝 분석
- 이번 주 훈련 흐름과 회복 상태 보기
3. 월간 러닝 분석
- 한 달 전체의 훈련량, 성장, 위험 신호, 다음 계획 정리
데일리는 빠르게 보는 용도입니다.
매일 아침에 "어제 또는 최근 러닝이 어땠는지" 확인하면 됩니다. 그래서 데일리 러닝은 대시보드 중심으로 만들었습니다. 숫자와 카드가 바로 보여야 하기 때문입니다.
반대로 주간과 월간은 조금 다릅니다.
한 주나 한 달은 단순히 숫자만 보면 재미가 없습니다. 28km를 뛰었다, 116km를 뛰었다는 숫자보다 중요한 것은 그 안의 흐름입니다.
그래서 주간과 월간은 대시보드만 만드는 게 아니라, 그 데이터를 바탕으로 AI 코치가 글처럼 분석해주도록 만들었습니다.
데이터는 어디서 가져왔나
데이터 출발점은 아이폰 운동 기록입니다.
아이폰 기본 건강 앱에서 바로 데이터를 다루기 어려웠기 때문에, 중간에 HealthFit 앱을 사용했습니다. 아이폰에서 기록된 운동을 HealthFit 앱을 통해 FIT 파일로 내보낸 것입니다.
FIT 파일은 러닝 앱이나 스포츠 워치에서 많이 쓰는 운동 기록 파일 형식입니다. 안에는 운동 날짜, 시작 시간, 거리, 시간, 페이스, 심박, 고도, 칼로리, 훈련 강도 같은 정보가 들어 있습니다.
제가 만든 파이프라인은 이 FIT 파일을 두 군데에서 찾습니다.
1. iCloud HealthFit 폴더
- 아이폰/HealthFit이 저장한 원본 운동 파일
2. Google Drive HealthFit 폴더
- iCloud에서 바로 읽기 어려운 파일을 보조로 확인하는 경로
처음에는 그냥 파일을 읽으면 될 줄 알았습니다. 그런데 실제로 해보니 운동 데이터도 꽤 지저분했습니다.
같은 운동이 중복으로 들어올 수 있음
Google Drive 파일은 로컬에 실제 내용이 없고 껍데기만 있을 수 있음
파일명이 한글/영문/기호가 섞이면 중복 판단이 흔들릴 수 있음
GPS나 심박 데이터가 일부 비어 있을 수 있음
그래서 단순히 "새 파일을 읽는다"가 아니라, 먼저 정제 규칙을 넣었습니다.
FIT 파일 수집
→ 파일을 실제로 읽을 수 있는지 확인
→ 필요하면 임시 폴더에 내려받아 읽기
→ 운동 날짜, 시간, 거리, 운동 종류로 세션 키 만들기
→ 이미 저장된 운동이면 중복 스킵
→ 새 운동만 running_log.jsonl에 한 줄씩 저장
여기서 running_log.jsonl은 제 러닝 데이터의 기본 장부입니다. 운동 1개가 JSON 한 줄로 저장됩니다.
예를 들면 이런 식의 정보가 들어갑니다.
날짜
시작 시간
운동 종류
거리
시간
평균 페이스
평균 심박
최대 심박
고도
TRIMP
원본 FIT 파일명
이렇게 해두면 다음 단계부터는 HealthFit 원본 파일을 매번 다시 뒤질 필요가 없습니다. 대시보드와 분석은 모두 이 정제된 러닝 로그를 기준으로 움직입니다.
데이터를 어떻게 정제했나
러닝 기록을 그대로 보여주면 그냥 운동 일지입니다.
제가 보고 싶었던 것은 "기록"이 아니라 "판단"이었습니다. 그래서 러닝 로그 위에 훈련 부하 데이터를 한 겹 더 만들었습니다.
여기서 계산하는 값은 대략 이런 것들입니다.
TRIMP:
심박과 운동 시간을 바탕으로 훈련 부담을 점수화한 값
CTL:
최근 28일 기준 장기 체력 흐름
ATL:
최근 피로도에 가까운 단기 부하 흐름
TSB:
몸이 가벼운지, 피로가 쌓였는지 보는 회복 잔량
ACWR:
최근 부하가 평소보다 얼마나 높은지 보는 비율
이런 값을 넣으니 질문이 바뀌었습니다.
예전에는 이렇게 봤습니다.
오늘 5.5km 뛰었네.
이제는 이렇게 볼 수 있습니다.
오늘 5.5km가 내 몸에는 가벼운 조깅이었나?
아니면 최근 부하를 더 올린 훈련이었나?
최근 7일 부하가 평소보다 높은가?
지금은 더 뛰어도 되는 상태인가?
대시보드는 바로 이 정제된 데이터를 기준으로 만들어집니다.
보기 좋은 시각화는 어떻게 만들었나
처음부터 "예쁜 대시보드"를 만들려고 한 것은 아닙니다.
먼저 매일 보고 싶은 질문을 정했습니다.
오늘 운동 요약
거리와 페이스
심박 흐름
강도 분포
최근 부하
회복 잔량
이번 주/이번 달 흐름
AI 코치 한마디
그다음 이 질문을 카드 단위로 나눴습니다.
숫자는 숫자대로 보여주고, 판단이 필요한 부분은 색과 문장으로 바꿨습니다.
예를 들면 단순히 ACWR 1.75라고 쓰면 바로 이해하기 어렵습니다. 그래서 대시보드에서는 이 값을 "최근 부하가 평소보다 높은지", "삐끗 주의 구간인지"처럼 읽을 수 있게 바꿨습니다.
시각화는 크게 세 가지 원칙으로 만들었습니다.
1. 한눈에 보이기
- 카드형 구성
- 거리, 페이스, 심박, 부하를 각각 분리
2. 다음 행동으로 이어지기
- "좋음/주의/회복 필요"처럼 판단 가능한 표현 사용
3. 나중에 다시 보기
- 데일리, 주간, 월간 HTML을 저장
- 주간/월간은 블로그 초안처럼 읽히게 작성
데일리는 짧게 보는 대시보드입니다. 그래서 카드와 숫자 중심입니다.
주간과 월간은 캡처 가능한 대시보드에 더해, 각 챕터를 글처럼 풀었습니다. 한 달 뒤에 다시 봤을 때도 "그때 내가 왜 무리했는지", "어떤 흐름이 있었는지"를 읽을 수 있어야 했기 때문입니다.
기술적으로는 이런 흐름입니다.
running_log.jsonl
→ training_load.jsonl
→ 대시보드 HTML 생성
→ 카드/차트/요약 문장 구성
→ Vercel에 배포
→ 짧은 URL로 텔레그램에 전달
→ 주간·월간은 블로그 초안으로도 저장
그래서 결과물은 단순한 운동 기록표가 아니라, 제가 매일 보고 다음 행동을 정할 수 있는 화면이 됐습니다.
실제로 보고 싶은 데이터는 달랐습니다
제가 원한 건 운동 앱에 흔히 있는 예쁜 그래프가 아니었습니다.
제가 매일 궁금한 건 이런 것이었습니다.
오늘 많이 뛴 건가?
페이스가 빨랐던 건가?
심박이 너무 높았나?
최근 부하가 평소보다 높은가?
쉬운 러닝이 충분했나?
이번 주는 회복이 되고 있나?
다음 러닝은 어떻게 가야 하나?
그래서 대시보드에는 단순 기록보다 판단에 도움이 되는 값을 넣었습니다.
거리
시간
평균 페이스
심박 흐름
강도 분포
최근 부하
회복 잔량
주간·월간 누적 거리
쉬운 러닝과 빡센 러닝의 비율
여기서 중요한 건 "정확한 운동 과학 앱"을 만들겠다는 게 아니었습니다.
제가 매일 운동을 계속하기 위해 필요한 정도의 해석을 얻는 것이 목표였습니다.
AI 코치 톤을 넣은 이유
처음에는 그냥 차트만 있으면 될 줄 알았습니다.
그런데 막상 대시보드를 만들어보니, 숫자는 보여도 매일 보고 싶지는 않았습니다. 숫자만 있는 대시보드는 금방 재미가 없어집니다.
그래서 AI 코치 톤을 넣었습니다.
예를 들면 월간 분석에서 이런 식으로 말해줍니다.
체력 성장 열차는 출발했는데,
객실 안에 피로 짐이 아직 많았습니다.
또는 이런 식입니다.
느린 날은 실패가 아니라 충전입니다.
이런 문장이 들어가니까 데이터가 훨씬 잘 읽혔습니다.
그냥 "강도 비율 75.2%"라고 나오면 지나치기 쉽습니다. 그런데 "이번 달은 많이 뛴 문제가 아니라, 자주 세게 뛴 문제가 큽니다"라고 말해주면 바로 와닿습니다.
제가 원한 건 냉정한 운동 과학 리포트가 아니라, 매일 계속 뛰게 해주는 코치였습니다.
그래서 AI 코치에게 이런 역할을 맡겼습니다.
숫자는 정확하게 본다.
하지만 설명은 사람이 이해하기 쉽게 한다.
너무 심각하게 겁주지 않는다.
대신 무리한 신호는 확실히 말 한다.
다음 행동을 짧게 제안한다.
데일리, 주간, 월간을 다르게 만든 이유
처음에는 하나의 대시보드에 전부 넣으려고 했습니다.
그런데 직접 써보니 일간, 주간, 월간은 보는 목적이 완전히 달랐습니다.
데일리 러닝
데일리는 빠르게 확인하는 화면입니다.
오늘 또는 어제 러닝이 어땠는지
몸에 무리가 갔는지
다음 러닝은 가볍게 가야 하는지
이 정도만 보면 됩니다.
그래서 데일리는 대시보드 중심입니다. 긴 글보다 카드와 숫자가 중요합니다.
주간 러닝
주간은 흐름을 봅니다.
이번 주에 몇 번 뛰었는지
주중에는 무리했는지
주말에 회복했는지
훈련 강도가 한쪽으로 쏠렸는지
다음 주는 어떻게 조절해야 하는지
실제로 19주차 분석에서는 주간 28km, 4회 세션을 기준으로 "과부하에서 회복으로 방향 전환"이라는 식으로 정리했습니다.
숫자만 보면 28km입니다. 하지만 흐름을 보면 월요일에는 무거웠고, 금요일에는 욕심을 냈고, 일요일 휴식으로 회복 쪽으로 돌아왔다는 이야기가 됩니다.
월간 러닝
월간은 한 달 전체를 회고합니다.
2026년 5월 월간 분석에서는 17회, 116.08km, 819분으로 집계됐습니다.
이 정도가 되면 단순히 "이번 달 116km 뛰었습니다"로 끝내면 아깝습니다.
그래서 월간은 이런 질문을 봅니다.
체력이 성장했는가?
훈련량은 충분했는가?
회복은 따라왔는가?
쉬운 러닝과 빡센 러닝의 비율은 적절했는가?
다음 달에는 무엇을 조절해야 하는가?
5월 분석에서는 "양으로는 합격이지만, 쉬운 러닝이 부족했다"는 결론이 나왔습니다.
이런 식으로 월간 분석은 단순 기록이 아니라 다음 달 훈련 방향까지 이어지게 만들었습니다.
자동화 흐름
전체 흐름은 이렇게 만들었습니다.
HealthFit에서 러닝 데이터 내보내기
→ FIT 파일 수집
→ 러닝 로그 정리
→ 훈련 부하 계산
→ 데일리 대시보드 생성
→ 주간/월간 대시보드 생성
→ AI 코치 분석 글 작성
→ 옵시디언과 블로그 초안에 저장
→ 필요하면 텔레그램으로 링크 받기
현재는 이렇게 운영하고 있습니다.
데일리 러닝:
매일 오전 10시 대시보드 생성
주간 러닝:
매주 일요일 저녁 주간 대시보드와 분석 생성
월간 러닝:
매월 1일 오전 월간 대시보드와 분석 생성
저는 이 구조가 좋았습니다.
매일 보는 것은 짧고 빠르게.
일주일과 한 달은 천천히 돌아보게.
운동 데이터도 결국 목적에 따라 보여주는 방식이 달라야 한다는 걸 느꼈습니다.
만들면서 좋았던 점
가장 좋았던 건 "내 데이터가 내 말투로 돌아온다"는 점이었습니다.
기존 앱에서는 제가 데이터를 보러 가야 했습니다.
그런데 이 시스템에서는 데이터가 제가 이해할 수 있는 문장으로 정리되어 돌아옵니다.
예전에는 러닝 기록을 보고도 그냥 지나쳤습니다.
5.4km
7분대 페이스
심박 몇
이렇게 보면 특별한 감정이 없습니다.
그런데 AI 코치가 이렇게 말해주면 조금 다릅니다.
이번 주는 새로 쌓기보다 안 깎이게 지킨 한 주였 습니다.
이 문장을 보면 제 운동이 하나의 이야기처럼 느껴집니다.
운동을 계속하게 만드는 데는 숫자보다 이야기가 더 중요할 때가 있습니다.
만들면서 배운 점
이번 작업을 하면서 느낀 건, AI 자동화가 꼭 업무에만 쓰일 필요는 없다는 점입니다.
많은 사람들이 AI 자동화를 이야기할 때 업무 생산성, 글쓰기, 코딩, 리서치를 먼저 떠올립니다.
물론 저도 그런 용도로 많이 씁니다.
하지만 진짜 재미있는 건 제 생활에 붙였을 때였습니다.
제가 매일 하는 행동이 있고,
그 행동에서 데이터가 나오고,
그 데이터를 제가 원하는 방식으로 다시 해석해주는 구조.
이건 단순한 대시보드보다 훨씬 오래 갑니다.
왜냐하면 남에게 보여주려고 만든 게 아니라, 제가 실제로 매일 쓰려고 만든 것이기 때문입니다.
아직 아쉬운 점
물론 아직 완벽하지는 않습니다.
가끔은 AI 코치가 말을 너무 멋있게 하려다 과장될 때가 있습니다. 예를 들어 단순히 조금 피곤한 날인데 너무 심각하게 말하면 오히려 부담스럽습니다.
그래서 최근에는 AI 코치 톤도 계속 다듬고 있습니다.
겁주지 말 것
숫자를 부풀리지 말 것
애매한 수치는 애매하다고 말할 것
다음 행동을 너무 거창하게 만들지 말 것
또 하나는 데이터 품질입니다.
운동 데이터는 생각보다 깨끗하지 않습니다. GPS가 튀거나, 심박이 이상하게 잡히거나, 기록이 중복될 때도 있습니다.
그래서 대시보드는 예쁘게 만드는 것보다 먼저 데이터가 믿을 만한지 확인해야 했습니다.
앞으로 해보고 싶은 것
앞으로는 이 시스템을 조금 더 "개인 러닝 코치"에 가깝게 만들고 싶습니다.
예를 들면 이런 것들입니다.
다음 러닝 추천
신발별 누적 거리 관리
부상 위험 신호 누적 추적
대회 전 2주 컨디션 조절
러닝 후 회고 자동 작성
다만 무조건 기능을 늘리고 싶지는 않습니다.
제가 실제로 매일 쓰는 기능만 남기고 싶습니다.
운동 앱을 하나 더 만들고 싶은 게 아니라, 제가 계속 달릴 수 있게 도와주는 작은 코치가 필요하기 때문입니다.
마무리
이번 러닝 대시보드 작업은 제게 꽤 의미가 있었습니다.
AI로 뭔가를 만든다고 하면 보통 거창한 서비스를 떠올리기 쉽습니다.
그런데 저는 이런 방향이 더 좋습니다.
내가 매일 하는 일
내가 실제로 불편한 일
내가 계속 보고 싶은 데이터
여기에 AI를 붙이면 결과물이 훨씬 살아납니다.
저에게 러닝 대시보드는 운동 기록 앱이 아니라, 제가 계속 달리게 만드는 개인 운영 시스템에 가깝습니다.
아이폰 건강 앱이 보여주지 못한 것을, 제가 원하는 말투와 기준으로 다시 만든 셈입니다.
그리고 이게 제가 AI를 쓰는 가장 좋아하는 방식입니다.
내가 필요한 것을, 내가 이해할 수 있는 방식으로, 내가 계속 쓰고 싶게 만든다.
이번에는 그 대상이 달리기였습니다.
다음에는 또 제 생활 어딘가에서 불편한 것을 하나 찾아서, 제 방식으로 바꿔볼 생각입니다.
<데일리 대시보드>
https://sia-ian.vercel.app/running/daily/current
<주간 대시보드>
https://sia-ian.vercel.app/running/weekly/current
<월간 대시보드>
https://sia-ian.vercel.app/running/monthly/current