
안녕하세요.
오늘은 제가 바이브 코딩을 하면서 운동을 하기 위해 어떻게 할지 고민해본 내용을 작성해봅니다.
사실 대부분의 IT 직장인 분들이라면 사람마다 다르지만 제 주변 분들은 앉아 있는 시간이 서 있거나 누워 있는 시간이 훨씬 많은거 같아요.
저 역시 마찬가지 였고, 체중이 많이 늘어나서 운동이 필요했습니다.
특히 현재는 재택근무로 일을 하다보니 자연스럽게 계속 컴퓨터 앞에 앉아서 움직이지도 않고 일을 자주 하게 되는 거 같습니다.
그래서 큰 맘 먹고 헬스장 등록도 하고 PT도 등록했습니다.
그런데 PT가 비싸 보이기도 했고, 기왕 PT를 끊어 놓은거 좀 더 운동을 잘하고 싶다는 맘에 바이브 코딩에 손을 다시 얹게 되었습니다.
구성도
- Frontend : Next + S3 + Cloudfront
- Backend : Go + lambda + Api GW + DSQL


요새들어 DB를 DSQL을 정말 많이 붙이고 있습니다. jsonb가 안되고 인덱싱 관련된 여러가지 문제가 있지만 RDS보다 압도적으로 저렴하기 때문에 군말 없이 사용중에 있습니다.
만들려고 보니 글로벌로도 국내로도 AI 코칭 서비스는 정말 많았습니다.
그리고 제가 그렇게 만든다고 해서 정말 제가 계속 사용할까? 라는 생각했던거 같아요.
서비스는 내가 계속 사용하지 않으면 대부분 실패한다는 창업가분의 이야기를 어디선가 들었던거 같은데, 정말 맞는 거였습니다.
내가 쓰지 않으면 자연스럽게 업데이트도 안하고, 고객 피드백도 덜 듣게 되고, 사용자들도 점점 떨어져 나가고 그러다보면 자연스럽게 망하는 거죠.
그래서 타겟팅을 이렇게 잡았습니다.
- 계속 운동을 안 하다가 이제 시작하는 사람
- 의지는 있는데 하려고 하면 막상 못하겠는 사람
- 운동을 다시 시작하고 싶은데 운동 컨텐츠가 너무 많아서 뭘 보고 따라해야 할지 모르는 사람
이런 느낌으로 시작했습니다. 제가 딱 그렇거든요.
그냥 하루에 스쿼트 20개, 팔벌려 뛰기 20개라도 하라고 나에게 이야기 하고 싶었어요.
막상 운동 어떤 거 시작하지?
운동의 종류는 정말 많습니다.
제가 PT하다가 느낀 건 뒤에 배워야 할게 너무 많은데 기초를 너무 안 쌓고 와서 체력 훈련밖에 못한다는 문제였습니다.
그래서 체력 훈련을 먼저 시작하자였죠. 설령 나중에 PT를 받아야 하게 되더라도 체력 훈련을 하고 가면 더 많은 것을 배울 수 있다는 것이었습니다.
그래서 스쿼트, 푸시업, 점핑잭 (팔 벌려 뛰기) 이 세가지를 타겟팅 해보았습니다.
운동 데이터 수집은 어떻게?
처음엔 어떻게 하지 하다가 실시간 분석을 위한 백엔드도 구축해보고 여러가지를 다 했습니다. 당연히 분석이었기에 ML이 들어가는 무엇인가가 필요할 줄 알고 백엔드 만들고 분석기 달고 하다보니 이상했어요.
- 카메라 각도가 바뀌면 어떻게 하지?
- 옷을 너무 어둡거나 긴팔을 입고 있어서 포인트가 안잡혀서 각도가 안나오면 어떻게 하지?
- 운동 각도가 내가 생각한 거 보다 작아서 카운트가 안되면 어떻게 하지?
여러가지 생각을 다해봤던거 같아요.
그러다가 혹시 Codex에 이런 라이브러리가 있는지 알려달라고 했더니 movenet, mediapipe가 있더라구요. 그것으로 연결해서 한번 해봤더니 괜찮게 되었습니다.
백엔드로 거의 1~2일을 썻는데 허무하였지만, 어찌되었던 고민을 해봤던 것으로 의미는 있었다고 생각해요.
처음에는 movenet을 사용해보았는데 kaggle 데이터중 mediapipe와 적정한 데이터셋이 존재했습니다. 나중에 결국은 훈련 데이터화 해서 각도를 만들어야 할거 같은 느낌이 들긴 해서요.
해보니 아래와 같은 데이터 형태로 나오더군요.
[
{
"id": "41fdeb07021b87e6c941493346",
"session_id": "178826b6aed138098fd525f394",
"user_id": "ace571974ccf5206fe69faaf44",
"event_type": "session_completed",
"event_at": "2026-04-10T05:07:53.446474Z",
"payload_json": {
"rep_count": 20,
"total_sets": 1
}
},
{
"id": "170d40b5df63eeec52d2ca2a64",
"session_id": "178826b6aed138098fd525f394",
"user_id": "ace571974ccf5206fe69faaf44",
"event_type": "set_completed",
"event_at": "2026-04-10T05:07:53.238024Z",
"payload_json": {
"primary_metric_avg": 93.54,
"rep_count": 20,
"secondary_metric_avg": 2.304,
"set_id": "52e16c572d19f90a1e468864b2",
"set_number": 1
}
},
{
"id": "422ceabaef4be8108f82f0b27a",
"session_id": "178826b6aed138098fd525f394",
"user_id": "ace571974ccf5206fe69faaf44",
"event_type": "angle_samples_batch",
"event_at": "2026-04-10T05:07:52.974541Z",
"payload_json": {
"reason": "set_completed",
"samples": [
{
"captured_at": "2026-04-10T05:07:45.385Z",
"movement_state": "down",
"primary_metric": 21.3,
"secondary_metric": 0.869,
"side": "left"
},
{
"captured_at": "2026-04-10T05:07:45.403Z",
"movement_state": "down",
"primary_metric": 21.5,
"secondary_metric": 0.854,
"side": "left"
},
{
"captured_at": "2026-04-10T05:07:45.419Z",
"movement_state": "down",
"primary_metric": 21.4,
"secondary_metric": 0.845,
"side": "left"
},
,
...,
{
"captured_at": "2026-04-10T05:07:45.535Z",
"movement_state": "down",
"primary_metric": 20.8,
"secondary_metric": 0.933,
"side": "left"
},
{
"captured_at": "2026-04-10T05:07:45.553Z",
"movement_state": "down",
"primary_metric": 20.5,
"secondary_metric": 0.945,
"side": "left"
}
],
"set_id": "52e16c572d19f90a1e468864b2",
"set_number": 1
}
},
...
{
"id": "1b88d0b3bef143ffa0df8a44c9",
"session_id": "178826b6aed138098fd525f394",
"user_id": "ace571974ccf5206fe69faaf44",
"event_type": "angle_samples_batch",
"event_at": "2026-04-10T05:07:34.789221Z",
"payload_json": {
"reason": "batch",
"samples": [
{
"captured_at": "2026-04-10T05:07:35.637Z",
"movement_state": "down",
"primary_metric": 30,
"secondary_metric": 1.113,
"side": "left"
},
{
"captured_at": "2026-04-10T05:07:35.653Z",
"movement_state": "down",
"primary_metric": 34.7,
"secondary_metric": 1.123,
"side": "left"
},
...,
{
"captured_at": "2026-04-10T05:07:35.803Z",
"movement_state": "unknown",
"primary_metric": 74.4,
"secondary_metric": 2.197,
"side": "left"
},
{
"captured_at": "2026-04-10T05:07:35.818Z",
"movement_state": "unknown",
"primary_metric": 74.4,
"secondary_metric": 2.204,
"side": "left"
},
{
"captured_at": "2026-04-10T05:07:35.837Z",
"movement_state": "unknown",
"primary_metric": 80.2,
"secondary_metric": 2.354,
"side": "left"
},
{
"captured_at": "2026-04-10T05:07:35.852Z",
"movement_state": "unknown",
"primary_metric": 82.1,
"secondary_metric": 2.376,
"side": "left"
},
{
"captured_at": "2026-04-10T05:07:35.870Z",
"movement_state": "unknown",
"primary_metric": 83.6,
"secondary_metric": 2.459,
"side": "left"
}
],
"set_id": "52e16c572d19f90a1e468864b2",
"set_number": 1
}
}
]
이 데이터를 기반으로 한 분석과 여러가지를 해볼 수 있었습니다.
어차피 먼저 MVP형태로 최소 기능만 할거였으니까 굳이 많은 기능 구현할 필요 없이 간단 운동 분석만 Codex를 이용해서 빠르게 요청해서 만들었습니다.
Repository를 새로 만들어야 했지만, 과정을 정리하고 8시간 정도 본거 같긴 한데 사이트 하나는 적당히 나올 정도는 되었습니다.
anyPT
Start from one safe movement. anyPT helps beginners build basic strength and consistency at home.
anypt.drumgoon.net
위 사이트를 클릭하셔서 체험하기를 눌러보면 다음과 같은 UI가 뜰겁니다.






- 원하는 운동 선택
- 카메라 화면 이동
- 카메라 켜고 테스트 시작 (모바일의 경우 전/후면 카메라 설정 가능)
- 촬영 방향과 같도록 준비
- 운동시작
- 10번이 끝나면 분석 데이터 전달 (물론 아직은 전문적인 분석까진 아니고 각도 분석 정도입니다.)
이런 저런 기능을 추가하고 있는데 아마 좀 더 작업이 되면 재미있는게 나오리라 생각합니다. 일단은 제가 가장 필요한 방향으로 먼저 작업하면서 여러가지 피드백을 듣고 실험 또는 피드백을 해주고 싶은 분들을 찾고 있습니다.
궁금하시거나 레포 분석 및 같이 작업에 참여해보고 싶은 분들 (운동고수 선생님 대 환영)은 언제든지 카카오톡과 linkedin DM등을 통해 저에게 문의주시면 언제든지 이야기해보실 수 있습니다.
아래 사이트에 방문하셔서 해보세요. 영상이 나오지만 사용자의 데이터는 저장하지 않고 있어서 자유롭게 사용이 가능합니다.
anyPT
Start from one safe movement. anyPT helps beginners build basic strength and consistency at home.
anypt.drumgoon.net
'AWS' 카테고리의 다른 글
| AWS 무료 에뮬레이터 Floci를 사용해 보았습니다. (0) | 2026.03.25 |
|---|---|
| AWS Full Serverless로 공부 사이트 만들어보기 (with Codex 5.3) (0) | 2026.03.13 |
| 딸깍하면 완성되는 AWS Architecture Diagram with Kiro-CLI? (0) | 2025.11.25 |
| AWS Kiro 출시 기념 AI 인터뷰 (0) | 2025.11.18 |
| Amazon Q를 이용한 나만의 개발팀 만들기 (0) | 2025.08.28 |