운영 중인 모바일 웹앱에, 결제 기능을 붙이기 위하여 RevenueCat이 제공하는 capacitor 라이브러리를 통한 적용 내용을 정리해보자.

 

먼저 필수적으로 알아야 하는 개념은 3가지다.

 

1. Entitlements (권한)

 

사용자가 실제로 접근할  있는 기능/특징들의 집합입니다. 최종적인 권한을 의미하고, "pro_access" 하나만 해도 무방하다.

- 앱 내에서 실제로 확인하는 사용자 권한
- 코드에서 기능 접근 제어에 사용
- 여러 상품이 동일한 권한을 부여할 수 있음

 

예시:
```
// 할일 관리 앱의 entitlements 예시
"pro_access": {  // 프리미엄 기능 접근 권한
    - 클라우드 동기화
    - 무제한 할일 목록
    - 고급 테마
    - 태그 기능
}

"team_access": { //  기능 접근 권한
    -  공유 기능
    - 협업 도구
    - 실시간 업데이트
}
```


2. Products (상품)


실제 앱스토어/플레이스토어에 등록된 구매 가능한 상품들입니다. monthly subscription, yearly_subscription이 대표적이고 평생 1회 구매도 가능하다겠다.

- 실제 결제되는 상품
- 스토어별 고유 ID 보유
- 가격과 기간 정보 포함
예시:
```
// 스토어에 등록된 products 예시
"com.myapp.subscription.monthly": {
    가격: 4,900
    기간: 1개월
    type: 자동갱신구독
}

"com.myapp.subscription.yearly": {
    가격: 39,900
    기간: 1
    type: 자동갱신구독
}
```
3. Offerings (제안)

Products 그룹화하고 사용자에게 보여주는 방식을 정의합니다. 보통 "default" 그룹 하나면 충분하다. 특별 이벤트 기간이 있다면, product를 더 만들어서, "summer_sale" 그룹으로 묶어서 제공하는 방식이다. 


- 상품들의 논리적 그룹
- A/B 테스트나 프로모션에 활용
- 지역/시기별 다른 제안 가능

예시:
```
// offerings 구성 예시
"default": {  // 기본 제안
    monthly: "com.myapp.subscription.monthly",
    annual: "com.myapp.subscription.yearly"
}

"summer_sale": {  // 여름 할인 프로모션
    monthly: "com.myapp.subscription.monthly.summer",
    annual: "com.myapp.subscription.yearly.summer"
}

"black_friday": {  // 블랙프라이데이 특별 제안
    lifetime: "com.myapp.lifetime.blackfriday"
}
```

실제 연결 예시:
// 사용자가 'pro_access' entitlement 얻는 방법
Offerings {
    "default" {
        // 일반적인 구독 옵션
        monthly: "com.myapp.subscription.monthly" -> pro_access
        annual: "com.myapp.subscription.yearly" -> pro_access
    }
    
    "promotion" {
        // 프로모션 기간 특별 가격
        monthly: "com.myapp.subscription.monthly.promo" -> pro_access
        annual: "com.myapp.subscription.yearly.promo" -> pro_access
    }
}

활용 예시:
```
// 사용자의 프리미엄 접근 권한 확인
if user.hasEntitlement("pro_access") {
    // 프리미엄 기능 활성화
}

// 현재 제공 중인 구독 옵션 표시
let currentOffering = Purchases.shared.currentOffering
display(currentOffering.monthly.price)  // " 4,900"
display(currentOffering.annual.price)   // " 39,900"
```

이러한 구조를 통해:
유연한 가격 정책 운영
다양한 프로모션 실행
간편한 기능 접근 제어
효율적인 구독 관리가 가능합니다.

1인 개발의 경우, 많은 것이 필요 없다.

 

1. Entitlement, Products, Offerings 생성

- Entitlement : pro // 많은 권한이 필요한가? pro 딱 하나만 만들자.

- Products : pro_monthly_1:price1month, pro_yearly_1:price1year // 많은 상품 필요한가? 딱 월간, 연간 구독 두개만 만들자.

   - Subscription Id : pro_monthly_1 // pro 권한을 부여하는 상품이니, pro라는 prefix를 추가했고, 추후 다른 monthly 상품이 추가될 가능성을 위해 index를 postfix로 추가
   - Base Plan Id : price1month // 기본 계획 ID라고 하는데, 보통 해당 상품이 어떤 유형인지를 나타내는 ID를 의미하는 듯하다.(1월마다 정기결재하는 상품, 1년에 정기 결재하는 상품, 1회성 상품)

   -> Products가 Google Play Console의 인앱 상품의 ID와 동일하게 생성하면 잘 연결되었을 줄 알았는데, 잘 안된다.

  https://sddev.tistory.com/344 이 게시물을 참고하여, 인앱 상품을 먼저 만들고, RevenutCat의 "import" 버튼을 눌러서 Products를 생성하자.

- Offerings(Products의 그룹): default // 많은 프로모션이 필요한가? 어차피 연간구독은 좀 할인해줄테니, 기본 default만 생성하자.

 

이렇게만 해도 무방하겠다. 각각 생성시 id가 필요한데, 위와 같이 지정하였다.

위의 순서대로 생성해야, 각각 생성시 헤매는 일이 없다. 

 

2. 각각 구성 요소 연결하기

- Entitlement pro 항목에 들어가서, 생성된 Products들을 모두 attach 해준다.

- Offerings의 경우, 생성할 때 Products 목록을 받는다.(New Packages를 눌러서 두개다 추가한다.)

 

 

 

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기