Android 인앱 결제 및 페이월 개요
0:02:00RevenueCat Android SDK Codelab에 오신 것을 환영합니다!
이 Codelab에서는 다음 내용을 학습합니다:
프로젝트에 RevenueCat SDK를 연동하는 방법 Android 애플리케이션에서 인앱 결제를 구현하는 방법 결제 사용자와 비결제 사용자를 구분하는 방법 서버 기반 UI 방식의 페이월 화면을 구축하는 방법
이 Codelab을 완료하면, RevenueCat의 Android SDK를 사용하여 Android 앱에서 인앱 결제를 성공적으로 구현하고 동적 페이월을 표시할 수 있습니다.
RevenueCat SDK 가져오기
0:05:00인앱 결제를 구현하기 전에, 먼저 기존 프로젝트 또는 새 프로젝트에 RevenueCat SDK를 가져와야 합니다. 시작하려면 build.gradle.kts 파일에 다음 의존성을 추가하세요:
GitHub에서 최신 릴리스 버전을 확인할 수 있습니다.
implementation("com.revenuecat.purchases:purchases:9.20.2")Paywall도 구현할 예정이라면, 다음 의존성을 대신 추가하면 됩니다:
implementation("com.revenuecat.purchases:purchases-ui:9.20.2")Getting Your API Key
Before you can initialize the SDK, you'll need your RevenueCat API key. Here's where to find it:
- Go to the RevenueCat dashboard
- Navigate to your project
- Click on API keys in the left sidebar
- Copy your Google Play Store API key (it should start with
goog_)
Initialize the SDK
다음으로, Application 클래스에서 아래 코드를 사용하여 Purchases SDK를 초기화하세요:
/**
* RevenueCat Purchases SDK를 초기화합니다.
*
* `appUserID`가 nil이면, Purchases SDK가 자동으로 익명 ID를 생성합니다.
* 사용자 식별에 대해 자세히 알아보기: https://docs.revenuecat.com/docs/user-ids
*
* `purchasesAreCompletedBy`가 REVENUECAT로 설정되어 있으므로, Purchases가 자동으로 트랜잭션을 완료합니다.
* 트랜잭션 완료에 대해 자세히 알아보기: https://www.revenuecat.com/docs/migrating-to-revenuecat/sdk-or-not/finishing-transactions
*/
val builder = PurchasesConfiguration.Builder(this, "REVENUECAT_API_KEY")
Purchases.configure(
builder
.purchasesAreCompletedBy(PurchasesAreCompletedBy.REVENUECAT)
.appUserID(null)
.diagnosticsEnabled(true)
.build(),
)이것으로 구현의 50%를 완료했습니다!
Entitlement 검증하기
0:03:00이제 사용자 Entitlement를 검증하는 방법을 알아보겠습니다.
앞서 언급했듯이, Entitlement는 사용자가 구매 후 잠금 해제하는 접근 수준 또는 기능을 나타냅니다. 이를 통해 광고 배너를 표시할지 또는 프리미엄 접근 권한을 부여할지 등을 결정할 수 있습니다.
아래 코드 스니펫을 사용하여 사용자가 활성 Entitlement를 가지고 있는지 쉽게 확인할 수 있습니다:
val ENTITLEMENT_IDENTIFIER = ".." // RevenueCat 대시보드에서 특정 entitlement identifier를 가져오세요
val customerInfo = Purchases.sharedInstance.awaitCustomerInfo()
val isEntitled = customerInfo?.entitlements[ENTITLEMENT_IDENTIFIER]?.isActive == true사용자가 특정 Entitlement를 가지고 있는지 확인한 후, 앱의 비즈니스 모델에 따라 진행 방법을 결정할 수 있습니다.
예를 들어, 앱이 광고 지원 방식이라면 AdMob 배너를 표시하거나 숨길 수 있습니다. 또는 사용자가 고급 기능이나 콘텐츠를 잠금 해제할 수 있도록 페이월이나 구매 다이얼로그를 표시할 수도 있습니다.
다음은 해당 로직을 구현하는 예시입니다:
@Composable
fun ContentScreen(isEntitled: Boolean) {
if (isEntitled) {
// 사용자가 이 entitlement에 접근 권한이 있으면 배너를 표시할 필요가 없습니다.
} else {
// 여기에 배너 UI를 표시하거나 페이월을 표시합니다
..
}
}인앱 결제 구현하기
0:04:00이제 광고 없는 경험을 제공하기 위한 인앱 결제를 구현해 보겠습니다. 시작하려면 먼저 RevenueCat 대시보드에서 관련 상품 정보를 가져와야 합니다. 이 상품 데이터는 사용자에게 구매 옵션을 제시하는 데 사용됩니다.
아래 예시와 같이 Purchases.sharedInstance.awaitGetProducts()를 호출하여 사용 가능한 상품을 가져올 수 있습니다:
// RevenueCat 서버에서 상품 정보를 가져옵니다
val products = Purchases.sharedInstance.awaitGetProducts(
productIds = listOf("paywall_tester.subs"),
)
// 인앱 결제를 진행합니다
val purchaseResult = Purchases.sharedInstance.awaitPurchase(
purchaseParams = PurchaseParams.Builder(
activity = context as Activity,
storeProduct = products.first(),
).build()
)paywall_tester.subs:weekly, paywall_tester.subs:monthly, paywall_tester.subs:yearly와 같이 여러 상품 변형을 제공하는 경우, productIds 필드에 기본 상품 식별자인 paywall_tester.subs를 사용하여 상품 검색을 단순화할 수 있습니다. 이렇게 하면 RevenueCat이 모든 관련 상품 변형을 목록으로 가져와 페이월 UI에서 동적으로 표시할 수 있습니다.
상품 데이터를 가져온 후, Purchases.sharedInstance.awaitPurchase(product)를 호출하여 인앱 결제 흐름을 시작할 수 있습니다. 이렇게 하면 자동으로 Google Play 결제 다이얼로그가 트리거되어 사용자가 앱 내에서 거래를 완료할 수 있습니다.
이것으로 단 몇 줄의 코드만으로 완전한 기능을 갖춘 인앱 결제 흐름을 통합했습니다. 영수증, 스토어 API 또는 구매 검증을 수동으로 처리하는 복잡함을 다룰 필요가 없습니다.
페이월 구현하기
0:07:00이제 Jetpack Compose를 사용하여 Android 프로젝트에서 Paywall을 구현할 차례입니다.
비즈니스 로직
시작하려면 RevenueCat 대시보드에서 현재 Offering을 가져와야 합니다. Offering은 월간, 연간 또는 평생 플랜과 같이 사용자에게 제시되는 구매 옵션을 정의합니다. 아래 예시와 같이 Purchases.sharedInstance.awaitOfferings() 메서드를 사용하여 쉽게 수행할 수 있습니다.
internal class DetailsRepositoryImpl @Inject constructor(
@Dispatcher(CatArticlesDispatchers.IO) private val ioDispatcher: CoroutineDispatcher,
) : DetailsRepository {
override fun fetchOffering(): Flow<ApiResponse<Offering>> = flow {
try {
val offerings = Purchases.sharedInstance.awaitOfferings()
offerings.current?.let { currentOffering ->
val response = ApiResponse.of { currentOffering }
emit(response)
}
} catch (e: PurchasesException) {
ApiResponse.exception(e)
}
}.flowOn(ioDispatcher)
}RevenueCat Android SDK는 Kotlin 코루틴을 네이티브로 지원하므로 코루틴 기반 아키텍처를 사용하는 프로젝트에 완벽하게 적합합니다. 현재 Offering은 Flow로도 노출되어 변경 사항을 반응적으로 관찰하고 UI를 적절히 업데이트할 수 있습니다.
Jetpack Compose로 Paywall UI 구현
이 시점에서 모든 준비가 완료되었습니다. com.revenuecat.purchases:purchases-ui SDK를 이미 추가했다면, Jetpack Compose를 사용하여 페이월 UI를 쉽게 구축할 수 있습니다.
RevenueCat의 UI 라이브러리는 PaywallDialog와 같은 내장 컴포넌트를 제공하여 페이월 화면이나 다이얼로그를 빠르게 표시할 수 있습니다. 이러한 컴포넌트는 완전히 커스터마이즈 가능하며 앱의 디자인에 맞게 모양과 동작을 조정할 수 있는 다양한 구성 옵션을 제공합니다.
다음은 Jetpack Compose를 사용하여 페이월을 구현하고 커스터마이즈하는 것이 얼마나 간단한지 보여주는 예시입니다:
val offering by viewModel.offering.collectAsState()
PaywallDialog(
PaywallDialogOptions.Builder()
.setDismissRequest { }
.setOffering(offering)
.setFontProvider(..)
.setListener(object : PaywallListener {
override fun onPurchaseStarted(rcPackage: Package) {
super.onPurchaseStarted(rcPackage)
}
override fun onPurchaseCompleted(customerInfo: CustomerInfo, storeTransaction: StoreTransaction) {
super.onPurchaseCompleted(customerInfo, storeTransaction)
customer = customerInfo
}
override fun onPurchaseError(error: PurchasesError) {
super.onPurchaseError(error)
}
override fun onPurchaseCancelled() {
super.onPurchaseCancelled()
}
})
.build()
)구성 완료입니다! 이제 사용자가 필요한 Entitlement를 가지고 있지 않을 때마다 Paywall Editor에서 구성한 것과 동일한 디자인으로 페이월을 표시할 수 있습니다.
Codelab: RevenueCat Google Play 연동 (페이월 생성)에서 이미 보셨듯이, 페이월 시스템은 서버 기반 UI로 구축되어 있습니다. 이는 앱 업데이트를 푸시하거나 리뷰 프로세스를 거치지 않고도 대시보드에서 직접 페이월의 콘텐츠와 디자인을 동적으로 업데이트할 수 있다는 것을 의미합니다.
마무리
이 Codelab에서는 RevenueCat의 Android SDK를 연동하고, 인앱 결제를 구현하고, Jetpack Compose에서 페이월을 구축하는 방법을 배웠습니다. 이제 앱을 출시하고 더 많은 수익을 올릴 시간입니다!
아래 리소스를 통해 Android 프로젝트에서 Jetpack Compose와 함께 RevenueCat SDK를 사용하는 방법에 대해 더 자세히 알아볼 수 있습니다:
- GitHub: Cat Paywall Compose
- RevenueCat을 사용한 광고 없는 구독으로 Android 앱 수익화하기
- 앱을 수익으로 전환하기: Jetpack Compose로 Android에서 페이월 구축하기
- 제품 튜토리얼: RevenueCat을 시작하고 최대한 활용하는 데 도움이 되는 비디오 튜토리얼입니다.