
올해 초에 제가 어떻게 ChatGPT를 사용하여 운동을 생각해 내는지에 관한 몇 가지 기사를 게시했습니다. 매일 Step Function 워크플로가 실행되어 ChatGPT에게 운동을 생성하도록 요청한 다음, 그것을 이메일로 보내 주었습니다. 이 프로젝트는 오픈 소스로 공개되었고 제 웹사이트에서 무료로 사용할 수 있도록 제공되었는데, 사람들이 그것을 사용할 것이라는 희망을 가지고 만들었습니다. 그러나 그렇게 되지 않았습니다.
해당 프로젝트는 내가 운동을 하는 방식과 너무 밀접하게 연결되어 있었습니다. 나의 선호도로 하드코딩되어 있었고, 내 집 체육관에서 이용할 수 있는 장비만 사용했습니다. 다른 사람이 사용하기에는 확장성이 거의 없었습니다.
7월에 개최된 Amplify 및 Hashnode 해커톤을 발견했을 때였어요. 나는 초기 구현에서 얻은 교훈을 바탕으로 다시 시작할 수 있는 완벽한 기회라고 생각했어요. 또한 AppSync에 대해 배우고, SAM의 새로운 GraphQL 리소스를 시도하고, 처음으로 Amazon Cognito를 사용해 볼 수 있는 기회이기도 했고, 제 실력이 부족한 UI를 연습할 수 있는 기회였어요.
참여할 수 있는 이유들이 너무 좋아서 놓치기 힘들었기 때문에, 나는 바로 착수하여 한 달도 안 되어서 합법적인 SaaS 제공 제품이 될 수 있는 제품을 만들었어요. 함께 살펴보죠.
운동 앱
운동하기는 이미 어렵지만, 매일 루틴을 정하는 것은 더 어렵죠. 많은 사람들은 일상으로 하는 체육관 트레이너를 고용하는 경우도 많은데, 그것도 좋은 방법이에요. 저는 대학 시절에 개인 트레이너였기 때문에 운동 프로그램을 직접 정하곤 해요.
하지만 저는 농장에서 살면서 두 아이를 키우고 전문적인 일을 하면서 Ready, Set, Cloud!에서 부가 수익을 창출하기 때문에 더 이상 교육 프로그램을 만들 시간이 없어요.
그래서 저는 대신 해 줄 Saas 오퍼링을 만들었어요. 언제 운동을 하고 싶은지, 선호하는 운동 유형, 보유한 운동 장비 등을 설정하고, 그저 편하게 앉아서 기다리기만 하면 돼요.
운동하는 날 전날에 다음 날의 일정을 알려주는 이메일을 받아요. 이메일이 별로라면 앱에 로그인해서 필요할 때 운동할 수 있어요. 간단하죠!
특징
Google 로그인 — 나는 긴 가입 프로세스를 거쳐야 하는 웹사이트를 좋아하지 않아요. 그래서 Google을 통해 인증을 받을 수 있도록 최우선순위로 두었어요. 가입할 때 G메일로 간편하게 로그인하여 2번의 클릭으로 시작할 수 있어요.
다중 테넌시 — 처음엔 단일 테넌시... 나였어요. 나를 위해 생성된 운동을 공유하는 공개 홈페이지를 가졌어요. 확장에 대해 언급하자면, 나 혼자로는 한계에 도달했어요. 그래서 프로젝트를 다중 테넌트로 업데이트하여 모든 사람이 자신의 설정을 구성할 수 있도록 했어요. 테넌시는 Cognito 사용자 sub를 테넌트 ID로 사용하여 개별 기준으로 처리되어요. 이제 로그인한 모든 사용자가 자신의 선호도를 설정하고 능력, 목표 및 이용 가능한 장비에 맞춰진 운동을 받을 수 있어요!
높은 설정 가능성 — 너무 많고 너무 적은 설정 가능성 사이의 균형이 중요해요. 이 운동 앱은 최상의 운동을 제공할 수 있도록 균형을 유지하고 (아마도 너무 많이 치우쳤을지도 모르겠어요) 다양한 설정을 제공해요. 피트니스 목표, 경험 수준, 좋아하는 운동 유형, 작업하고 싶은 근육 그룹, 사용 가능한 장비, 운동을 원하는 시간 및 운동을 받고 싶은 요일, 이메일로 운동을 받고 싶은 시간 등을 설정할 수 있어요.
AI-Powered 코칭 — 개인 설정을 사용하여 앱이 ChatGPT-4에 부탁하여 당신을 위한 맞춤형 운동을 작성하도록 해요. 당신을 위해 따로 제작된 고품질의 운동 계획을 받게 될거에요. 당신의 전체 주간 운동이 매주 일요일마다 작성되어 미리 훈련 계획을 보실 수 있어요.
SmartRandom* - 매 운동은 중복 운동을 방지하면서 무작위 기준으로 AI 코치에 전달됩니다. 예를 들어, 매주 3번 운동을 하고 하루는 팔, 둘째 날은 유산소, 셋째 날은 가슴을 운동한다면, 요일과 사용하는 장비는 무작위로 선택되지만 근육 그룹은 동일하게 유지됩니다. 즉, 한 주에 팔을 두 번 하고 가슴을 한 번만 운동하는 경우를 피합니다. 균형 잡힌 규칙을 위해 근육 그룹을 한 주 내내 균형 있게 분산했어요.
빌드
이 빌드를 세 가지 부분으로 구분해봤어요: 사용자 인터페이스, 운동 생성기, 그리고 알림 시스템.
사용자 인터페이스
사용자 인터페이스는 React용 AWS Amplify UI 구성 요소를 사용하여 생성된 Next.js 앱입니다. 이러한 컨트롤은 div, table, button과 같은 기본 요소를 감싸고 스타일을 추가합니다. 또한 이러한 구성 요소에 몇 가지 단축키 및 지시문을 추가하여 간단한 방식으로 동작을 제어하는 데 도움을 줍니다. 이러한 구성 요소들이 없었다면 짧은 시간 동안이 앱을 구축하기 어려웠을 것입니다! CSS 클래스를 건드리지 않고 Amplify의 기본 스타일이 적용된 구성 요소를 사용했습니다.
이 앱은 Amazon Cognito를 사용하여 Google을 통해 사용자 인증을 처리합니다. 전체 프로젝트 중에서 아마도 가장 어려웠던 부분이었습니다. Cognito 사용자 풀을 Google과 연결하려면 필요한 리소스를 설정하고 구성하는 것이 필요했습니다. Cognito 리소스를 사용자 인터페이스와 별도의 SAM 템플릿에 유지하여 백엔드 및 UI를 따로 개발할 수 있도록 했습니다.
필요한 리소스를 파악하고 만들어야 했고, 그런 다음에 Amplify가 연결하는 데 사용하는 구성 파일을 수동으로 만드는 방법을 결정해야 했습니다. 왜 Amplify CLI를 사용하지 않았느냐고 궁금해할 수도 있습니다. 자동으로 수행하기 때문에 CLI를 사용하지 않았습니다. 답은 좀 까다로운 것입니다.
너무 많은 단축키를 제공하여 너무 쉽게 파괴적인 작업을 수행할 수 있습니다. 이 앱이 결국 진정한 SaaS 오퍼링으로 나아가도록 하고 싶었기 때문에, 핵톤이 끝난 후 진척 상황을 되돌릴 필요가 없도록 고립된 리소스 스택으로 시작하기로 결정했습니다.
어쨌든, UI는 AppSync GraphQL API를 사용하며 이 API는 인증을 위해 Cognito를 사용합니다. 두 가지가 얼마나 쉽게 통합되는지에 매우 만족했습니다! 새로운 SAM 리소스를 활용하여 AppSync GraphQL API를 개발하는 데 얼마나 쉽게 만드는지 확인해 보았습니다. 전반적으로 꽤 감명받았습니다! 유일한 우려사항은 당신의 API가 많은 쿼리와 변형을 수행할 경우 조금 복잡해질 수 있다는 것입니다. 많은 작업을 위해 함수와 리졸버를 정의하면 YAML이 빠르게 쌓일 수 있습니다.
운동 생성기
내 글을 따라오는 사람들은 Step Functions의 큰 팬이라는 것을 알고 있습니다. 그래서 당연히 Workout 생성을 Step Function 워크플로우로 조율했습니다.
매주 일요일 오후 6시에 재발생하는 EventBridge 일정에 따라이 프로세스가 실행됩니다. 모든 등록된 사용자를로드 한 다음 각 사용자를 반복하여 구성된 운동 설정을 Lambda 함수에 전달하여 ChatGPT에 전달하는 프롬프트를 작성합니다.
그런 다음, ChatGPT에 프롬프트를 전달하고 Output 형식을 보장하기 위해 responseSchema 객체를 제공합니다. 운동이 생성되면 Workflow는 한 번용 EventBridge 일정을 생성하여 사용자에게 구성된 알림 시간에 운동 정보가 포함 된 이메일을 보냅니다.
알림 시스템
한 번성 EventBridge 일정을 만드는 것은 제 초기 디자인보다 큰 개선이었어요. 이전에는 매일 알림 상태 머신을 실행하여 미래를 위해 구축된 운동을 확인하고 하나를 찾으면 이메일을 보내는 방식이었어요. 그리 좋아하는 방법은 아니었죠 — 많은 전자 폐기물을 발생시키기 때문이었어요. 그 워크플로우는 필요하지 않을 때도 계속 실행되고 있었거든요. 더 나은 방법이 있을 것 같아요.
한 번성 일정을 통해 일정에서 실행되는 횟수를 제한할 수 있을 뿐만 아니라, 운동 기록을 위한 DynamoDB 키를 전달할 수 있게 되었어요. 이제 쿼리를 수행하고 데이터를 과다로 가져오지 않아도 되었어요. 원하는 단일 운동만 가져와 사용할 수 있게 되었죠.

보시다시피, 이 또한 Step Function 워크플로우입니다. 이것은 Lambda 대신 여러 AWS 서비스와의 직접 통합을 많이 활용하고 있어요.
이 워크플로에 대해 주목해야 할 두 가지 중요한 사항이 있습니다:
- 워크플로를 트리거한 일회성 일정을 삭제하는 것을 확인하고 있습니다. 이러한 일정은 실행 후 자동으로 삭제되지 않기 때문에 실행 중에 정리를 해서 더는 아무 작업도 수행하지 않는 자원이 할당되지 않도록 합니다.
- 이메일은 이벤트를 통해 전송됩니다. 저는 서버리스 도구상의 이벤트브릿지 규칙으로 트리거된 람다 함수를 사용하여 SendGrid를 통해 이메일을 보내게 되었습니다. 이를 통해 클라우드에서 할당한 자원의 양을 최소화하며 이 기능을 모든 프로젝트에서 재사용할 수 있습니다.
사용자가 이메일 알림을 꺼 둔 경우, 이 워크플로는 실행되지 않을 것입니다. 운동 알림 이메일은 사용자에게 운동 전날의 예상 사항을 알려주어 마음을 준비할 수 있도록 의도되어 있습니다.
SaaS에서 배운 교훈
이 프로젝트는 정말 좋았어요. 올해 초에 제가 생각한 것과 첫 번째 반복 작업을 거친 후 많은 것을 배웠어요. 그런데 한 번만 하면 반복이 아니에요. 저는 이 애플리케이션을 처음부터 완전히 새롭게 다시 만들었어요. 이전 반복에서 이번으로 코드 한 줄도 남지 않았습니다.
SaaS 스타트업이 도처에 등장하고 있어요. 무언가를 하고 싶다면 이미 그에 대한 SaaS 옵션이 이미 존재할 가능성이 매우 높아요. 사람들은 당신이 열심히 일을 하는 것에 대해 유료로 지불하고 있어요.
위에서 Michael Liendo가 말했듯이 소스 코드가 완전히 공개되어 사용 가능하더라도 사용자 인터페이스를 구축하고 작동시킬 수 있다면 수요가 있습니다. 이를 염두에 두고 있다면, SaaS 제품을 진지하게 고려하고 있다면 배워야 할 중요한 교훈들을 알려 드리겠습니다.
- 공개로 빌드하기 — 사람들의 관심을 끌어 마케팅을 미리 하세요. 고립되어 빌드하지 마시고 첫날부터 1,000명의 사용자를 기대하지 마세요. 일찍이나 자주 시장에 나가세요.
- 적절한 도구가 모든 것을 결정합니다 — 시장 진입 시간은 매우 중요해요. “자동으로 일해주는” 도구를 사용하면 성공 여부가 결정될 거에요. Amplify, Cognito, Step Functions과 같은 도구 및 서비스는 아이디어를 빠르게 증명하는 데 도움이 되는 10배 가속기에요.
- 완벽을 추구하지 마세요 — 소프트웨어는 절대 완성되지 않는다는 것을 기억하세요. 항상 추가할 새로운 기능이 있고 수정해야 할 버그나 바꿀 색상이 있어요. “완벽해야 한다”라는 생각으로 문을 넘어갈 때까지 기다리지 말아요. 이용자들로부터의 피드백을 받아 사용 가능할 때 빠르게 출시하고 계속해서 발전시키세요.
- 전문가일 필요는 없어요 — 제가 ChatGPT의 능력에 놀랐어요. 소프트웨어에서 완전히 새로운 가능성을 연구했어요. 적절한 프롬프트 엔지니어링을 연습한다면 SaaS는 구성 페이지를 구축하고 프롬프트를 작성하고 ChatGPT 응답을 반환하는 것만큼 간단할 수 있어요.
다음은 무엇일까요?
이 디자인을 계속해서 개선해 나갈 계획입니다. 다음 중요한 이정표는 이것을 독립된 도메인에 올리고 구독 모델 뒤에 두는 것입니다(SaaS이기 때문에요). 그러나 지금 당장은 fitness.readysetcloud.io에서 무료로 접속하고 사용할 수 있습니다. 또는 GitHub에서 소스 코드를 확인할 수도 있어요.
기대되는 기능들:
- 운동 그룹 — 혼자 운동하기 싫으신가요? 운동 그룹과 함께 같은 운동을 받아보세요!
- 운동 백과사전 — 특정 운동이 무엇인지 모르시거나 팔 운동 목록을 찾고 싶다면, 백과사전을 사용해보세요.
- 운동 카탈로그 — 생성된 모든 운동들은 피트니스 레벨, 운동 타입, 사용된 장비별로 구분하여 둘러볼 수 있는 카탈로그로 제공됩니다.
저는 앞으로 있을 일들과 이 프로젝트가 어떻게 발전할지 기대됩니다. 서버리스 백엔드를 통합하고 프론트엔드에는 관리되는 UI 구성 요소를 사용하는 것이 제게 전에 상상하기 힘든 속도로 발전할 수 있게 해 주었습니다. 그래서 여러분의 지원과 (희망적으로) 피드백에 감사드립니다!
좋은 코딩 되세요!