Spring Boot 기반의 멀티 모듈 이커머스 백엔드 애플리케이션입니다.
10주간의 BE L2 과정을 통해 단순 CRUD를 넘어 실제 서비스에서 마주치는 문제들을 단계적으로 해결하며 구축한 이커머스 백엔드 시스템입니다.
주요 기능: 상품 조회, 사용자 관리, 포인트/쿠폰, 주문/결제, 좋아요, 실시간 랭킹 시스템
| 분류 | 기술 |
|---|---|
| Language | Java 21 |
| Framework | Spring Boot 3.4.4, Spring Batch |
| Database | MySQL, Redis (Master/Replica) |
| Messaging | Apache Kafka |
| ORM | Spring Data JPA, QueryDSL |
| Resilience | Resilience4j (Circuit Breaker, Retry) |
| Testing | JUnit 5, Testcontainers, SpringMockK |
| Build | Gradle (Multi-module) |
Root
├── apps/ # 실행 가능한 Spring Boot 애플리케이션
│ ├── commerce-api # REST API 서버 (메인)
│ ├── commerce-collector # Kafka 이벤트 컨슈머 (메트릭/랭킹 처리)
│ ├── commerce-batch # Spring Batch Job (주간/월간 랭킹 집계)
│ └── pg-simulator # 결제 게이트웨이 시뮬레이터
│
├── modules/ # 재사용 가능한 인프라 설정
│ ├── jpa # JPA, QueryDSL, DataSource 설정
│ ├── redis # Redis 설정 (Master/Replica)
│ ├── kafka # Kafka Producer/Consumer 설정
│ └── feign # Feign Client + Resilience4j 설정
│
└── supports/ # 부가 기능 애드온
├── jackson # JSON 직렬화 설정
├── logging # Logback + Slack Appender
└── monitoring # Actuator + Prometheus 메트릭
com.loopers/
├── interfaces/ # 표현 계층 (REST Controller, DTO, API Spec)
├── application/ # 응용 계층 (Facade, QueryService)
├── domain/ # 도메인 계층 (Entity, Service, Repository Interface)
├── infrastructure/ # 인프라 계층 (Repository 구현체, 외부 Client)
└── support/ # 지원 유틸리티 (예외 처리, 에러 타입)
[commerce-api] → Kafka → [commerce-collector] → Redis ZSET (실시간 랭킹)
→ MySQL (product_metrics)
[commerce-batch] → product_metrics → mv_product_rank_weekly/monthly (Materialized View)
- 요구사항 명세서 작성
- ERD, 클래스 다이어그램, 시퀀스 다이어그램 설계
- 도메인 엔티티 및 서비스 구현 (User, Product, Order, Payment, Coupon, Point, Like)
- 레이어드 아키텍처 적용 (Facade/QueryService 패턴)
관련 소스
- 도메인 엔티티 - Product, Order, Payment, User, Coupon 등
- BaseEntity - 공통 엔티티 (생성/수정 시간)
- 동시성 문제 분석 및 테스트 작성
- 비관적/낙관적 락 적용
- 포인트 차감, 재고 차감, 쿠폰 발급 동시성 처리
관련 소스
- OrderConcurrencyTest - 동시성 테스트
- OrderFacade - 주문 오케스트레이션
- ProductService - 재고 동시성 처리
- 인덱스 설계 및 적용
- Redis 캐싱 도입 (상품 조회)
- Master/Replica 구조 적용
관련 소스
- ProductCacheRepository - 캐시 저장소 인터페이스
- ProductCacheRepositoryImpl - Redis 캐시 구현
- RedisConfig - Master/Replica 설정
- PG(Payment Gateway) 시뮬레이터 연동
- Feign Client를 통한 HTTP 통신
- Resilience4j 적용 (Circuit Breaker, Retry, Timeout)
- 장애 복구 및 지연 대응 전략 구현
관련 소스
- pg-simulator - PG 시뮬레이터 애플리케이션
- PgClient - Feign 클라이언트
- ResilienceConfig - Resilience4j 설정
- FeignResilienceConfig - Feign Resilience 설정
- ApplicationEvent를 활용한 트랜잭션 분리
- 주문-결제-쿠폰 처리 이벤트 기반 분리
- 좋아요-집계 분리 (Eventual Consistency)
@TransactionalEventListener,@Async활용
관련 소스
- OrderCreatedEvent - 주문 생성 이벤트
- OrderEventHandler - 주문 이벤트 핸들러
- LikeEventHandler - 좋아요 이벤트 핸들러
- DataPlatformEventHandler - 데이터 플랫폼 이벤트
- commerce-collector 모듈 구축
- Kafka Producer (At Least Once 보장)
- Kafka Consumer (멱등 처리)
- 감사 로그(Audit Log), 캐시 무효화, 메트릭 집계 구현
product_metrics테이블 적재
관련 소스
- commerce-collector - Kafka 컨슈머 애플리케이션
- OrderEventConsumer - 주문 이벤트 컨슈머
- RankingEventConsumer - 랭킹 이벤트 컨슈머
- ProductMetrics - 상품 메트릭 엔티티
- KafkaConfig - Kafka 설정
- Redis Sorted Set을 활용한 일간 랭킹 시스템
- 가중치 기반 점수 계산 (조회: 0.1, 좋아요: 0.2, 주문: 0.7)
- 일간 키 전략 및 TTL 관리
- 랭킹 API 구현 (
GET /api/v1/rankings)
관련 소스
- RankingRepository - 랭킹 저장소 인터페이스
- RankingRepositoryImpl - Redis ZSET 구현
- RankingQueryService - 랭킹 조회 서비스
- RankingV1Controller - 랭킹 API
- RankingEventHandler - ZSET 업데이트 핸들러
- commerce-batch 모듈 구축
- Chunk-Oriented Processing (Reader → Processor → Writer)
- 주간/월간 Materialized View 설계
mv_product_rank_weekly: TOP 100 주간 랭킹mv_product_rank_monthly: TOP 100 월간 랭킹
- 스케줄러를 통한 자동 배치 실행
- 랭킹 API 확장 (일간/주간/월간)
관련 소스
- commerce-batch - Spring Batch 애플리케이션
- WeeklyRankingJobConfig - 주간 랭킹 Job
- MonthlyRankingJobConfig - 월간 랭킹 Job
- ProductMetricsReader - ItemReader
- WeeklyRankingProcessor - ItemProcessor
- WeeklyRankingWriter - ItemWriter
- WeeklyProductRanking - 주간 MV 엔티티
- RankingBatchScheduler - 배치 스케줄러
# 인프라 실행 (MySQL, Redis, Kafka)
docker-compose -f ./docker/infra-compose.yml up
# 모니터링 실행 (Prometheus, Grafana)
docker-compose -f ./docker/monitoring-compose.yml up# 전체 빌드
./gradlew build
# 전체 테스트 실행
./gradlew clean test
# 특정 모듈 테스트
./gradlew :apps:commerce-api:test
./gradlew :apps:commerce-batch:test
./gradlew :apps:commerce-collector:test# commerce-api 실행 (메인 REST API)
./gradlew :apps:commerce-api:bootRun
# commerce-collector 실행 (Kafka 컨슈머)
./gradlew :apps:commerce-collector:bootRun
# commerce-batch 특정 Job 실행
./gradlew :apps:commerce-batch:bootRun --args="--job.name=weeklyRankingJob"
./gradlew :apps:commerce-batch:bootRun --args="--job.name=monthlyRankingJob"| Method | URI | 설명 |
|---|---|---|
| POST | /api/v1/users |
회원가입 |
| GET | /api/v1/users/me |
내 정보 조회 |
| POST | /api/v1/points/charge |
포인트 충전 |
| GET | /api/v1/points |
보유 포인트 조회 |
| GET | /api/v1/products |
상품 목록 조회 |
| GET | /api/v1/products/{productId} |
상품 상세 조회 |
| POST | /api/v1/like/products/{productId} |
상품 좋아요 등록 |
| DELETE | /api/v1/like/products/{productId} |
상품 좋아요 취소 |
| POST | /api/v1/orders |
주문 요청 |
| GET | /api/v1/orders |
주문 목록 조회 |
| GET | /api/v1/rankings |
랭킹 조회 (일간/주간/월간) |
모든 API는
X-USER-ID헤더로 사용자를 식별합니다.
| 서비스 | 주소 | 비고 |
|---|---|---|
| MySQL | localhost:3306 | user: application, db: loopers |
| Redis Master | localhost:6379 | 쓰기용 |
| Redis Replica | localhost:6380 | 읽기용 |
| Kafka | localhost:19092 | - |
| Kafka UI | http://localhost:9090 | - |
| Grafana | http://localhost:3000 | admin/admin |
- 단위 테스트: 순수 도메인 로직 검증 (Spring 컨텍스트 없음)
- 통합 테스트:
*IntegrationTest- Testcontainers 활용 - E2E 테스트:
*E2ETest- 전체 HTTP API 테스트
이 프로젝트는 Loopers BE L2 과정의 학습용 프로젝트입니다.