Skip to content

Repository files navigation

🧗 Climingo : AI 기반 클라이밍 문제 분석 및 맞춤형 등반 영상 추천 서비스

삼성 청년 SW·AI 아카데미 14기


💡 프로젝트 소개

클라이밍 문제를 처음 마주했을 때, 같은 문제를 완등한 사람의 영상을 찾거나 자신의 신체 조건에 맞는 풀이를 참고하는 일은 쉽지 않습니다.
Climingo는 사용자의 신체 정보와 전신 이미지, 등반 기록, 문제 및 벽 이미지, 등반 영상을 AI로 분석하여 클라이밍 학습을 돕는 맞춤형 서비스입니다.

사용자는 클라이밍장 벽을 촬영해 유사한 벽과 문제를 검색하고, 자신의 체형과 유사한 사용자의 등반 영상을 추천받을 수 있습니다. 또한 영상 업로드, 일별·월별 기록 관리, 통계 조회, AI 채팅을 통해 등반 과정을 기록하고 지속적으로 성장할 수 있습니다.


📑 목차

  1. ✨ 주요 기능
  2. 🗓️ 개발 일정
  3. 🛠️ 기술 스택
  4. 📂 아키텍처 구조
  5. 🏗️ 프로젝트 구조
  6. 🔄 핵심 데이터 처리 흐름

✨ 주요 기능

Climingo신체·벽·문제·등반 영상 데이터를 연결하여 사용자에게 맞춤형 클라이밍 학습 경험을 제공하는 AI 기반 플랫폼입니다.

🧍 신체 정보 분석 및 체형 임베딩

주요 역할

사용자의 키, 몸무게, 리치와 전신 이미지를 분석하여 개인별 신체 특성을 벡터로 표현합니다.

핵심 기능

  • 📷 전신 이미지 업로드

    • S3 Presigned URL을 발급하여 클라이언트가 스토리지에 직접 업로드
    • 업로드 완료 후 AI 서버에 분석 요청
  • 🧠 NLF 기반 신체 비율 분석

    • 전신 이미지에서 신체 비율과 체형 특징 추출
    • 분석 결과를 사용자 신체 임베딩으로 저장
  • 🎯 맞춤형 추천 데이터 활용

    • 키, 몸무게, 리치 및 체형 임베딩을 유사 영상 추천에 활용
    • 단순 난이도 비교를 넘어 사용자 신체 조건을 반영

🧱 벽 이미지 검색 및 문제 탐색

주요 역할

사용자가 촬영한 클라이밍 벽 이미지를 분석하여 등록된 벽 가운데 유사한 벽을 찾고, 해당 벽의 문제를 탐색할 수 있도록 지원합니다.

핵심 기능

  • 📸 벽 이미지 검색

    • 검색용 이미지를 S3에 직접 업로드
    • AI 서버에서 이미지 특징 벡터 생성
  • 🔍 유사 벽 탐색

    • 저장된 벽 임베딩과 검색 이미지 임베딩 비교
    • pgvector 기반 유사도 검색으로 후보 벽 반환
  • 🧩 문제별 상세 조회

    • 선택한 벽에 등록된 클라이밍 문제 목록 제공
    • 문제 이미지와 유사 등반 영상 조회로 연결

🎥 등반 영상 업로드 및 유사 영상 추천

주요 역할

사용자의 등반 영상을 기록으로 저장하고, 선택한 문제와 신체 조건을 바탕으로 참고할 만한 유사 영상을 제공합니다.

핵심 기능

  • ☁️ 대용량 영상 직접 업로드

    • Backend가 Presigned URL을 발급하고 Frontend가 S3로 직접 업로드
    • 서버를 거치지 않아 업로드 부하와 네트워크 비용 감소
  • 🤖 영상 분석 파이프라인 연동

    • 업로드 완료 이벤트를 기준으로 AI 서버에 분석 작업 요청
    • 문제 및 사용자 등반 영상 분석 결과를 공용 DB에 반영
  • 🎯 유사 등반 영상 추천

    • 문제 정보와 사용자 신체 특성을 기반으로 유사 영상 제공
    • 문제 상세 화면에서 다른 사용자의 풀이 영상 탐색
  • 분석 결과 승인·거절

    • AI 분석 결과를 사용자가 확인한 뒤 승인하거나 거절
    • 잘못 분류된 기록은 삭제 가능

📔 등반 기록 및 성장 통계

주요 역할

클라이밍 활동을 날짜별로 기록하고 월간·일간 기록과 통계를 확인할 수 있습니다.

핵심 기능

  • 📅 월간 기록 조회

    • 달력 형태로 월별 등반 활동과 기록 보유 날짜 확인
  • 📝 일간 기록 조회

    • 특정 날짜에 업로드한 등반 영상과 문제별 결과 확인
  • 📊 사용자 통계

    • 등반 횟수, 완등 기록 등 사용자 활동 통계 제공
    • 반복 집계 비용을 줄이기 위한 집계 중심 조회 구조 적용
  • 🔔 분석 완료 알림

    • Firebase Cloud Messaging 기반 디바이스 토큰 등록
    • 영상 또는 AI 분석 작업 완료 시 푸시 알림 제공

💬 AI 클라이밍 채팅

주요 역할

사용자의 신체 정보와 등반 데이터를 바탕으로 클라이밍 관련 질문에 실시간으로 답변합니다.

핵심 기능

  • 🤖 Spring AI 기반 대화 처리

    • OpenAI 모델과 Spring AI 연동
    • 사용자 정보와 서비스 데이터를 활용한 답변 생성
  • 📡 SSE 스트리밍 응답

    • 답변 생성 결과를 한 번에 기다리지 않고 토큰 단위로 전달
    • 긴 응답에서도 사용자가 즉시 결과를 확인할 수 있도록 구성
  • 🧠 pgvector 기반 벡터 저장소

    • 임베딩 데이터 저장 및 검색에 PostgreSQL pgvector 활용

🛠️ 관리자 기능

  • 클라이밍장 등록 및 관리
  • 클라이밍장별 벽 조회
  • 벽 이미지 Presigned URL 업로드 및 임베딩 생성
  • 문제 이미지 등록
  • 문제별 AI 기준 영상 등록·삭제
  • 등록된 문제 및 영상 데이터 관리

🗓️ 개발 일정

개발 기간 : 2026.04.20 ~ 2026.05.20 (5주)

  • 1주차: 아이디어 구체화, 요구사항 분석 및 기술 스택 선정
  • 2주차: ERD·API·시스템 아키텍처 설계 및 UI/UX 구성
  • 3주차: 인증, 사용자, 클라이밍장, 벽·문제, 파일 업로드 기능 구현
  • 4주차: 신체·벽·영상 AI 분석 파이프라인 및 추천 기능 연동
  • 5주차: 기록·통계·알림·AI 채팅 구현, 성능 개선 및 배포 안정화
  • 최종일: 통합 테스트 및 최종 프로젝트 발표

🛠️ 기술 스택

🌕 Frontend

Next.js React TypeScript TailwindCSS
TanStack Query Jotai Axios Recharts Storybook

🔙 Backend

Java Spring Boot Spring Data JPA QueryDSL
Spring Security OAuth2 JWT Spring Batch
Spring AI OpenAI Firebase Swagger

🤖 AI & Computer Vision

Python FastAPI PyTorch Transformers
Ultralytics OpenCV ONNX Runtime scikit-learn

☁️ Infra & DevOps

Nginx Jenkins Docker Docker Compose
AWS EC2 S3 CloudFront

🗄️ Database & Storage

PostgreSQL pgvector Redis AWS S3

🛠️ Tools

Git GitLab Jira Notion Mattermost


📂 아키텍처 구조

🏗️ System Architecture Flow

System Architecture

  • 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 - Next.js 웹 애플리케이션

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 - Spring Boot API 서버

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 - FastAPI 이미지·영상 분석 서버

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/
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

🔄 핵심 데이터 처리 흐름

1. 신체 이미지 분석

Frontend
  → Backend에서 신체 이미지 Presigned URL 발급
  → Frontend가 S3에 이미지 직접 업로드
  → Backend에 업로드 완료 요청
  → FastAPI가 S3 이미지 다운로드
  → NLF 서버가 신체 비율 분석
  → 사용자 body embedding을 PostgreSQL에 저장

2. 벽 이미지 검색

Frontend
  → 검색 이미지 Presigned URL 발급
  → S3 직접 업로드
  → FastAPI가 검색 이미지 임베딩 생성
  → pgvector에 저장된 벽 임베딩과 유사도 비교
  → 유사 벽 후보 반환
  → Frontend에서 벽별 문제 조회

3. 등반 영상 분석

Frontend
  → 영상 Presigned URL 발급
  → S3 직접 업로드
  → Backend에 업로드 완료 요청
  → FastAPI 영상 분석 및 문제 분류
  → Backend 결과 콜백
  → 사용자 승인·거절
  → 로그북과 통계에 반영
  → FCM 분석 완료 알림

4. AI 채팅

Frontend
  → Backend AI 채팅 API 호출
  → 사용자 프로필·등반 데이터 조회
  → Spring AI / OpenAI 요청
  → SSE 스트림으로 답변 전달

🧗 Climingo - 신체·벽·문제·등반 영상을 연결하여 개인화된 클라이밍 학습을 제공하는 AI 기반 서비스

About

AI 기반 클라이밍 루트 파인딩 및 유사 영상 탐색 플랫폼

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages