사용자 주문, 결제, 포인트 충전, 쿠폰 발급 등 이커머스 도메인을 헥사고날 아키텍처 기반으로 구성한 백엔드 애플리케이션입니다.
각 주차별 학습 내용, 작성 문서, 핵심 개념, 그리고 PR 및 피드백 요약입니다.
| 주차 | 내용 | 작성 문서 | 핵심 개념 | PR 및 피드백 |
|---|---|---|---|---|
| 1주차 (Step01~02) |
TDD 기반 기능 추가 및 테스트 구현 | - 기능 추가 및 테스트 구현 - 코드 구현 - PR 및 피드백 |
TDD (Red-Green-Refactor) 단위 테스트 MockMVC ObjectMapper 활용 |
주차별 요약 |
| 2주차 (Step03~04) |
서비스 시나리오 분석, ERD 설계, Mock API 및 API 명세서 작성 |
- 시나리오 분석 및 초기 설계 - DB 테이블 설계 - Mock API 및 테스트 - ERD · 시퀀스 다이어그램 · 상태 다이어그램 |
시퀀스 다이어그램 ERD 설계 상태 다이어그램 REST Docs / Swagger 도메인 분리 기준 |
주차별 요약 |
| 3주차 (Step05~06) |
헥사고날 아키텍처 기반 핵심 기능 구현 (상품/주문/결제) |
- 소프트웨어 설계 아키텍처 | 헥사고날 아키텍처 Port-Adapter 패턴 DIP (의존성 역전) Facade 패턴 도메인-엔티티 분리 |
주차별 요약 |
| 4주차 (Step07~08) |
Infrastructure Layer 구성, 통합 테스트, DB 인덱스 최적화 |
- 인덱스 설정 | Testcontainers 통합 테스트 (@Sql) 쿼리 실행계획 (EXPLAIN) 커버링 인덱스 반정규화 |
주차별 요약 |
| 5주차 (Step09~10) |
동시성 문제 식별 및 DB 락 기반 해결 |
- 포인트 락 테스트 - 쿠폰 락 테스트 - 결제 락 테스트 - 트랜잭션 테스트 |
비관적 락 (Pessimistic) 낙관적 락 (Optimistic) @Version 트랜잭션 전파 단위 동시성 통합 테스트 |
주차별 요약 |
| 6주차 (Step11~12) |
Redis 분산락 적용, 캐시 전략 수립 및 적용 |
- Top5 캐시 보고서 | 분산락 (Redisson AOP) 멀티 락 (Multi-Lock) Redis 캐싱 전략 캐시 스탬피드 TestContainer (Redis) |
주차별 요약 |
| 7주차 (Step13~14) |
Redis 기반 인기상품 랭킹, 선착순 쿠폰 비동기 설계 |
- 인기상품 보고서 - 선착순 쿠폰 보고서 |
ZSET (Sorted Set) ZUNIONSTORE Redis 기반 대기열 비동기 쿠폰 발급 워커(스케줄러) 패턴 |
주차별 요약 |
| 8주차 (Step15~16) |
이벤트 기반 관심사 분리, 분산 트랜잭션 설계 (Saga) |
- 분산 트랜잭션 설계문서 | @TransactionalEventListener Saga 패턴 (오케스트레이션) 상태 머신 (State Machine) 보상 트랜잭션 관심사 분리 |
주차별 요약 |
| 9주차 (Step17~18) |
카프카 학습 및 활용, 비즈니스 프로세스 개선 |
- 카프카 기본 활용 - 스프링 카프카 설정 - 주문정보 카프카 전송 - 병렬 쿠폰 발행 |
Kafka (Producer/Consumer) Outbox 패턴 Offset 관리 (수동/자동 커밋) DLQ (Dead Letter Queue) 컨슈머 책임 분리 |
주차별 요약 |
| 10주차 (Step19~20) |
부하 테스트 및 성능 지표 분석·개선 |
- 모니터링 분석 보고서 - 포인트 충전 모니터링 |
k6 부하 테스트 RPS / Latency 분석 비관적 락 vs 분산 락 성능 캐싱 vs DB 성능 단일 vs 분산 트랜잭션 성능 |
주차별 요약 |
kr.hhplus.be.server
├── common/ # 공통 유틸리티 및 예외 처리
│ ├── api/ # API 응답 래퍼
│ ├── exception/ # 도메인별 예외 정의
│ ├── inmemory/ # 인메모리 테이블 추상화
│ └── optimistic/ # 낙관적 락 지원
├── config/ # Spring 설정
│ ├── aop/lock/ # 분산락 AOP (@DistributedLock)
│ ├── jpa/ # JPA 설정
│ ├── kafka/ # Kafka Producer/Consumer 설정
│ └── redis/ # Redis Template 설정
└── domain/ # 핵심 도메인 (아래 구조 공통 적용)
└── {도메인명}/ # coupon, order, payment, product, user
├── controller/ # HTTP 요청 처리, DTO 변환
├── application/
│ ├── dto/ # 데이터 전송 객체
│ ├── facade/ # 여러 도메인 서비스 조합 (선택)
│ ├── saga/ # 사가 패턴 (분산 트랜잭션)
│ ├── service/ # 유스케이스 비즈니스 로직
│ └── repository/ # 저장소 Port (인터페이스)
└── adapter/
├── entity/ # JPA 엔티티 (영속성 계층)
├── repository/ # 저장소 Adapter (JPA 구현체)
├── cache/ # Redis 캐싱 구현
├── event/ # 이벤트 발행
└── kafka/ # Kafka Producer/Consumer
[Inbound Adapter] [Outbound Adapter]
Controller ──→ Facade ──→ Service ──→ Port(Interface)
│ │
▼ ▼
Domain Model Adapter (구현체)
├── JPA Repository
├── Redis Cache
├── Kafka Producer
└── Event Publisher
| 레이어 | 위치 | 책임 |
|---|---|---|
| Controller | controller/ |
외부 HTTP 요청 수신, 요청/응답 DTO 변환 후 Facade 또는 Service에 위임 |
| Facade | application/facade/ |
여러 도메인 서비스의 흐름을 조합하여 복합 유스케이스 수행 (선택적 도입) |
| Saga | application/saga/ |
분산 트랜잭션 상태 관리 및 보상 로직 (주문-결제 흐름) |
| Service | application/service/ |
단일 도메인 내 유스케이스 비즈니스 로직 처리 |
| Port | application/repository/ |
저장소 인터페이스 — 도메인이 외부 인프라에 의존하지 않도록 추상화 |
| Adapter | adapter/repository/ |
Port 구현체 — JPA, InMemory 등 실제 저장소 접근 |
| Entity | adapter/entity/ |
JPA 엔티티 — 영속성 계층, 도메인 모델과 분리 |
| Cache | adapter/cache/ |
Redis 기반 캐싱 — 인기상품 랭킹, 쿠폰 발급 수량 등 |
| Event/Kafka | adapter/event/, adapter/kafka/ |
이벤트 발행 및 Kafka 메시지 처리 (비동기 관심사 분리) |
- 모든 의존 관계는 안쪽(도메인) 방향 단방향으로 흐르며, 순환 참조를 금지합니다.
- Service/Domain은 Port 인터페이스를 통해 외부 저장소에 접근하고, 실제 구현은 Adapter가 담당합니다.
- 도메인 모델과 JPA 엔티티는 분리되어 있어 영속성 계층의 변경이 비즈니스 로직에 영향을 주지 않습니다.
- 부가 로직(랭킹 반영, 데이터 전송 등)은 이벤트/Kafka를 통해 메인 트랜잭션과 분리합니다.
| 도메인 | 설명 |
|---|---|
| user | 회원 도메인. 사용자 정보 및 포인트 잔액 관리, 충전/차감 기능을 포함합니다. |
| product | 판매 상품 정보를 관리하며, 상품 옵션(ProductLine)과 인기상품 랭킹 정보를 포함합니다. |
| order | 사용자의 주문 생성, 주문 상세(OrderLine), 주문 상태 관리를 담당하는 핵심 도메인입니다. |
| payment | 주문에 대한 결제 처리, 결제 성공/실패 상태 관리 및 저장을 담당합니다. |
| coupon | 선착순 쿠폰 발급, 사용 내역 관리, 할인 정책 적용을 담당합니다. |
- 통합 테스트는 SpringBootTest + Testcontainers (MySQL 8.0, Redis 7.2) 기반으로 작성됩니다.
- 테스트 데이터는
test/resources/sql/의 SQL 스크립트를@Sql어노테이션으로 로드합니다. - 모든 테스트는 UTC 타임존으로 실행됩니다.
local profile 로 실행하기 위하여 인프라가 설정되어 있는 Docker 컨테이너를 실행해주셔야 합니다.
docker-compose up -d