You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
비동기 이벤트 기반 Saga 패턴 · Redis 캐싱 & 분산락 · Elasticsearch 한국어 검색 · AI 상품 추천
📖 프로젝트 소개
ClosetBuddy는 대규모 트래픽 환경을 가정하고 설계한 의류 이커머스 플랫폼입니다.
단순한 CRUD 애플리케이션을 넘어, 마이크로서비스 아키텍처(MSA), Apache Kafka 기반 비동기 이벤트 통신, Redis 캐싱 및 Redisson 분산락, Elasticsearch 한국어 전문 검색 등 실무에서 대규모 트래픽을 처리하기 위해 적용하는 핵심 기술들을 직접 구현하였습니다.
핵심 목표
목표
접근 방식
높은 동시성 처리
Redisson 분산락으로 재고 동시성 제어, 데드락 방지를 위한 순서 기반 락 획득
서비스 간 느슨한 결합
Apache Kafka를 통한 비동기 이벤트 기반 통신, Saga 패턴으로 분산 트랜잭션 관리
응답 속도 최적화
Redis 다중 인스턴스 캐싱 (상품/장바구니), @Cacheable 기반 캐시 전략
검색 성능 확보
Elasticsearch + Nori 분석기로 한국어 형태소 분석, 자동완성, 오타 허용 검색
독립적 배포 & 확장
서비스별 독립 DB, Docker 컨테이너화, K3s 기반 Kubernetes 오케스트레이션
주문 처리 시 재고 차감 → 결제의 멀티 서비스 트랜잭션을 Choreography 방식의 Saga 패턴으로 구현하였습니다. 각 단계의 실패 시 **보상 트랜잭션(Compensating Transaction)**을 통해 데이터의 최종 일관성(Eventual Consistency)을 보장합니다.
성공
order-service ─────────────────────> main-service (재고)
│ ① order.stock-check.request │
│ │ ② order.stock-check.result
│ <────────────────────────────────────┘
│
│ ③ order.payment.request
│ ───────────────────────────────> pay-service
│ │ ④ order.payment.result
│ <────────────────────────────────────┘
│
│ [실패 시 보상 트랜잭션]
│ ⑤ order.stock.rollback ─────> main-service
│ ⑥ order.payment.rollback ───> pay-service
Kafka Topic
Producer
Consumer
설명
order.stock-check.request
order-service
main-service
재고 차감 요청
order.stock-check.result
main-service
order-service
재고 차감 결과
order.payment.request
order-service
pay-service
결제 요청
order.payment.result
pay-service
order-service
결제 결과
order.stock.rollback
order-service
main-service
재고 복구 (보상)
order.payment.rollback
order-service
pay-service
결제 복구 (보상)
recommend.result
AI 서비스
order-service
AI 추천 결과 수신
📦 이벤트 계약 관리: common-event, recommend-event 공통 라이브러리를 GitHub Packages로 배포하여 서비스 간 Kafka 이벤트 DTO를 버전 관리합니다.
2. Redis 캐싱 & Redisson 분산락 — 동시성 제어
📌 캐싱 전략
서비스별로 Redis 인스턴스를 분리하여 캐시 부하를 분산하고, 독립적인 장애 격리를 보장합니다.
Redis 인스턴스
포트
서비스
용도
closetBuddy-redis
6379
main-service
상품 조회 캐싱, 분산락
closetBuddy-order-redis
6380
order-service
장바구니 캐싱, AI 추천 결과 캐싱
상품 조회: @Cacheable을 활용한 Look-Aside 캐싱으로 DB 부하를 최소화
캐시 무효화: 상품 등록/수정 시 @CacheEvict로 관련 캐시를 즉시 무효화
📌 분산락 (Redisson)
다수의 서버 인스턴스가 동시에 재고를 차감하는 상황에서 데이터 정합성을 보장합니다.
// 핵심 설계 포인트1.데드락방지: productId오름차순정렬후순서대로락획득2.타임아웃: WAIT_TIME=5초대기, LEASE_TIME=3초후자동해제3.보상처리: 결제실패시restoreStock()으로재고복구 (Saga패턴연계)
3. Elasticsearch — 고성능 한국어 검색
MySQL의 LIKE 쿼리 한계를 극복하기 위해 Elasticsearch를 도입하였습니다.
기능
기술
설명
한국어 형태소 분석
Nori Analyzer
"겨울코트" → "겨울" + "코트" 분리 검색
자동완성
Edge N-gram + bool_prefix
부분 문자열 입력 시 실시간 상품 제안
오타 허용 검색
Fuzziness AUTO
"니트" → "니드" 입력에도 검색 가능
동의어 검색
Synonym Analyzer
"아우터" ↔ "외투" 동의어 매핑
카테고리 부스팅
Field Boosting
카테고리 일치 시 ^5 가중치로 상위 노출
🧩 마이크로서비스 구성
서비스 목록
서비스
포트
역할
주요 기술
discovery-service
8761
Eureka 서버 (서비스 레지스트리)
Spring Cloud Netflix Eureka
gateway-service
8090
API Gateway, 라우팅, Swagger 통합
Spring Cloud Gateway, lb://
main-service
8082
상품/판매자/상점 카탈로그, 검색, 재고 관리
Elasticsearch, Redis, Redisson, Kafka
user-service
8085
인증/인가, 회원 관리
Spring Security, JWT, OAuth2 (Google)
order-service
8087
주문, 장바구니, AI 상품 추천
Kafka (Saga), Redis, OpenFeign
pay-service
8088
결제, 예치금, 정산 배치
Kafka, Spring Batch
공통 라이브러리
모듈
역할
common-event
주문/재고/결제 Kafka 이벤트 DTO (Java record)
recommend-event
AI 추천 서비스 Kafka 이벤트 계약
🗄 서비스별 데이터베이스 격리
MSA의 Database per Service 원칙에 따라 각 서비스가 독립된 데이터베이스를 사용합니다.