실시간 AI 자세 분석 + 유니티 보스레이드 게이미피케이션 피트니스 서비스
[Browser] [Ubuntu Server] Vue.js 3 HTTPS / WSS Nginx (443) Webcam + Canvas ◄─────────────────► ├── Frontend (Static) └── FastAPI Backend │ [Unity Game] Redis Pub/Sub [Redis (Docker)] Boss Raid ◄─────────────────────► ├── Frame (SET) ← 최신 1개만 ├── Metrics (LIST) ← 세션 누적 [ESP32 Sensor] WebSocket └── PubSub (Channel) EMG Data ─────────────────────► │ [AI Runner] MediaPipe + PyTorch (Subprocess 관리)
프레임 수신
프론트엔드 웹캠 → WebSocket → Backend → Redis SET
AI 추론
AI Runner가 Redis에서 프레임 읽기 → MediaPipe → 모델 추론 → Redis RPUSH
결과 전송
Backend가 Redis 폴링 → WebSocket → 프론트엔드 (스켈레톤 + EMG + 정확도)
게임 연동
AI Runner → Redis PUBLISH → Unity가 직접 구독 → 보스 공격
30fps 영상 프레임을 Redis LIST에 RPUSH하자 100+ 프레임이 쌓여 3초 이상 지연 발생. 동시에 운동 메트릭은 세션 종료 시 평균 계산을 위해 누적 저장이 필요한 상충된 요구사항.
영상과 데이터를 분리하는 듀얼 트랙 아키텍처를 설계:
백엔드 재시작 시 이전 AI 프로세스가 종료되지 않고 좀비화. 카메라를 계속 점유하여 새 프로세스가 "Camera already in use" 에러 발생.
시작 전 고아 프로세스 탐지 및 강제 종료 로직을 크로스 플랫폼(Windows/Linux)으로 구현:
하나의 WebSocket 연결에서 프레임 폴링(30fps), 데이터 폴링(10Hz), Pub/Sub 리스닝, 클라이언트 메시지 수신을 동시에 처리해야 하는 복잡한 요구사항. 세션 ID 불일치 시 데이터가 10초간 끊기는 현상.
asyncio.create_task로 4개 독립 태스크를 동시 실행하고, 세션 ID 불일치 시 Redis 키를 직접 탐색하여 자동 복구:
0.0.0.0:6379 외부 접근).env 분리로 비밀 정보 보호wss://) 업그레이드 설정uvicorn.log)/tmp/fitboss_ai_logs/)ufw allow)WebSocket + Redis 듀얼 트랙으로 프레임(30fps)과 메트릭(10Hz)을 동시 처리. 프론트엔드 웹캠 프레임 수신 → AI 추론 결과 폴링 → 클라이언트 전송까지 전 파이프라인 구현.
Google OAuth 2.0 소셜 로그인과 Access/Refresh Token 기반 인가 시스템. FastAPI Dependency Injection으로 라우터별 인증 적용.
캘리브레이션 데이터 수집 → 백그라운드 학습 → 모델 자동 배포 → Redis Pub/Sub 핫 리로드까지 End-to-End MLOps 파이프라인 구축.
사용자 운동 이력 + 신체 정보를 분석하여 Google Gemini API로 맞춤형 루틴 추천. 규칙 기반 빠른 추천과 LLM 정밀 추천 듀얼 모드 제공.
게임 시작/종료 API, 보스 HP·데미지 계산, 스코어 산정, 클리어 판정. Redis Pub/Sub로 Unity에 실시간 공격 데미지 전달.
Top 100 + 본인 순위 조회. APScheduler로 매주 월요일 9시 자동 리셋. 스코어 + 클리어 횟수 복합 정렬.
ESP32 EMG 센서로부터 근전도·가속도 데이터를 WebSocket으로 수신하고, 연결된 모든 클라이언트에 실시간 브로드캐스트.
HTTP 미들웨어로 모든 예외를 캐치하여 Mattermost Webhook으로 팀 채널에 즉시 알림. 트레이스백 포함 상세 에러 리포트.
영상 프레임과 분석 메트릭을 동일한 Redis 자료구조로 처리하면 성능 병목이 생긴다는 것을 체감했습니다. SET(최신 1개)과 LIST(누적)로 분리하는 듀얼 트랙 설계를 통해, 실시간성과 데이터 완전성이라는 상충된 요구를 동시에 만족시킬 수 있었습니다.
MediaPipe, PyTorch 같은 무거운 AI 프레임워크는 웹 서버와 같은 프로세스에서 돌리면 이벤트 루프를 블로킹합니다. 서브프로세스로 분리하고 Redis를 IPC 채널로 사용하는 구조를 배웠으며, 고아 프로세스 관리의 중요성도 실전에서 깨달았습니다.
지수 백오프 재시도, 세션 ID 자동 복구, Connection Pool 튜닝 등 "정상 동작"이 아닌 "비정상 상황에서의 복구"를 설계하는 것이 프로덕션 서비스의 핵심이라는 것을 배웠습니다. Mattermost 알림을 통해 에러를 즉시 인지하고 대응하는 모니터링 체계도 갖추게 되었습니다.
GitLab push부터 Docker 빌드, Jenkins 자동 배포, Nginx HTTPS/WSS 프록시까지 전체 인프라를 직접 구성하면서, "코드를 작성하는 것"만큼 "코드를 안정적으로 배포하고 운영하는 것"이 중요하다는 것을 배웠습니다. 특히 WebSocket 프록시 설정과 SSL 인증서 관리는 실전에서만 배울 수 있는 경험이었습니다.