All in One 통합 러닝 서비스입니다. 러닝 기록 관리, 크루 활동, 대회 신청 등 러닝과 관련된 서비스들을 안정적으로 제공합니다.
대규모 트레픽 대응
- MSA 구조로 장애 대응 및 확장성 확보
- Kafka를 이용해 고성능과 고가용성 구현
- Redis로 처리 속도 향상
안정적인 모니터링
- Prometheus, Grafna 이용
- 시스템, 어플리케이션 지표 관리
배포
- Docker를 이용해 실행 환경 통일, 배포 단순화
- 러닝 기록
- 사용자 ID, 달린 거리, 달린 시간, 평균 페이스를 입력 받아 관리하는 서비스입니다.
- 러닝 기록 등록 및 저장을 합니다.
- 러닝 기록 등록 시 Kafka를 이용하여 업적 서비스로 러닝 기록 생성 이벤트를 날립니다.
- 랭킹
- 러닝 기록 기반 랭킹 서비스입니다.
- 사용자들간 혹은 크루간 기록을 확인하여, 경쟁을 부추길 수 있습니다.
- 개인 랭킹 산정은 일정 기간마다 누적 달린 거리(Km) , 누적 달린 시간 , 평균 페이스로 각 랭킹이 산정됩니다.
- 크루 랭킹 산정은 크루의 현재 가입된 크루원 수 , 모임의 참여율 등으로 랭킹이 산정됩니다.
- 랭킹은 일정 기간마다 스케쥴링으로 스냅샷 형태로 기록됩니다.
- 업적
- 러닝 기록 기반으로 어플리케이션의 업적을 달성했는지 확인해주는 서비스입니다.
- 업적 서비스를 통해 러닝 목표 달성을 유도해줍니다.
- Kafka를 통해 러닝 기록 생성 이벤트를 받아 업적 달성 여부를 확인한 뒤, 달성 시 알림 서비스로 사용자들에게 업적 달성 알림을 남깁니다.
- 이용자 보고서 (ReCap)
- 사용자 러닝 기록 데이터를 기반으로 요약 보고서를 생성해주는 서비스입니다.
- 사용자 러닝 기록 데이터에 있는 수치를 이용하여 이용자에게 의미 있는 통계량을 계산하여 제공합니다.
- 러닝 크루
- 크루 기능
- 이용자들이 마음 맞는 사람들과 함께 러닝 경험을 공유할 수 있도록 크루를 모집하거나 기존 크루에 참여할 수 있습니다.
- 크루 장이 크루 회원을 관리하여 가입 신청을 관리하고, 이미 가입 중인 멤버를 관리할 수 있습니다.
- 활발한 크루 활동을 위해 크루 내 모임을 모집할 수 있는 기능과, 크루원들이 사용할 수 있는 게시판 기능을 제공합니다.
- 크루 내 모임 기능
- 크루 정기 모임이나 , 크루원이 자유롭게 크루 안에서 모임을 모집하여 같이 러닝 활동을 할 수 있습니다.
- 게시판 기능
- 크루 내 정보 게시를 담당하는 기능입니다.
- 게시글 생성, 조회, 검색, 수정, 삭제 기능이 구현되어 있습니다.
- 크루 기능
- 대회
- 대회 관리 기능
- 공식 대회를 등록하여 러너들에게 대회 참가를 유도해주는 서비스입니다.
- 대회 생성, 조회, 검색, 수정, 삭제 기능이 구현되어 있습니다.
- 주최자별 대회 관리 인터페이스를 제공합니다.
- 선착순/추첨 방식의 다양한 접수 유형 지원합니다.
- 참가 신청 프로세스
- Saga Pattern을 활용하여 분산 트랜잭션을 관리합니다.
- 약관 동의 → 기념품 선택 → 배송지 입력 → 결제 → 참가 확정의 단계적 프로세스로 구성되어 있습니다.
- Redis를 활용한 Saga 상태 관리로 트랜잭션 일관성 유지하고 있습니다.
- 알림 서비스
- Kafka를 활용한 이벤트 기반 아키텍처 구현하였습니다.
- 대회 관리 기능
- 챗봇
- 사용자의 런닝에 관한 질문에대해 AI챗봇이 미리 저장된 런닝정보를 참고하여 답변을 생성합니다.
- 관리자가 vector store테이블 저장 API를 이용해서 런닝관련 정보를 저장합니다.
- 사용자가 질문을 요청하면 사용자의 질문과 유사도가 비슷한 정보를 기반으로 프롬프트를 생성합니다.
- 프롬프트 엔지니링의 페르소나 패턴을 적용해 AI에 런닝 선수 출신 코치라는 역할을 부여하여 답변의 정확도를 높입니다.
- 생성된 답변을 SSE로 실시간으로 응답합니다.
- 사용자의 런닝에 관한 질문에대해 AI챗봇이 미리 저장된 런닝정보를 참고하여 답변을 생성합니다.
- 알림
- 업적 달성, 대회 신청 완료 등 이벤트가 발생했을 시 Slack으로 알림 메시지를 전송합니다.
- 알림 서비스에서 Kafka 컨슈머를 통해 이벤트를 받고 Slack API를 호출해 메시지를 전송합니다.
- Kafka컨슈머 Lag, 메시지 전송 성공/실패 등을 Grafana대시보드를 통해 모니터링을 합니다.
- 업적 달성, 대회 신청 완료 등 이벤트가 발생했을 시 Slack으로 알림 메시지를 전송합니다.
| 카테고리 | 기술 | 버전 | 근거/ 목적 |
|---|---|---|---|
| 언어 | Java | 17 | LTS 지원 최신 언어 |
| 빌드 | Gradle | 1.1.7 | 빌드 관리 자동화 |
| 프레임워크 | Spring Boot | 3.4.4 | 설정 간소화 |
| 라이브러리 | Netflix Eureka | Spring Cloud 2024.0.1 | MSA 환경에서 서비스 인스턴스 자동 등록·검색 |
| Spring Boot JPA | SQL 없이도 간단히 구현 | ||
| Spring Boot Kafka | 비동기 처리하여 서비스 간 결합도를 낮추고 확장성 확보 | ||
| Jackson2JsonRedisSerializer | JSON 형태로 저장·조회 | ||
| Swagger(springdoc-openapi) | 2.8.5 | API 명세 자동 생성, 테스트 편의성 | |
| Infra | Docker | 개발·테스트 환경 일치 | |
| PostgreSQL | ankane/pgvector:latest | 벡터 검색 기능 포함 | |
| Redis | redis/redis-stack | ||
| Zookeeper | wurstmeister/zookeeper | 오프셋 관리·파티션 메타데이터 조율 | |
| Apache Kafka | wurstmeister/kafka | 멱등·재시도 설정 | |
| UI | kafka-ui | provectuslabs/kafka-ui | |
| 모니터링 | Prometheus | prom/prometheus | 메트릭을 스크래핑해 시계열 데이터 수집 |
| Grafana | grafana/grafana | 메트릭을 대시보드화 | |
| Loki | grafana/loki | 로그를 라벨링해 중앙집중식 저장 | |
| Micrometer Registry Prometheus | 모니터링 파이프라인에 연결 | ||
| Test | Spring Boot Starter Test | JUnit Platform Launcher | 통합 테스트와 연동 테스트 지원 |
👥 이벤트 기반 처리 적용
Kafka를 선택한 이유
👥 중간 상태 저장
Redis 를 선택한 이유
🔬 Running-Record 생성 API 처리량 개선
RunningRecord 생성 API의 성능 병목 원인 분석 및 처리량 개선 과정
🔬 AWS 환경에 배포 후 Spring Cloud Gateway 가 Eureka Client 를 찾지 못하는 문제
ECS에서 컨테이너가 잘못된 IP로 Eureka에 등록되는 문제 분석 및 해결
🔬 사용자 인증인가 서버분리와 게이트웨이 순환참조 오류 FeignClient 빈 생성 전에 GatewayFilter가 먼저 주입을 요구하면서 서로 참조하는 구조 개선


