WELCOME TO THE PROJECT STORE
Hola Climbing
클라이밍 영상을 AI로 분석해, 기록과 피드·암장 탐색으로 이어지는 서비스
- ROLE
- Spring Boot 백엔드 + Python AI worker pipeline 단독 담당
- IMPACT
- GCS 직접 업로드, Redis Streams/SSE, snapshot cursor로 업로드·분석·추천 흐름 분리
- PROOF
- cursor aggregate p95 9.794ms, Spring/AI E2E smoke, raw/presentation evidence
IN THE STORE
프로젝트 안내
WHY THIS STORE EXISTSGCS v4 Signed URL기반 영상 바이너리 업로드 분리Redis Streams + Pub/Sub + SSE기반 AI 분석 요청·진행률·결과 저장 분리- Spring Boot 서버와 Python AI 워커 간 callback 계약 정리, E2E smoke 검증
- snapshot cursor cache + public thumbnail URL 전환, cursor page p95 약 9.8ms 증거 확보
IN THE STORE
내가 맡은 일
OWNERSHIP- 회원·인증·OAuth·JWT·약관·프로필 API
- 영상 메타데이터, GCS Signed URL, 댓글, 좋아요 API
- 암장 검색, 난이도, 리뷰, 즐겨찾기, 운영상태 API
- Redis Streams 기반 AI 분석 dispatch와 SSE 진행률
- AI worker callback 결과 저장, 분석 피드백, 재시도
- WebSocket STOMP 암장별 채팅과 GPS 암장 인증
- pgvector + 팔로잉 boost 기반 추천 피드와 snapshot cursor
- Flyway, Testcontainers, Swagger/ErrorCode 문서화
- Spring REST/STOMP API 계약 다수, AI worker health/readiness 계약 코드 기준 정리
- PostgreSQL·Redis·GCS·AI worker 연결 분석 E2E 흐름 검증
- 추천 피드 성능 evidence: raw 결과 + presentation 이미지 분리, 포트폴리오용 근거 확보
IN THE STORE
기술과 선택
TECH & DECISIONS백엔드
AI
데이터
인프라
테스트
GCS Signed URL 직접 업로드
Redis Streams 기반 AI dispatch
MyBatis over JPA
IN THE STORE
문제를 푼 방식
PROBLEM SOLVING추천 피드 tail latency와 signed URL 병목
Redis snapshot으로 ranking SQL 재계산 회피.AI worker callback 계약 정합
IN THE STORE
AI·데이터 파이프라인
FROM INPUT TO RESULTMediaPipe Pose keypoint sequencetechniques, isDynamic, dynamicProbability, segment start/end/confidence- GCS object 다운로드
- OpenCV frame sampling
- MediaPipe Pose 33 keypoint 추출
- segment 분리
- optical flow 기반 영상 단위 dynamic/static feature 추출
- 촬영 각도, 루트, 동작 속도 편차가 큰 클라이밍 영상
- 정적 자세에서도 발생하는 keypoint jitter, coordination false positive 가능성
- 동작 라벨: 하이스텝, 플래깅, 훅, 락오프, 다이노, 코디네이션 중심
- coordination one-hit false positive 감소: active frame ratio + same-frame 동시 이동 조건
- flagging/hook 오탐 조정: rule_v3
- flow RF 역할 제한: dynamic/static 영상 단위 prior, 약한 dynamic segment 보정만
IN THE STORE
검증 자료
EVIDENCE, NOT DECORATION
Backend/AI Architecture
GCS direct upload, Cloud Run Spring backend, Redis Streams, AI worker, PostgreSQL/pgvector, 외부 OAuth/SMTP/FCM 흐름
Minjoon 담당: Spring backend, Redis dispatch, AI worker pipeline

ERD
회원, 영상, 암장, 분석, 추천, 기록, 채팅 도메인 관계

Recommendation Performance Summary
추천 피드 성능 테스트 요약: 100k videos / 10k users seed 기준 p95, SQL 실행 시간, 오류율
p95 123ms, SQL 81ms, error_rate 0% 측정 근거

Cursor Cache Comparison
Redis snapshot cursor cache 적용 후 2·3페이지 cursor 호출 p95 분리 측정
2페이지 9ms, 3페이지 10ms, cursor 전체 10ms

App Screen Overview
마이페이지, 주변 암장 탐색, 월간 기록 화면 최종 UI
영상 분석 결과를 기록·암장 탐색·월간 회고 흐름으로 연결

AI Pose Analysis
MediaPipe 33 keypoints 기반 클라이밍 자세 추출 화면

Technique Classification
프레임별 기술명과 dynamic/static 성향 분류 결과

Monthly Report
월간 클라이밍 리포트: 성향 비율, 기술 빈도, 코칭 팁

Gym Detail
암장 상세: 관련 영상, 운영 시간, 실시간 채팅 진입

Gym Exploration
내 주변 암장 탐색과 맞춤 추천 화면
추천 피드 HTTP p95
251.233ms → 122.642mslocal-baseline 대비 current 측정. 같은 조건 반복 측정 결과로만 최종 문구 확정.추천 피드 SQL execution
181.086ms → 80.966mstemp blocks written 9,138 -> 0.cursor aggregate p95
9.794msRedis snapshot cursor cache 적용 후 2~3페이지 호출 기준.AI worker model version
rule_v3+flow_rf_v2flow gate on일 때 top-level dynamicProbability와 isDynamic을 callback.IN THE STORE
회고
WHAT I LEARNED배운 점
- 런타임이 다른 백엔드/AI worker: 메시지 큐와 결과 callback 분리 필요
- 대용량 바이너리: 애플리케이션 서버 우회 설계로 운영 부담 감소
- 포트폴리오용 성능 주장: raw evidence + 사람이 읽는 presentation evidence 동시 보관
아쉬운 점
- Kafka vs Redis Streams 사전 실측 비교 부족
- 데이터 누적 이후 확정 가능한 pgvector 인덱스 전략
- 단일 노드 가정 밖의 멀티 노드 STOMP/SSE fan-out 과제
다음 개선
- 동일 조건 3회 이상 반복 측정, 최종 성능 수치 고정
- post-MVP AI 모델 재평가: fine-tuning 또는 재촬영 UX
- 발표용 아키텍처 도식의 담당 영역 명확화
협업
프론트 담당자와 API 명세, OAuth callback, 영상 업로드 완료 후 메타데이터 등록, 분석 상태 vocabulary 정합
IN THE STORE