혼자 수영을 연습하면서 "내 영법 자세가 맞나?", "접영 팔 각도가 제대로 들어가고 있나?" 항상 답답함이 있었습니다. 수영 커뮤니티를 보니 본인의 수영 영상을 직접 촬영해서 그걸 보고 교정하는 게 가장 좋은 방법이라는 피드백이 많더군요.
하지만 문득 "전문적인 피드백이나 명확한 판단 기준이 없는 상황에서 내 영상을 혼자 쳐다보는 게 과연 무슨 의미가 있을까?"라는 의문이 들었습니다. 기준이 없으면 잘못된 자세를 봐도 알아채지 못하니까요.
그 순간 '수영에 관한 전문지식 교본을 세밀한 프롬프트로 가공하고, API에 먹여서 AI가 내 영상을 보고 기준에 맞춰 코칭을 해준다면 어떨까?' 하는 아이디어가 스치고 지나갔습니다.
이 직관을 검증하기 위해 지난주 목요일 구상을 시작해 금요일부터 본격적인 프롬프트 튜닝에 몰입했습니다. 그리고 이번 주, 서비스 배포와 오픈소스 공개 시 터질 수 있는 백엔드 시스템 보안 장치(보안 하네스)까지 모두 완료하여 깃허브에 MIT 라이선스로 소스 코드를 완전히 공개하게 되었습니다.
진행 방법
어떤 도구를 사용했고, 어떻게 활용하셨나요?
최대한 가볍고 빠르게 작동하는 MVP를 만들기 위해 아래와 같이 경량화된 IT 인프라와 AI 비전 기술 스택을 결합했습니다.
Frontend: React + TypeScript + Vite + Tailwind CSS (swim-web 내 경량 뼈대 구조)
Backend: Flask / FastAPI 기반 Python 경량 분석 서버 (server.py)
AI 비전 엔지니어링:google-genai (Google Gemini 비전 API) + report_render.py (다이내믹 HTML 코칭 리포트 자동 생성)
전체적인 흐름은 유저가 자신의 수영 영상을 웹에 업로드하면, 백엔드(server.py)가 최신 제미나이 비전 API를 호출하여 영상 속 멀티프레임을 분석합니다. 프롬프트에 주입 된 전문 기준에 따라 사용자의 스트로크 롤링, 팔 꺾기 각도, 킥 타이밍을 영리하게 추론한 뒤, report_render.py를 거쳐 사용자에게 고유한 시각화 HTML 웹 리포트 링크를 생성해 주는 구조입니다.
📷 랜딩페이지
한국어로 된 웹사이트의 홈페이지
💻 활용한 백엔드 핵심 코드 전문 (server.py 개요 및 API 구조)
지피터스 회원님들을 위해 깃허브에 올린 백엔드 연동 부 소스 코드 중, 비전 API 호출과 보안 격리 부를 일부 공유합니다.
Python
# server.py 전문 (Gemini 비전 API 연동 및 보안 가드부)
import os
from flask import Flask, request, jsonify
from google import genai
from google.genai import types
from dotenv import load_model
load_dotenv()
app = Flask(__name__)
# [보안 하네스] API KEY 및 민감한 핵심 수영 코칭 프롬프트의 환경변수 격리 구조
GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
SWIMMING_COACH_PROMPT = os.getenv("SWIMMING_CRITERIA_PROMPT")
# google-genai 최신 SDK 초기화
client = genai.Client(api_key=GEMINI_API_KEY)
@app.route("/api/analysis", methods=["POST"])
def analyze_swimming():
# [Anti-Abuse] 파일 유효성 및 용량 이중 검증
if 'video' not in request.files:
return jsonify({"error": "영상이 첨부되지 않았습니다."}), 400
video_file = request.files['video']
# 임시 저장 후 제미나이 비전 API 멀티프레임 추론 엔진 가동
# (실제 소스에서는 데이터 유출 차단을 위해 Pre-signed URL 및 세션 검증 가드가 작동합니다.)
try:
response = client.models.generate_content(
model='gemini-2.5-flash', # 혹은 비전 최적화 모델
contents=[
video_file.read(),
SWIMMING_COACH_PROMPT # 격리된 수영 기준 프롬프트 주입
]
)
return jsonify({"analysis": response.text})
except Exception as e:
return jsonify({"error": str(e)}), 500
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
결과와 배운 점
과정 중에 어떤 시행착오를 겪었나요?
초기에는 마케팅적인 매력과 빠른 연동을 위해 단순 3초짜리 숏폼 비디오 기반의 판별 시스템을 구상했었습니다. 하지만 수영이라는 운동 특성상 물속에서의 스트로크 주기, 물 잡기 각도, 호흡 및 킥 타이밍을 연속적으로 관찰해야만 유의미한 피드백이 가능하다는 기술적 한계와 데이터 일관성 장벽을 정면으로 마주했습니다. 3초 데이터로는 명확한 기준에 맞춘 정합성 있는 피드백이 나오지 않았습니다.
이에 겉치레용 마케팅 문구를 과감히 버리고, 사용자가 최소 1개 사이클 이상의 영법 흐름이 담긴 전체 영상을 올리도록 강제하는 방식으로 피봇팅했습니다. 제미나이 비전 API가 이를 멀티프레임으로 정밀하게 쪼개어 읽어 들이도록 프롬프트 가이드와 백엔드 수집 단을 전면 수정했습니다. 역시 인공지능 기반의 SaaS 서비스는 겉치레 문구보다 실제 데이터 도메인의 특성과 데이터 정합성을 정직하게 반영해야만 제대로 작동한다는 것을 뼈저리게 배웠습니다.
배운 점과 나만의 꿀팁을 알려주세요.
1인 기업가의 보안 하네스: 오픈소스로 코드를 전면 공개하여 바이럴 유통 엔진을 만들 때, 내 비즈니스의 생명줄인 '독점적 AI 프롬프트(수영 전문 지식)'와 'API Key'를 백엔드 환경 변수(.env) 단으로 완전히 밀어내어 소스 파일에서 도려내는 격리 구조가 필수적이라는 점을 체득했습니다.
선방어 후출시 (Anti-Abuse 가드): 커뮤니티 바이럴 트래픽은 서비스 성장의 거대한 기회이지만 원가 고갈의 위험도 공존합니다. 백엔드 단에서 가입 즉시 무료 크레딧을 잠그고 초과 요청을 차단하는 가드를 먼저 단단히 세워두면, 비용 폭탄 두려움 없이 기분 좋게 제품을 세상에 던질(Ship) 수 있습니다.
도움이 필요한 부분이 있나요? (지피터스 오디언스 피드백 유도)
현재 제미나이 비전 API를 중심으로 백엔드가 굴러가고 있는데, 실전 필드 테스트를 앞두고 두 가지 기술적 장벽에 대해 지피터스의 AI 전문가분들의 고견을 구하고 싶습니다.
비전 LLM 추론 일관성 문제: 긴 영상 분석 시 프레임 샘플링 과정에서 영법 판별 일관성이 간혹 튀는 현상이 있습니다. 영상 데이터의 전처리 방식이나 프롬프트 체이닝 구조를 어떻게 세팅하면 제미나이 비전의 정확도와 피드백 일관성을 최대로 끌어올릴 수 있을까요?
개인정보 자동 마스킹: 수영장이라는 공간 특성상 레인 안의 타인 얼굴이나 신체를 브라우저(클라이언트) 단에서 오픈소스로 가볍게 블러/모자이크 처리할 수 있는 경량 라이브러리 조합이 있다면 추천 부탁드립니다.
앞으로의 계획이 있다면 들려주세요.
현재 디스콰이엇(Disquiet)의 프로덕트 런칭 승인을 대기하고 있습니다. 승인이 완료되는 대로 본격적인 글로벌 및 국내 베타 테스트를 개시할 예정이며, 지피터스 분들의 소중한 피드백을 바탕으로 제미나이 프롬프트의 추론 일관성을 고도화하여 실제 수영 동호인들과 일선 강사님들이 현장에서 유용하게 쓸 수 있는 SaaS로 진화시킬 계획입니다.
💻 깃허브 전체 소스 코드:https://github.com/casareborgia/Swim.git(코드가 흥미로우셨거나 1인 메이커의 무모한 도전을 응원해 주신다면 깃허브에 방문하셔서 ⭐ Star 하나 꾹 눌러주시면 다음 기능을 만드는 데 거대한 에너지가 됩니다!)
도움 받은 글 (옵션)
Connect AI 채널의 "AI 1인 기업 해부" 시리즈: 마크 루의 완벽보다 출시를 우선하는 'Just Ship It' 정신, 사힐 라빙가의 '미니멀 오픈소스 경영학', 토니 딘의 추론 비용 리스크를 통제하는 '유닛 이코노믹스 원가 설계 이론'을 적극 차용하여 MVP의 하방 리스크와 시스템 방어벽을 설계하는 데 큰 영감을 받았습니다.