Skip to content

HangHae-Study/e-commerce-

Repository files navigation

HHPlus 백엔드 시스템

사용자 주문, 결제, 포인트 충전, 쿠폰 발급 등 이커머스 도메인을 헥사고날 아키텍처 기반으로 구성한 백엔드 애플리케이션입니다.


포트폴리오

각 주차별 학습 내용, 작성 문서, 핵심 개념, 그리고 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

아키텍처 (Hexagonal Architecture)

의존 흐름

[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 타임존으로 실행됩니다.

Getting Started

Prerequisites

local profile 로 실행하기 위하여 인프라가 설정되어 있는 Docker 컨테이너를 실행해주셔야 합니다.

docker-compose up -d

About

이커머스 과제

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors