표지


운동 기록 대시보드 만드는법, 나이키 런클럽 데이터를 자동으로 시각화하기

매일 러닝하고 나이키 런클럽(NRC) 앱에서 기록을 확인한다. 거리, 페이스, 심박수. 그런데 지난달 기록은? 지난주와 이번 주 비교는? 앱 안에서 한눈에 보기가 어렵다.


그래서 직접 운동 대시보드를 만들었다. NRC 스크린샷을 찍기만 하면, OCR이 숫자를 읽고, 자동으로 차트까지 그려주는 시스템이다. 4월 16일 기준으로 실제 돌아가고 있는 구조를 그대로 풀어본다.


운동 대시보드, 왜 직접 만들어야 했나

섹션1


나이키 런클럽은 훌륭한 러닝 앱이다. GPS 정확도도 괜찮고 러닝 중 음성 피드백도 좋다. 문제는 데이터가 앱 안에 갇혀 있다는 점이다. 주간 총 거리, 월간 평균 페이스, 심박수 추이 같은 걸 한 화면에서 보고 싶은데 앱에서는 불가능하다.


엑셀에 손으로 옮기면 되지 않냐고? 해봤다. 3일 만에 귀찮아서 그만뒀다. 러닝 끝나고 샤워하고 나면 기록 따위 입력하고 싶지 않다. "오늘 거리 몇이었지?" 앱 열고, 숫자 확인하고, 엑셀 열고, 셀에 입력하고. 이 과정이 5분도 안 걸리지만, 매일 반복하면 결국 안 하게 된다. 자동화하지 않으면 운동 기록은 절대 쌓이지 않는다.


하프 마라톤(6월 7일)과 풀 마라톤(11월 1일) 두 개 대회를 앞두고 있다. 훈련량을 숫자로 추적하지 않으면 감으로만 뛰게 된다. "이번 주에 충분히 뛰었나?"라는 질문에 감은 항상 "괜찮은 것 같은데"라고 답한다. 그 감이 틀리면 대회 당일에 알게 된다. 그래서 "스크린샷 한 장 찍으면 끝"인 구조를 목표로 잡았다.


전체 구조: 스크린샷에서 대시보드까지

섹션2


운동 대시보드의 전체 흐름은 4단계다. 각 단계가 무슨 일을 하는지 쉽게 풀어보겠다.

단계 도구 역할
1. 스크린샷 수집 macOS 사진첩 (osxphotos) NRC 스크린샷 자동 탐지
2. 숫자 추출 macOS Vision OCR (ocrmac) 거리·시간·페이스·심박수 인식
3. 데이터 구조화 Claude Sonnet API OCR 결과를 JSON으로 정리
4. 시각화 HTML + Chart.js 대시보드 자동 생성

1번은 사진첩을 뒤져서 NRC 스크린샷만 골라내는 역할이다. 2번은 그 스크린샷 이미지에서 "10.25km", "1:08:12" 같은 숫자를 텍스트로 읽어낸다. OCR이라고 하면 어렵게 느낄 수 있는데, 쉽게 말해 "사진 속 글자를 컴퓨터가 읽는 기술"이다. 3번은 읽어낸 텍스트를 정돈한다. "10.25"가 거리인지 시간인지 구분해서 깔끔하게 정리하는 과정이다. 4번은 정리된 데이터를 그래프와 차트로 보여준다.


매일 밤 22시에 macOS launchd(맥에 내장된 자동 실행 기능)가 이 파이프라인을 자동 실행한다. 러닝 끝나고 스크린샷만 찍어두면 된다. 나머지는 맥이 알아서 처리한다. 아침에 일어나서 대시보드를 열면 어젯밤 러닝 데이터가 이미 반영되어 있다.


스크린샷 자동 수집, osxphotos가 핵심이다

섹션3


첫 번째 관문은 "어떤 사진이 NRC 스크린샷인지" 가려내는 일이다. osxphotos라는 파이썬 라이브러리가 macOS 사진첩에 직접 접근해서 스크린샷만 골라낸다.


동작 방식은 이렇다. NRC 앱에서 러닝이 끝나면 결과 화면이 뜬다. 거리, 시간, 페이스가 크게 표시된 그 화면을 스크린샷으로 찍는다. 그러면 아이폰 사진첩에 저장되고, iCloud를 통해 맥 사진첩에도 동기화된다. osxphotos가 날짜별로 스크린샷을 필터링하고, 운동 기록이 담긴 이미지만 추려서 다음 단계로 넘긴다.


손으로 파일을 옮기거나 폴더에 정리할 필요가 없다. 그냥 찍으면 된다. 러닝 끝나고 결과 화면 뜰 때 전원 버튼 + 볼륨 버튼, 이게 전부다.


스크린샷을 찍을 때 팁이 있다. NRC 앱에서 러닝 완료 후 뜨는 결과 화면을 통째로 캡처하는 게 좋다. 거리, 시간, 페이스, 심박수, 칼로리가 한 화면에 다 나오기 때문이다. 여기서 한 단계 더 나가고 싶다면, 구간 페이스가 보이는 화면도 따로 캡처해 두자. 1km마다 페이스가 어떻게 변했는지까지 데이터에 쌓이면 훈련 분석이 훨씬 풍부해진다.


OCR로 숫자 읽기: ocrmac + Claude API 조합

섹션4


스크린샷에서 숫자를 뽑아내는 게 가장 까다로운 부분이었다. NRC 화면에는 거리, 시간, 평균 페이스, 심박수, 소모 칼로리가 한 화면에 들어 있다. 이걸 사람이 보면 한눈에 구분하지만 컴퓨터한테는 그냥 픽셀 덩어리다.


macOS에 내장된 Vision 프레임워크를 파이썬에서 쓸 수 있게 해주는 ocrmac을 썼다. Vision 프레임워크란 애플이 만든 이미지 인식 엔진인데, ocrmac은 이걸 터미널에서 간편하게 쓸 수 있게 포장한 도구다. 한국어와 숫자가 섞인 NRC 화면도 꽤 정확하게 읽는다. 설치는 pip install ocrmac 한 줄이면 끝이다.


OCR 결과는 텍스트 덩어리로 나온다. "10.25 km 1:08:12 평균 페이스 6'39" 이런 식으로 뒤섞여서 나온다. 여기서 "10.25km"가 거리인지, "6'39"/km"가 페이스인지 구분하려면 한 번 더 처리가 필요하다. Claude Sonnet API에 OCR 텍스트를 넘기면 각 숫자가 무엇을 뜻하는지 파악해서 깔끔한 JSON(데이터를 정리하는 표준 형식)으로 돌려준다.


실제 4월 16일 데이터 예시:

{
  "date": "2026-04-16",
  "distance_km": 10.25,
  "duration": "1:08:12",
  "pace": "6:39/km",
  "heart_rate": 162,
  "calories": 684
}

10.25km를 1시간 8분 12초에 뛰었고, km당 평균 6분 39초 페이스다. 심박수는 평균 162bpm, 소모 칼로리 684kcal. 이 데이터가 자동으로 추출되어 저장된다.


별도 서버 없이 맥 한 대에서 전부 돌아간다. 클라우드 서비스 비용도 없다. API 호출 비용은 스크린샷 하나당 몇 원 수준이라 무시할 만하다. 한 달에 커피 한 잔 값도 안 든다.


운동 대시보드 시각화: Chart.js로 한눈에

섹션5


수집된 데이터는 HTML 대시보드로 만든다. Chart.js(웹에서 차트를 그려주는 무료 라이브러리)를 써서 주간·월간 통계, 구간별 페이스 차트, 심박수 추이를 그린다.


대시보드 상단에는 마라톤 카운트다운을 넣었다. 6월 7일 하프 마라톤까지 D-52, 11월 1일 풀 마라톤까지 D-199. 이 숫자가 매일 줄어드는 걸 보면 훈련 동기가 확실히 다르다. "아직 많이 남았네" 하다가 D-30이 되면 긴장감이 확 온다.


주간 누적 거리 그래프를 보면 이번 주에 얼마나 뛰었는지 바로 확인된다. 예를 들어 이번 주 월~수에 10km, 5km, 8km를 뛰었으면 누적 23km가 막대그래프로 올라가 있다. 지난주 같은 요일까지의 누적과 비교하면 "이번 주가 더 뛰었구나" 또는 "좀 부족하구나"가 바로 보인다.


월간 평균 페이스 추이도 함께 보여주니까 체력이 올라가고 있는지 내려가고 있는지 숫자로 체감할 수 있다. 3월 평균 페이스가 7'05"/km였는데 4월 들어서 6'42"/km로 떨어졌다면 확실히 빨라지고 있다는 뜻이다.


