Subscription / Commerce
트레바리 멤버십 서비스 개편
- Java 11
- Spring Boot 2.6
- Spring Data JDBC
- PostgreSQL
- Docker
- K8s
- GitHub Actions
- Argo CD
- AWS SNS/SQS
- Node.js
- TypeScript
- React
- Next.js
Overview
기존 독서모임 클럽 상품에 강하게 의존하던 멤버십 구조를 개편했습니다. 상품 의존성을 제거하고 권한, 상태, 유효기간, 등급, 가입·해지 정책을 독립적으로 관리하는 도메인 구조로 재설계했습니다.
Problem
- 기존 멤버십은 특정 클럽 상품에 종속되어 새로운 등급이나 상품 추가 시 구조를 반복적으로 수정해야 했습니다.
- 결제, 멤버십, 쿠폰, 환불 서비스 간 결합도가 높아 상태 변경과 이벤트 처리 영향 범위가 컸습니다.
- 등급별 가입, 해지, 기간 산출, 쿠폰 정책이 달라 단순 조건 분기만으로는 확장성이 부족했습니다.
My Ownership
- 멤버십 도메인 재설계와 구독·해지 백엔드 구현을 담당했습니다.
- 프론트엔드 멤버십 구독·해지 화면 기능도 일부 추가했습니다.
- AWS SNS/SQS 기반 이벤트 처리로 결제·멤버십·쿠폰·환불 서비스 간 결합도를 낮췄습니다.
Key Decisions
메시지 브로커AWS SNS/SQS
기존 MSA 서비스 인프라와 일관성을 유지하면서 결제·멤버십·쿠폰·환불 서비스 간 직접 의존을 제거했습니다.
아키텍처헥사고날 아키텍처
가입, 해지, 기간, 쿠폰 정책 변경 시 도메인 코드 중심으로 대응하도록 인프라 의존성을 분리했습니다.
구독 정책전략 + 템플릿메서드 패턴
등급별 정책 차이를 구현체로 분리하고, 공통 가입·해지 흐름은 추상 클래스에 정의했습니다.
Implementation
상품 의존성 제거
멤버십 상태, 권한, 유효기간, 등급을 독립적으로 정의하고 클럽 상품 변경에 덜 흔들리는 구조로 재설계했습니다.
등급별 구독 정책
클럽 멤버, 클럽장, 파트너, 크루 등 등급별 가입·해지·기간·쿠폰 정책을 전략 구현체로 분리했습니다.
이벤트 처리
결제 완료, 멤버십 가입, 환불, 상품 변경 이벤트를 AWS SNS/SQS로 수신해 서비스 간 상태 변경을 비동기로 처리했습니다.
Detailed Notes
멤버십 도메인 재설계
기존 멤버십은 독서모임 클럽 상품에 종속되어 등급 추가 시 불필요한 데이터가 생기는 구조였습니다. 연관 모듈 도식화로 결제, 환불, 어드민, 서비스 페이지 등 영향 범위를 사전에 파악한 후 상품 의존성을 제거했습니다.
- 등급, 권한, 유효기간, 상태를 독립적으로 정의했습니다.
- 구독 상태 생성 → 구독 상태 → 해지 가능으로 상태 전이 기준을 명확히 했습니다.
- 구독 상태에서만 해지가 가능하도록 도메인 규칙을 정리했습니다.
등급별 구독 정책
등급별 가입·해지·기간·쿠폰 정책이 달라 if/else 분기 대신 전략 + 템플릿메서드 패턴을 적용했습니다.
| 정책 | 내용 |
|---|---|
| 가입 정책 | 클럽 멤버는 독서모임 + 커뮤니티 멤버십 2개를 동시 구독하고, 클럽장·파트너·크루는 단일 멤버십을 구독합니다. |
| 기간 정책 | 독서모임·커뮤니티·파트너·클럽장은 미팅 일정 기반으로 기간을 산출하고, 구독 클럽은 라이브 세션일 기반으로 산출합니다. |
| 해지 정책 | 클럽 멤버는 당일 가입건 또는 첫 미팅 7일 전인 경우에만 해지하고, 그 외 등급은 즉시 전체 해지합니다. |
| 쿠폰 정책 | 커뮤니티·파트너·클럽장·크루에는 쿠폰 정책을 적용하고 독서모임 멤버십에는 적용하지 않습니다. |
AWS SNS/SQS 이벤트 처리
- 결제 완료 이벤트 수신 시 멤버십 가입을 처리했습니다.
- 멤버십 가입 이벤트 수신 시 등급별 쿠폰을 발급했습니다.
- 환불 이벤트 수신 시 멤버십 해지를 처리했습니다.
- 상품 변경 이벤트 수신 시 멤버십 기간을 변경했습니다.
- 역직렬화 → 검증 → 실행 흐름을 공통 처리 클래스로 추상화했습니다.
- 역직렬화 실패와 검증 실패는 IGNORE 처리하고, 처리 중 예외는 RETRY로 일시적 오류를 복구하도록 했습니다.
K8s 기반 운영
- K8s CronJob 기반으로 만료 멤버십 자동 해지를 운영했습니다.
- REST API로 수동 트리거도 지원했습니다.
- GitHub Actions + Argo CD 기반 GitOps 배포 자동화를 운영했습니다.
Result / Impact
- 상품 의존성을 제거해 새로운 상품·등급 추가 시 기존 구조 변경 부담을 줄였습니다.
- 결제·멤버십·쿠폰·환불 서비스 간 결합도를 낮췄습니다.
- K8s CronJob 기반 만료 멤버십 자동 해지와 GitOps 기반 배포 흐름을 운영했습니다.