FitFinder는 국민체육진흥공단(KSPO)의 공공 체육·생활 스포츠 데이터를 기반으로, 사용자의 성별, 연령, 위치, 관심 종목, 운동 가능 시간대를 반영해 가장 적합한 운동 프로그램을 추천해 주는 맞춤형 서비스입니다.
사용자는 복잡하게 검색할 필요 없이, 자신의 생활 패턴에 맞는 근처 운동 프로그램과 시설을 쉽게 확인할 수 있습니다. 더 나아가 FitFinder는 개인 조건과 주변 환경을 함께 고려해 일주일 운동 루틴까지 자동으로 구성해 주어, 운동 계획 세우는 부담을 덜어줍니다.
FitFinder는 공공 데이터를 활용해 누구나 자연스럽게 운동을 시작하고 꾸준히 유지할 수 있는 환경을 만드는 것을 목표로 합니다.
| 항목 | 버전/설정 |
|---|---|
| Framework | Spring Boot 3.5.8 |
| JDK | Temurin 21 |
| AI | Spring AI 1.1.0 |
| Build Tool | Gradle 9.2.1 |
| Database | PostgreSQL 15 |
| 기타 | Docker 24+, Docker Compose, GitHub Actions |
local: 로컬 개발용,.env와application-secret.yml을 통해 DB/OpenAI 키 주입prod: Docker Compose 및 EC2 배포에서 사용,.env와 Secrets로 환경 분리
- Spring Web + Validation: REST API, DTO 검증
- Spring Data JPA + Querydsl 5: 동적 조건 검색(
ProgramRepositoryImpl)과 Slice + 커서 기반 무한 스크롤 페이징 - Spring AI 1.1:
ChatClient로 OpenAI Chat Completions 호출, Prompt 활용한 JSON 응답 파싱 - Swagger(springdoc-openapi 2.8.6): 서비스 로직의 오염을 없애기 위한 Swagger 전용 인터페이스를 만들어 API 명세 자동화
- Global Exception Handling:
GlobalExceptionHandler를 통한CustomException커스텀 예외 및ApiResponse공통 응답 - Docker & Docker Compose:
spots-app,postgres,nginx,certbot스택 운영 - CI/CD: GitHub Actions
CI.yml빌드 & 도커 푸시,CD.ymlEC2 자동 배포 - Infra Scripts:
scripts/deploy.sh로 SSL 발급/갱신 + 서비스 롤링
spots/
├── build.gradle / settings.gradle
├── docker-compose.yml # app + db + nginx + certbot
├── Dockerfile / Dockerfile.local
├── scripts/deploy.sh
├── nginx/
│ ├── nginx-prod.conf # 운영 reverse proxy
│ └── nginx-cert-setup.conf # Certbot 임시 설정
├── src/
│ └── main/
│ ├── java/com/spots/
│ │ ├── SpotsApplication.java
│ │ ├── domain/
│ │ │ ├── program/ # controller/service/repository/entity/dto
│ │ │ ├── facility/
│ │ │ ├── transport/
│ │ │ ├── ai/
│ │ │ └── category/
│ │ ├── global/ # config, exception, swagger
│ │ └── swagger/
│ └── resources/
│ ├── application*.yml
│ └── prompt/routine.prompt
└── .github/workflows/CI.yml, CD.yml
- 프로그램 조건 검색 API (
ProgramController#searchPrograms)- 입력: 성별, 연령, 좌표, 선호 종목, 요일, 시간, 페이지 파라미터.
- Querydsl에서 거리 필터(Haversine)·카테고리·요일·시간 필터를 모두 조합해 Slice 응답을 반환합니다.
- 프로그램 상세 조회 (
ProgramService#getProgram)- Program + Facility + Transit 데이터를 집계해 이름, 대상, 요일, 가격, 예약 URL, 시설 주소, 대중교통 TOP2를 제공합니다.
- 시설/교통 데이터 처리
Facility,FacilityTransit엔티티 및TransitRepositoryNative Query로 랭크 기준 상위 2개 이동 수단을 도보 분 단위로 계산합니다.
- AI 기반 주간 루틴 생성 (
RecommendService,RecommendLLMService)- Program 검색 결과를 LLM 프롬프트(
routine.prompt)에 삽입, OpenAI 응답을WeeklyRecommendResponse로 역직렬화합니다.
- Program 검색 결과를 LLM 프롬프트(
- 글로벌 예외/검증 체계
@ValidDTO +GlobalExceptionHandler→ApiResponse포맷으로 에러 메시지 일관성 유지, Swagger 예시 자동화를 통해 API 문서 신뢰성 확보합니다.
- 운영 자동화
- GitHub Actions CI에서 Gradle clean build 및 Docker Hub Push를 수행합니다.
- CD 워크플로우가 EC2로
deploy.sh와 설정을 전달해 Docker Compose 재기동, Certbot 자동 갱신 및 Nginx 재로드까지 수행합니다.
- 문화 빅데이터 플랫폼: 공공체육시설 프로그램 정보