4월 16일 데이터를 예로 들면, 10.25km를 1시간 8분 12초에 뛰었으면 km당 6분 39초 페이스다. 심박수 평균 162bpm, 소모 칼로리 684kcal. 이런 숫자가 매일 쌓이면서 선 그래프와 막대그래프가 그려진다.


대시보드를 열면 "지난주보다 총 거리가 늘었나, 페이스가 빨라졌나"가 3초 만에 보인다. 앱에서 일일이 날짜별로 넘겨가며 확인하던 때와는 차원이 다르다. 한 번 이 맛을 알면 다시 앱으로 돌아갈 수 없다.


실제 결과물: 4월 한 달간 쌓인 데이터

섹션6


실제로 이 시스템을 4월 1일부터 돌리면서 쌓인 데이터를 보면 대시보드의 가치가 확 와닿는다.


4월 첫째 주 총 주행거리는 28.3km였다. 둘째 주에는 35.7km로 늘었다. 셋째 주는 16일까지 이미 23km를 넘겼다. 이 숫자가 막대그래프로 나란히 서 있으면 주간 훈련량 추이가 한눈에 들어온다.


페이스 변화도 재미있다. 4월 1일에 km당 7분 12초로 시작했던 평균 페이스가, 16일에는 6분 39초까지 내려왔다. 선 그래프가 오른쪽 아래로 꾸준히 내려가고 있으면 "체력이 올라가고 있다"는 걸 눈으로 확인할 수 있다. 반대로 갑자기 페이스가 올라간 날이 있으면 "그날 컨디션이 안 좋았구나" 또는 "코스가 오르막이었구나" 하고 되짚어볼 수 있다.


심박수 추이도 중요한 지표다. 같은 페이스로 뛰는데 심박수가 낮아지고 있다면, 심폐 능력이 좋아지고 있다는 신호다. 대시보드에서 페이스 그래프와 심박수 그래프를 나란히 놓고 보면, 숫자가 말해주는 변화를 직접 느낄 수 있다. 칼로리 소모량도 일별로 쌓이니까, 한 달간 러닝으로 태운 총 칼로리를 합산해 볼 수도 있다. 4월 1일부터 16일까지 누적 소모 칼로리가 8,000kcal을 넘었다면, "밥 한 끼를 더 먹어도 되겠다"는 합리적 판단도 가능해진다.


자동 실행 세팅: 매일 밤 22시, 알아서 돌아간다

섹션7


macOS에는 launchd라는 작업 스케줄러가 내장되어 있다. 윈도우의 "작업 스케줄러", 리눅스의 cron과 같은 역할이다. 정해진 시간에 프로그램을 자동으로 실행시켜 준다.


매일 22시에 파이프라인이 자동 실행되도록 설정했다. 저녁에 러닝을 마치고 스크린샷을 찍어두면, 잠들기 전에 대시보드가 갱신되어 있다. 아침에 눈 뜨고 확인해도 된다.


설정 방법은 이렇다. XML 형식의 plist 파일을 하나 만들어서 ~/Library/LaunchAgents/ 폴더에 넣으면 된다. 파일 안에 적는 건 딱 두 가지: "어떤 스크립트를 실행할 것인지"와 "몇 시에 실행할 것인지." 처음 보면 XML 태그가 복잡해 보이지만, 실제로 수정할 부분은 스크립트 경로와 시간(Hour, Minute) 두 줄뿐이다.


한 번 세팅하면 건드릴 일이 없다. 맥을 켜두기만 하면 매일 자동으로 돌아간다. 슬립 모드에서도 설정 시간이 되면 깨어나서 실행한다.


사실 자동 실행이 이 시스템의 생명이다. 아무리 훌륭한 대시보드를 만들어 놔도 "스크립트 실행" 버튼을 손으로 눌러야 한다면 결국 안 누르게 된다. 러닝 자체도 힘든데 기록까지 신경 쓸 여유가 없다. 스크린샷만 찍어두면 매일 밤 알아서 돌아가는 게 핵심이다. 자동화의 가치는 "1분을 아끼는 것"이 아니라 "그 1분을 매일 반복해야 한다는 심리적 부담을 없애는 것"에 있다.


코딩 모르는 사람도 가능한가?

섹션8


솔직히 말하면, 현재 구조 그대로 따라하려면 파이썬 기초 지식이 필요하다. osxphotos 설치, API 키 세팅, launchd 설정까지 터미널 작업이 있다. 터미널을 한 번도 열어본 적 없다면 진입 장벽이 있다.


다만 핵심 아이디어 자체는 단순하다. "스크린샷 → OCR → 구조화 → 차트." 이 흐름만 이해하면 도구는 바꿔도 된다. 코딩 없이 비슷한 걸 만드는 방법도 있다.


구글 스프레드시트 방식: 구글 시트에 날짜, 거리, 시간, 페이스 열을 만들고 Apps Script(구글 시트에 내장된 자동화 기능)로 차트를 자동 생성하게 설정할 수 있다. OCR 부분은 구글 렌즈나 네이버 클로바 OCR 같은 무료 도구로 대체 가능하다. 완전 자동은 아니지만 "스크린샷 찍고 → OCR 앱에 넣고 → 나온 숫자를 시트에 복사" 정도면 엑셀에 직접 입력하는 것보다는 훨씬 빠르다.


노코드 도구 방식: Zapier나 Make 같은 노코드 자동화 도구를 쓰면 "특정 폴더에 사진이 추가되면 → OCR 처리 → 스프레드시트에 기록" 과정을 코딩 없이 만들 수 있다. 다만 무료 요금제에서는 횟수 제한이 있다.


중요한 건 자동화의 수준이 아니라 자동화의 존재 여부다. 완벽하게 자동이 아니더라도, 손가락이 움직이는 횟수를 줄이는 만큼 기록이 오래 살아남는다. 손으로 입력하는 순간 3일 안에 포기한다.


운동 대시보드를 만든 뒤로 달라진 점이 하나 있다. 뛰기 전에 "오늘은 어제보다 30초 빨리 가보자"라는 구체적 목표가 생긴다. 막연히 "열심히 뛰자"가 아니라 숫자가 주는 피드백이다. 6분 39초를 보고 나서 "다음엔 6분 30초 안에 들어와 보자"고 생각하게 된다. 그게 대시보드를 만드는 진짜 이유다.


자주 묻는 질문

Q. 운동 기록 대시보드는 어떤 도구로 만들 수 있나?
맥 사용자라면 osxphotos + ocrmac + Chart.js 조합이 가장 가볍다. 윈도우에서는 Tesseract OCR(무료 오픈소스 문자 인식 엔진)로 대체 가능하다. 스프레드시트를 선호하면 구글 시트 + Apps Script로도 비슷한 결과를 낼 수 있다.


Q. 나이키 런클럽 기록을 자동으로 대시보드에 옮길 수 있나?
NRC는 공식 API를 제공하지 않는다. 그래서 스크린샷 OCR 방식을 쓴다. 러닝이 끝나면 결과 화면에서 스크린샷 한 장 찍는 것, 그게 전부다. 나머지는 자동이니까 체감상 "자동으로 옮기는 것"과 다르지 않다.


Q. 운동 앱 스크린샷에서 숫자를 자동 추출할 수 있나?
macOS Vision OCR(ocrmac)은 한국어와 숫자가 섞인 화면도 인식한다. 4월 16일 실제 테스트에서 거리(10.25km), 시간(1:08:12), 페이스(6'39"/km), 심박수(162), 칼로리(684kcal)를 정확히 읽어냈다. 간혹 숫자가 잘려서 인식되는 경우가 있는데, Claude API가 문맥을 보고 보정해 주기 때문에 최종 데이터 정확도는 높다.


Q. 나이키 런클럽 말고 다른 앱도 가능한가?
가능하다. 가민 커넥트, 스트라바, 애플 피트니스 등 결과 화면을 스크린샷으로 찍을 수 있는 앱이면 뭐든 된다. OCR이 숫자를 읽고 Claude API가 의미를 파악하는 구조라서, 앱 화면 레이아웃이 바뀌어도 대부분 적응한다.


Q. 대시보드 데이터가 잘못 입력되면 어떻게 수정하나?
JSON 파일을 직접 열어서 해당 날짜의 숫자를 고치면 된다. 대시보드를 다시 생성하면 수정된 데이터가 즉시 반영된다. OCR 인식률이 높아서 수정할 일은 거의 없지만, 만약을 위해 원본 스크린샷은 사진첩에 그대로 남아 있으니 언제든 다시 처리할 수 있다.


#운동대시보드 #운동기록자동화 #나이키런클럽 #러닝기록 #운동기록대시보드 #NRC분석 #운동데이터시각화 #러닝대시보드 #OCR자동화 #운동기록시각화 #애플워치운동 #스크린샷OCR #노코드자동화 #운동루틴관리 #러닝데이터분석