Finvibe 서비스 내 게이미피케이션(개인 챌린지, 배지, 경험치, 스쿼드 랭킹)을 담당하는 Spring Boot 기반 서비스입니다.
- 개인 챌린지 생성/보상 지급 (주간 스케줄러, Gemini 기반 LLM 생성 + 폴백 로직)
- 사용자 경험치 적립, 레벨 계산, 스쿼드 랭킹 및 기여도 랭킹 제공
- 배지 지급 이벤트 소비 및 배지 상태 조회
- 사용자 지표 업데이트 이벤트 소비 및 주간 지표 리셋
- Kafka 기반 이벤트 발행/구독 (지표/배지/XP)
- 분산 락: ShedLock + Redis, Redisson
- OpenAPI(Swagger UI) 제공
- Java 21, Spring Boot 4.0.1
- MariaDB (JPA), Redis, Kafka
- LangChain4j + Gemini (챌린지 생성)
- SpringDoc OpenAPI
docker compose -f infra/docker-compose.yml up -dGEMINI_API_KEY: 챌린지 생성에 사용JWT_HMAC_SECRET: JWT 검증용 시크릿 (기본값 있음)
./gradlew bootRun로컬 프로파일 명시 실행:
SPRING_PROFILES_ACTIVE=local ./gradlew bootRun- 기본 활성 프로파일:
local(src/main/resources/application.yml) application-local.yml에서 Kafka, DB, Redis, MongoDB 설정을 로컬 기준으로 로드application-prod.yml에서 운영 환경 변수 사용
DB_URL,DB_USERNAME,DB_PASSWORDREDIS_HOST,REDIS_PORT,REDIS_PASSWORDKAFKA_BOOTSTRAP_SERVERSMONGO_URLGEMINI_API_KEYJWT_SECRET
인증이 필요한 API는 Authorization: Bearer <JWT> 헤더가 필요합니다.
JWT 페이로드에는 id(UUID), role 클레임을 사용합니다.
- 챌린지
GET /challenges/me(인증 필요)
- 배지
GET /badgesGET /badges/me(인증 필요)
- 스쿼드
GET /squadsGET /squads/me(인증 필요)POST /squads/{squadId}/join(인증 필요)
- 경험치/랭킹
GET /xp/me(인증 필요)GET /xp/squads/rankingGET /xp/squads/contributions/me(인증 필요)
- Consume
gamification.update-user-metric.v1gamification.reward-badge.v1
- Produce
gamification.reward-xp.v1
- 월요일 00:00: 스쿼드 랭킹 정산 및 주간 XP 초기화
- 일요일 23:55: 개인 챌린지 보상 지급
- 일요일 23:58: 주간 이벤트 보상 지급
- 월요일 00:05: 주간 지표 리셋 + 개인 챌린지 생성
- 로컬 기본 경로:
/swagger-ui/index.html - 운영 환경 경로:
- Swagger UI:
/doc/gamification/swagger-ui.html - OpenAPI JSON:
/doc/gamification/v3/api-docs
- Swagger UI:
src/
├── main/
│ ├── java/depth/finvibe/gamification/
│ │ ├── boot/ # 설정, 보안, 인프라 구성
│ │ ├── modules/gamification/ # 게이미피케이션 모듈
│ │ │ ├── api/external/ # 외부 REST API
│ │ │ ├── application/ # 유스케이스 및 서비스
│ │ │ ├── domain/ # 도메인 모델
│ │ │ ├── dto/ # DTO
│ │ │ └── infra/ # 인프라 구현 (JPA, Kafka, LLM 등)
│ │ └── shared/ # 공통 모듈 (에러, 락 등)
│ └── resources/
│ ├── application.yml
│ ├── application-local.yml
│ ├── application-kafka.yml
│ ├── application-prod.yml
│ └── prompts/ # LLM 프롬프트
└── test/
./gradlew build
./gradlew test세부 컨벤션과 아키텍처 가이드는 AGENTS.md를 참고하세요.