고객 경험을 최우선 가치로, 많은 고객들에게 그들이 원하는 경험을 제공하여 선택(pick) 받자는 소망을 담았습니다.
대규모 트래픽을 견딜 수 있는 이커머스 서비스를 구축하여, 사용자에게 빠르고 안정적인 쇼핑 경험을 제공합니다.
- MSA 구조를 통해 서비스의 확장성과 유연성을 확보
- Kafka와 Redis를 활용하여 비동기 메시징으로 서비스 간 통신 및 캐싱을 통해 안정적이고 빠른 서비스 구축
- 동시성 처리를 통한 안정성 있는 서비스 구축
-
대규모 트래픽 처리
- 대규모 트래픽 상황에서도 안정적이고 빠른 응답 구축을 위해 Kafka 이벤트 기반의 비동기 처리 방식으로 구현
- 효율적인 분산 처리로 시스템의 부하를 줄이고, 대규모 트래픽을 효과적으로 관리 가능
-
주문
- Kafka를 통해 주문, 재고 - 결제 - 배송 - 알림 서비스 간 비동기 통신 구현
- Order 서비스가 주문의 전체 프로세스를 관리하고, 결제 및 배송 서비스에 대한 상태 변경을 트리거하는 방식으로 구현
- TTL 설정을 통해 주문 요청 후 5분 동안 결제 미진행 시, 주문 자동 취소
-
예약 구매
- 동시에 많은 요청 시, 재고 관리 로직에서의 동시성 이슈 방지를 위해 분산락 도입
- 주문 시 (주문 요청 → 재고 감소 → 주문 생성) 분산락 환경에서의 갱신 유실 방지를 위해 낙관적 락 추가 도입
-
알람
- Grafana와 Slack을 연동하여 서버 다운 시 슬랙 채널을 통한 알람 수신 (#server_channel)
- 트래픽 임계치에서 50% 이상 시 경고 알람, 80% 이상 시 위험 알람 (#traffic_channel)
- 주문, 배송 완료 시 kafka를 통한 실시간 메일 알람 전송
-
모니터링
- Grafana의 Provisioning 사용으로 어떤 환경에서 실행되어도 설정해둔 알람, 대시보드 등이 자동 provisioned 되도록 설정 자동화
- Loki를 통한 실시간 로그 분석 및 시각화
- Zipkin, prometheus를 통해 분산추적 및 로그 수집
-
고가용성 확보
-
Resilience4j Circuit Breaker를 통해 서비스 간 장애 전파 방지, 회복탄력성 향상
-
Redis Replication과 Sentinel을 통한 분산 처리 및 고가용성 확보
- Replication: 읽기 요청을 레플리카 노드로 우선적으로 분산하고, 쓰기 요청은 마스터 노드로 전송하여 부하 분산
- Sentinel: 마스터가 다운되었을 경우 슬레이브 중 하나를 새로운 마스터로 auto-failover
-
-
아키텍처
-
Domain Driven Design: 도메인 중심의 시스템 설계 및 도메인 모델에 집중한 비즈니스 로직
패키지 구조
```java com.pickple.commerce-service ├── application │ ├── dto │ │ ├── OrderCreateResponseDto.java │ │ └── OrderResponseDto.java │ ├── service │ └── OrderService.java ├── domain │ ├── model │ │ ├── Order.java │ │ ├── OrderDetail.java │ │ └── OrderStatus.java │ └── repository │ └── OrderRepository.java ├── exception │ ├── CommerceErrorCode.java │ ├── CommerceExceptionHandler.java │ └── CustomException.java ├── infrastructure │ ├── configuration │ │ ├── AuditAwareImpl.java │ │ ├── JpaConfig.java │ │ └── SecurityConfig.java │ ├── feign │ │ ├── DeliveryClient.java │ │ ├── PaymentClient.java │ │ └── dto │ │ ├── DeliveryClientDto.java │ │ └── PaymentClientDto.java │ ├── messaging │ │ ├── OrderEventService.java │ │ └── OrderMessagingProducerService.java │ └── security │ └── CustomPreAuthFilter.java ├── presentation │ ├── controller │ │ └── OrderController.java │ └── request │ └── OrderCreateRequestDto.java ``` </details>
-
Layered Architecture: 시스템을 여러 레이어로 나누어 서로 다른 관심사를 처리하도록 설계
-
Event-Driven Architecture: Kafka를 사용하여 이벤트가 전달되며, 각 서비스가 이벤트를 생성하고, 소비하는 방식으로 통신
-
-
멀티 모듈 구조
- MSA 환경에서 공통으로 사용되는 보일러 코드, 빈, 설정들을 공통 모듈(common-module)에 따로 두어 관리함으로써 유지보수성을 높이고 코드의 중복성을 낮춤
-
CI/CD
- 배포 링크 🔗링크
- 서비스 구조
Service | Description | Authorization | Port |
---|---|---|---|
[Eureka ] |
서비스 등록 및 로드밸런싱 | 19090 |
|
[API Gateway ] |
요청 인증 및 라우팅 | jwt 토큰 인증 | 19091 |
[Auth ] |
jwt 토큰 발급 및 관리 | jwt 토큰 발급 | 19092 |
[User ] |
사용자 관련 작업 관리 | jwt 토큰 인가 | 19093 |
[Commerce ] |
커머스 관련 도메인 작업 관리 | jwt 토큰 인가 | 19094 |
[Payment ] |
결제 도메인 작업 관리 | jwt 토큰 인가 | 19095 |
[Delivery ] |
배송 도메인 작업 관리 | jwt 토큰 인가 | 19096 |
[Notification ] |
알람 도메인 작업 관리 | jwt 토큰 인가 | 19097 |
git clone https://github.com/pickple-ecommerce/backend.git
docker-compose -f docker-compose.dev.yml --env-file dev.env
docker-compose -f docker-compose.service.yml --env-file dev.env
팀원 | 포지션 | 담당 | GitHub 링크 |
---|---|---|---|
![]() 이경진 |
👑 Leader |
- Eureka, gateway 환경 구축 - User, Auth 도메인 백엔드 개발 (인증/인가 및 백오피스) - 상품 및 재고 도메인 백엔드 개발 - 예약구매 기능 개발 - Redis master-slave 구조 및 sentinel 구축 |
GitHub |
![]() 이지선 |
👑 Sub-Leader |
- 업체 도메인 백엔드 개발 - 주문 도메인 백엔드 개발 - Resilience4j 서킷 브레이커 구현 |
GitHub |
![]() 박지민 |
🫅🏻 Member |
- 결제 도메인 백엔드 개발 - 알림 도메인 백엔드 개발 - Prometheus와 Grafana 연동으로 서버 모니터링 및 Slack으로 알림 발송 기능 구현 - Loki 활용하여 로그 관리 및 시각화 |
GitHub |
![]() 김진명 |
🫅🏻 Member |
- 배송 도메인 백엔드 개발 - 프로젝트 Gradle 멀티 모듈 구성 - Github Actions를 활용하여 CI/CD 구성 - AWS Infra 구성 및 배포 |
GitHub |