Monyon 보일러플레이트는 기존의 멀티테넌시 구조에 더해, Pay Gem을 통합하여 구독 기반 SaaS 애플리케이션으로 진화했습니다. 이는 특히 조직 단위의 구독 관리에 중점을 둡니다.
Stripe 연동 및 설정
-
API 키 설정: Rails credentials를 통해 Stripe API 키(공개 키, 비공개 키, 웹훅 시크릿)를 안전하게 설정합니다.
-
구독 플랜 정의:
config/settings.yml파일에서 구독 플랜(예: 월간, 연간)의 가격 ID, 단위 금액, 통화, 결제 간격 등을 정의합니다. -
Stripe 대시보드 설정: Stripe 대시보드에서 정의된 플랜에 해당하는 상품과 가격을 생성하고, 월간 플랜에서 연간 플랜으로의 업셀(upsell) 기능을 구성합니다.
구독 흐름 시연
-
조직 생성 및 결제 제한: 새로운 조직 생성 후, 구독이 필요한 결제 페이지에 접근하면 구독 필요 메시지가 표시됩니다.
-
결제 및 구독 활성화: 월간 또는 연간 플랜을 선택하고 Stripe Checkout 페이지에서 결제를 완료하면, 웹훅을 통해 조직의 구독 상태가 ‘active’로 업데이트됩니다.
-
청구 포털 관리: 활성화된 구독은 Stripe Billing Portal을 통해 고객이 직접 취소하거나 플랜을 변경할 수 있도록 합니다. 구독 취소 시, 즉시 접근이 차단되는 것이 아니라 현재 결제 기간 만료 시점에 구독이 종료됩니다.
조직 기반 구독 모델
-
Organization모델의Pay::Customer: 구독의 주체는 개별 사용자(User)가 아닌 조직(Organization)입니다.Organization모델에Pay::Customer를 포함하여 Stripe 고객 ID 및 관련 정보를 관리합니다. -
SubscriptionsController:SubscriptionsController는 구독 상태에 따른 페이지 렌더링, Stripe Checkout 세션 생성, Billing Portal로의 리디렉션 등 구독 관련 핵심 로직을 처리합니다.
동적 UI 및 조건부 기능
-
Stripe 자격 증명 유무에 따른 UI: Stripe API 키가 설정되지 않은 경우, 애플리케이션 내의 결제 관련 UI 및 기능이 자동으로 비활성화되어 표시되지 않습니다.
-
다양한 구독 상태: ‘미구독’, ‘활성 구독’, ‘취소 예정인 활성 구독’ 등 조직의 다양한 구독 상태에 따라 UI가 동적으로 변경되어 사용자에게 명확한 정보를 제공합니다.
레이아웃 개선
-
응답형(responsive) 디자인이 적용되어 다양한 화면 크기에서 최적화된 사용자 경험을 제공합니다.
-
두 가지 사이드바 레이아웃 옵션이 추가되어 사용자가 선호하는 UI를 선택할 수 있습니다.