클라이밍 문제를 처음 마주했을 때, 같은 문제를 완등한 사람의 영상을 찾거나 자신의 신체 조건에 맞는 풀이를 참고하는 일은 쉽지 않습니다.
Climingo는 사용자의 신체 정보와 전신 이미지, 등반 기록, 문제 및 벽 이미지, 등반 영상을 AI로 분석하여 클라이밍 학습을 돕는 맞춤형 서비스입니다.
사용자는 클라이밍장 벽을 촬영해 유사한 벽과 문제를 검색하고, 자신의 체형과 유사한 사용자의 등반 영상을 추천받을 수 있습니다. 또한 영상 업로드, 일별·월별 기록 관리, 통계 조회, AI 채팅을 통해 등반 과정을 기록하고 지속적으로 성장할 수 있습니다.
Climingo는 신체·벽·문제·등반 영상 데이터를 연결하여 사용자에게 맞춤형 클라이밍 학습 경험을 제공하는 AI 기반 플랫폼입니다.
사용자의 키, 몸무게, 리치와 전신 이미지를 분석하여 개인별 신체 특성을 벡터로 표현합니다.
-
📷 전신 이미지 업로드
- S3 Presigned URL을 발급하여 클라이언트가 스토리지에 직접 업로드
- 업로드 완료 후 AI 서버에 분석 요청
-
🧠 NLF 기반 신체 비율 분석
- 전신 이미지에서 신체 비율과 체형 특징 추출
- 분석 결과를 사용자 신체 임베딩으로 저장
-
🎯 맞춤형 추천 데이터 활용
- 키, 몸무게, 리치 및 체형 임베딩을 유사 영상 추천에 활용
- 단순 난이도 비교를 넘어 사용자 신체 조건을 반영
사용자가 촬영한 클라이밍 벽 이미지를 분석하여 등록된 벽 가운데 유사한 벽을 찾고, 해당 벽의 문제를 탐색할 수 있도록 지원합니다.
-
📸 벽 이미지 검색
- 검색용 이미지를 S3에 직접 업로드
- AI 서버에서 이미지 특징 벡터 생성
-
🔍 유사 벽 탐색
- 저장된 벽 임베딩과 검색 이미지 임베딩 비교
- pgvector 기반 유사도 검색으로 후보 벽 반환
-
🧩 문제별 상세 조회
- 선택한 벽에 등록된 클라이밍 문제 목록 제공
- 문제 이미지와 유사 등반 영상 조회로 연결
사용자의 등반 영상을 기록으로 저장하고, 선택한 문제와 신체 조건을 바탕으로 참고할 만한 유사 영상을 제공합니다.
-
☁️ 대용량 영상 직접 업로드
- Backend가 Presigned URL을 발급하고 Frontend가 S3로 직접 업로드
- 서버를 거치지 않아 업로드 부하와 네트워크 비용 감소
-
🤖 영상 분석 파이프라인 연동
- 업로드 완료 이벤트를 기준으로 AI 서버에 분석 작업 요청
- 문제 및 사용자 등반 영상 분석 결과를 공용 DB에 반영
-
🎯 유사 등반 영상 추천
- 문제 정보와 사용자 신체 특성을 기반으로 유사 영상 제공
- 문제 상세 화면에서 다른 사용자의 풀이 영상 탐색
-
✅ 분석 결과 승인·거절
- AI 분석 결과를 사용자가 확인한 뒤 승인하거나 거절
- 잘못 분류된 기록은 삭제 가능
클라이밍 활동을 날짜별로 기록하고 월간·일간 기록과 통계를 확인할 수 있습니다.
-
📅 월간 기록 조회
- 달력 형태로 월별 등반 활동과 기록 보유 날짜 확인
-
📝 일간 기록 조회
- 특정 날짜에 업로드한 등반 영상과 문제별 결과 확인
-
📊 사용자 통계
- 등반 횟수, 완등 기록 등 사용자 활동 통계 제공
- 반복 집계 비용을 줄이기 위한 집계 중심 조회 구조 적용
-
🔔 분석 완료 알림
- Firebase Cloud Messaging 기반 디바이스 토큰 등록
- 영상 또는 AI 분석 작업 완료 시 푸시 알림 제공
사용자의 신체 정보와 등반 데이터를 바탕으로 클라이밍 관련 질문에 실시간으로 답변합니다.
-
🤖 Spring AI 기반 대화 처리
- OpenAI 모델과 Spring AI 연동
- 사용자 정보와 서비스 데이터를 활용한 답변 생성
-
📡 SSE 스트리밍 응답
- 답변 생성 결과를 한 번에 기다리지 않고 토큰 단위로 전달
- 긴 응답에서도 사용자가 즉시 결과를 확인할 수 있도록 구성
-
🧠 pgvector 기반 벡터 저장소
- 임베딩 데이터 저장 및 검색에 PostgreSQL pgvector 활용
- 클라이밍장 등록 및 관리
- 클라이밍장별 벽 조회
- 벽 이미지 Presigned URL 업로드 및 임베딩 생성
- 문제 이미지 등록
- 문제별 AI 기준 영상 등록·삭제
- 등록된 문제 및 영상 데이터 관리
- 1주차: 아이디어 구체화, 요구사항 분석 및 기술 스택 선정
- 2주차: ERD·API·시스템 아키텍처 설계 및 UI/UX 구성
- 3주차: 인증, 사용자, 클라이밍장, 벽·문제, 파일 업로드 기능 구현
- 4주차: 신체·벽·영상 AI 분석 파이프라인 및 추천 기능 연동
- 5주차: 기록·통계·알림·AI 채팅 구현, 성능 개선 및 배포 안정화
- 최종일: 통합 테스트 및 최종 프로젝트 발표
- Client: Next.js 16 기반 모바일 중심 웹 애플리케이션
- Traffic Routing: 사용자 요청을 Nginx가 Frontend, Backend, AI 서비스로 분기
- Authentication: Spring Security, OAuth2, JWT 기반 인증·인가
- File Upload: Backend가 Presigned URL을 발급하고 Client가 AWS S3에 직접 업로드
- AI Pipeline: FastAPI가 S3 객체를 읽어 신체·벽·문제·등반 영상을 분석
- Vector Search: PostgreSQL과 pgvector를 활용하여 이미지 및 사용자 임베딩 저장·검색
- Realtime Response: AI 채팅 결과는 SSE 스트리밍 방식으로 전달
- Notification: Firebase Cloud Messaging을 이용해 분석 완료 알림 전송
- Data Management: PostgreSQL은 핵심 도메인과 벡터 데이터, Redis는 인증 및 임시 데이터 관리에 활용
- DevOps: GitLab → Jenkins CI/CD → Docker Hub → EC2 Docker Compose 배포
- Static Delivery: S3와 CloudFront를 활용하여 이미지·영상 콘텐츠 제공
User
└─ Nginx
├─ Next.js Frontend
├─ Spring Boot Backend
│ ├─ PostgreSQL / pgvector
│ ├─ Redis
│ ├─ AWS S3 / CloudFront
│ ├─ Firebase Cloud Messaging
│ └─ OpenAI
└─ FastAPI AI Server
├─ S3 Media Object
├─ NLF Body Analysis Server
├─ Computer Vision Pipeline
└─ PostgreSQL / pgvector
frontend/
frontend/
├── public/ # 로고, PWA 아이콘, FCM Service Worker
├── src/
│ ├── app/ # Next.js App Router
│ │ ├── (tabs)/ # 하단 탭 기반 사용자 페이지
│ │ │ ├── logbook/ # 월간·일간 등반 기록
│ │ │ ├── profile/ # 사용자 프로필과 통계
│ │ │ └── route-finding/ # 벽 검색, 문제 선택, 유사 영상
│ │ ├── admin/ # 클라이밍장·벽·문제 관리자 페이지
│ │ ├── logbook/new/ # 신규 등반 영상 업로드
│ │ ├── route-finding/3d-viewer/# 문제 분석 뷰어
│ │ ├── start/ # 서비스 시작·로그인
│ │ ├── survey/ # 사용자 신체·클라이밍 설문
│ │ ├── layout.tsx # 전역 레이아웃
│ │ └── manifest.ts # PWA Manifest
│ │
│ ├── widgets/ # 페이지를 구성하는 독립 UI 블록
│ │ ├── home/
│ │ ├── logbook/
│ │ ├── profile/
│ │ ├── route-finding/
│ │ ├── survey/
│ │ ├── admin-centers/
│ │ └── admin-walls/
│ │
│ ├── features/ # 사용자 행동 단위 기능
│ │ ├── auth/ # 인증 처리
│ │ ├── body-image-upload/ # 신체 이미지 업로드
│ │ ├── route-image-upload/ # 벽 검색 이미지 업로드
│ │ ├── logbook-video-upload/ # 등반 영상 업로드
│ │ ├── logbook-record-actions/# 분석 결과 승인·거절·삭제
│ │ ├── profile-edit/ # 사용자 정보 수정
│ │ ├── push-notification/ # FCM 디바이스 등록
│ │ ├── user-ai-chat/ # AI 채팅 UI
│ │ └── admin-*-management/ # 관리자 기능
│ │
│ ├── entities/ # 도메인 모델, API, 타입
│ │ ├── user/
│ │ ├── problem/
│ │ ├── logbook/
│ │ ├── climbing-center/
│ │ ├── admin-center/
│ │ └── admin-wall/
│ │
│ ├── shared/ # 공통 API, 설정, 라이브러리, UI
│ │ ├── api/ # Axios, QueryClient, Backend Contract
│ │ ├── config/ # Firebase 설정
│ │ ├── lib/ # 공통 유틸리티
│ │ └── ui/ # 공통 디자인 시스템 컴포넌트
│ │
│ └── proxy.ts # 서버 요청 프록시 설정
│
├── .storybook/ # Storybook 설정
├── docs/ # FSD·협업·UI/UX 컨벤션
├── Dockerfile
├── compose-prod.yml
├── next.config.ts
├── package.json
└── tsconfig.json
backend/climingo/
backend/climingo/
├── src/
│ ├── main/
│ │ ├── java/co/kr/climingo/
│ │ │ ├── auth/ # OAuth2, JWT, 재발급, 로그아웃
│ │ │ │ ├── controller/
│ │ │ │ ├── dto/
│ │ │ │ ├── handler/
│ │ │ │ ├── jwt/
│ │ │ │ ├── service/
│ │ │ │ └── util/
│ │ │ │
│ │ │ ├── common/ # 공통 설정·응답·예외·QueryDSL
│ │ │ │ ├── config/
│ │ │ │ ├── entity/
│ │ │ │ ├── exception/
│ │ │ │ ├── handler/
│ │ │ │ ├── querydsl/
│ │ │ │ ├── response/
│ │ │ │ └── util/
│ │ │ │
│ │ │ ├── domain/
│ │ │ │ ├── ai/ # AI 서버 클라이언트·결과 수신·채팅
│ │ │ │ ├── climbing/
│ │ │ │ │ ├── center/ # 클라이밍장·벽·벽 이미지
│ │ │ │ │ ├── history/ # 사용자 등반 기록·일간·월간 조회
│ │ │ │ │ ├── problem/ # 문제·유사 영상·AI 기준 영상
│ │ │ │ │ ├── problemtype/ # 문제 유형
│ │ │ │ │ └── video/ # 등반 영상 업로드
│ │ │ │ ├── notification/ # FCM 알림
│ │ │ │ └── user/ # 온보딩·프로필·통계·디바이스
│ │ │ │
│ │ │ ├── s3/ # S3 설정·Presigned URL 유틸
│ │ │ └── ClimingoApplication.java
│ │ │
│ │ └── resources/ # 환경 설정과 정적 리소스
│ │
│ └── test/ # 단위·통합 테스트
│
├── build.gradle # Java 21, Spring Boot 3.5 의존성
├── init.sql # PostgreSQL 초기화 스크립트
├── Dockerfile
├── compose.yml # 로컬 실행
├── compose-ci.yml # CI 환경
├── compose-prod.yml # 운영 환경
├── compose-test.yml # 테스트 환경
└── settings.gradle
ai/climingo-ai/
ai/climingo-ai/
├── app/
│ ├── api/
│ │ └── routes/ # Health, User, Wall, Problem, UserProblem API
│ ├── core/ # 환경 설정, 예외, AI 런타임 관리
│ ├── infrastructure/ # PostgreSQL, S3, 벽 임베딩 저장소
│ ├── pipeline/
│ │ ├── hands.py # 손 위치·움직임 분석
│ │ ├── holds.py # 홀드 검출 및 처리
│ │ ├── orchestrator.py # 분석 파이프라인 조합
│ │ └── utils.py
│ ├── repositories/ # 문제·사용자 문제 DB 접근
│ ├── schemas/ # Pydantic 요청·응답 스키마
│ ├── services/
│ │ ├── body_embedding_service.py # 신체 임베딩 생성
│ │ ├── wall_embedding_service.py # 벽 임베딩 생성
│ │ ├── wall_sift_match.py # 벽 이미지 특징 매칭
│ │ ├── problem_embedding_service.py
│ │ ├── video_classification_service.py
│ │ ├── image_embedding_provider.py
│ │ ├── nlf_remote_client.py # 원격 NLF 추론 서버 연동
│ │ ├── storage_service.py # S3 미디어 접근
│ │ └── result_notify.py # Backend 결과 콜백
│ └── main.py # FastAPI 엔트리포인트
│
├── nlf_server/ # NLF 전신 분석 추론 서버
│ ├── server.py
│ ├── colab_launcher.py
│ ├── colab_launcher.ipynb
│ └── Dockerfile
├── tests/ # AI 서비스 테스트
├── docs/ # 신체·벽 임베딩 및 배포 문서
├── compose.yml # 로컬 전체 실행
├── compose-nlf.yml # NLF 서버 실행
├── compose-prod.yml # 운영 이미지 실행
├── compose-prod.build.yml # 운영 설정 로컬 빌드
├── Dockerfile
├── requirements.txt
└── pytest.ini
infra/
infra/
├── cicd/
│ ├── Jenkinsfile-frontend-ci # Frontend 정적 검사·빌드
│ ├── Jenkinsfile-frontend-cd # Frontend 이미지 배포
│ ├── Jenkinsfile-backend-ci # Backend 테스트·빌드
│ ├── Jenkinsfile-backend-cd # Backend 이미지 배포
│ ├── Jenkinsfile-ai-ci # AI 정적 검사·테스트
│ ├── Jenkinsfile-ai-cd # AI 이미지 배포
│ ├── docker-compose.yml # Jenkins·Nginx 실행
│ └── nginx.conf # Jenkins Reverse Proxy
│
├── docker-compose.db.yml # PostgreSQL / 공용 네트워크
├── docker-compose.infra.yml # 운영 인프라 서비스
└── nginx.conf # 서비스 Reverse Proxy 및 SSL
Frontend
→ Backend에서 신체 이미지 Presigned URL 발급
→ Frontend가 S3에 이미지 직접 업로드
→ Backend에 업로드 완료 요청
→ FastAPI가 S3 이미지 다운로드
→ NLF 서버가 신체 비율 분석
→ 사용자 body embedding을 PostgreSQL에 저장
Frontend
→ 검색 이미지 Presigned URL 발급
→ S3 직접 업로드
→ FastAPI가 검색 이미지 임베딩 생성
→ pgvector에 저장된 벽 임베딩과 유사도 비교
→ 유사 벽 후보 반환
→ Frontend에서 벽별 문제 조회
Frontend
→ 영상 Presigned URL 발급
→ S3 직접 업로드
→ Backend에 업로드 완료 요청
→ FastAPI 영상 분석 및 문제 분류
→ Backend 결과 콜백
→ 사용자 승인·거절
→ 로그북과 통계에 반영
→ FCM 분석 완료 알림
Frontend
→ Backend AI 채팅 API 호출
→ 사용자 프로필·등반 데이터 조회
→ Spring AI / OpenAI 요청
→ SSE 스트림으로 답변 전달
🧗 Climingo - 신체·벽·문제·등반 영상을 연결하여 개인화된 클라이밍 학습을 제공하는 AI 기반 서비스
