일반 디버깅 팁

0:04:00

특정 오류 메시지뿐만 아니라 다음과 같은 일반 디버깅 기법을 활용하면 문제를 더 빠르게 진단하고 해결할 수 있습니다.

1. RevenueCat 대시보드 활용하기

대시보드는 가장 먼저 사용하는 디버깅 도구입니다. 구성과 사용자 활동에 관한 실시간 데이터를 보여 줍니다.

고객 이력

  1. RevenueCat 대시보드로 이동합니다.
  2. Customer lists로 이동합니다.
  3. 다음 항목으로 사용자를 검색합니다.
    • App User ID.
    • 이메일(설정한 경우).
    • 거래 ID.
  4. 해당 사용자의 전체 구매 이력, 활성 Entitlement, 구독 상태를 확인합니다.

이를 통해 다음을 확인할 수 있습니다.

  • 구매가 실제로 처리되었는가?
  • 사용자가 어떤 Entitlement를 보유하고 있는가?
  • 구독이 언제 만료되었는가?
  • 실패한 거래가 있는가?

구성 검증

대시보드는 구성 문제에 대한 경고를 보여 줍니다.

  • 서비스 자격 증명 누락.
  • 스토어에서 상품을 찾을 수 없음.
  • 패키지가 없는 Offering.
  • 게시되지 않은 페이월.

2. 샌드박스와 프로덕션에서 테스트하기

환경별 문제를 잡아내려면 항상 두 환경 모두에서 테스트해야 합니다.

샌드박스 테스트(iOS)

장점

  • 실제 결제가 발생하지 않습니다.
  • 구독 갱신이 더 빠릅니다(5분 = 1개월).
  • 구독 수명 주기를 손쉽게 테스트할 수 있습니다.

단점

  • 샌드박스 계정 설정이 필요합니다.
  • 가끔 불안정하거나 느립니다.
  • 프로덕션과 동작이 다릅니다.

프로덕션 테스트

iOS의 경우: 샌드박스 계정으로 TestFlight를 사용하거나 별도의 "테스트용" 빌드를 만듭니다

Android의 경우: 라이선스 테스터와 함께 내부 테스트 트랙을 사용합니다

프로덕션에서 테스트해야 하는 시점

  • 주요 출시 전.
  • 구성을 크게 변경한 후.
  • 전체 엔드 투 엔드 흐름을 검증할 때.

3. 더 빠른 테스트를 위해 Test Store 사용하기

RevenueCat Test Store는 샌드박스에서 겪는 여러 골칫거리를 없애 줍니다.

  • 실제 스토어 의존성 없음: App Store Connect나 Google Play 없이도 동작합니다.
  • 예측 가능한 결과: 구매의 성공/실패 여부를 직접 제어할 수 있습니다.
  • 시뮬레이터/에뮬레이터에서 동작: 실기기가 필요 없습니다.
  • CI/CD 친화적: 자동화된 테스트에 안성맞춤입니다.

자세한 내용은 다음을 참고하세요.

4. 이상 동작이 발생하면 캐시 비우기

캐시된 데이터가 이상한 동작을 일으킬 때가 있습니다.

RevenueCat 고객 정보 캐시 비우기

iOS:

swift
// SDK가 최신 데이터를 가져오도록 강제
Purchases.shared.invalidateCustomerInfoCache()

Android:

kotlin
// SDK가 최신 데이터를 가져오도록 강제
Purchases.sharedInstance.invalidateCustomerInfoCache()

기기/앱 캐시 비우기

iOS:

  1. 앱을 삭제합니다.
  2. 기기를 재시작합니다.
  3. 앱을 다시 설치합니다.

Android:

  1. 설정 → 앱으로 이동합니다.
  2. 대상 앱을 찾습니다.
  3. 저장공간 → 캐시 삭제를 탭합니다.
  4. Google Play 스토어 캐시도 함께 비웁니다.

5. RevenueCat 커뮤니티 확인하기

같은 문제를 이미 겪은 사람이 있을 가능성이 높습니다.

6. 프록시를 활용한 네트워크 디버깅

Charles Proxy나 유사한 도구로 네트워크 트래픽을 검사할 수 있습니다.

확인해야 할 항목

  • api.revenuecat.com으로 향하는 API 요청.
  • HTTP 상태 코드(200 = 성공, 401 = 인증 문제 등).
  • 요청/응답 페이로드.
  • 요청 소요 시간(느린 요청은 네트워크 문제를 시사합니다).

Charles Proxy 설정하기

  1. Charles Proxy를 다운로드합니다.
  2. 기기가 Charles를 프록시로 사용하도록 설정합니다.
  3. 기기에 Charles 인증서를 설치합니다.
  4. 앱을 실행하고 요청을 살펴봅니다.
참고: 네트워크 검사는 고급 기법이며 보통 복잡한 문제에만 필요합니다. 먼저 SDK 로그부터 확인하세요.

7. 문제 범위 좁히기

디버깅할 때는 무엇이 문제를 일으키는지 범위를 좁혀 보세요.

최소 테스트 케이스 만들기

swift
// SDK 초기화만 테스트
Purchases.logLevel = .debug
Purchases.configure(withAPIKey: "appl_xxx")
print("SDK initialized")

// Offering 가져오기만 테스트
Task {
    do {
        let offerings = try await Purchases.shared.offerings()
        print("Offerings fetched: \(offerings.all.count)")
    } catch {
        print("Error: \(error)")
    }
}

이를 통해 문제가 다음 중 어디에 있는지 판단할 수 있습니다.

  • SDK 초기화.
  • 네트워크/API 접근.
  • 상품 구성.
  • 앱의 UI/로직.

8. 샘플 앱과 비교하기

RevenueCat은 정상 동작이 확인된 공식 샘플 앱을 제공합니다.

샘플 앱을 클론한 다음 아래 단계를 진행하세요.

  1. API 키를 본인 것으로 교체합니다.
  2. 본인 구성으로도 정상 동작하는지 확인합니다.
  3. 본인 구현을 샘플 코드와 비교합니다.

자주 발생하는 디버깅 시나리오 빠른 참조

시나리오유력한 근본 원인권장 접근법
샌드박스에서는 모두 동작하지만 프로덕션에서는 동작하지 않음 상품 또는 계약이 프로덕션용으로 완료되지 않았습니다. 모든 상품이 승인(iOS)되었거나 활성(Android) 상태인지 확인합니다. 유료 애플리케이션 계약이 활성 상태인지 점검합니다. 올바른(샌드박스가 아닌) API 키를 사용하고 있는지 확인합니다. RevenueCat 대시보드에서 구성 경고를 확인합니다.
구매가 한 번은 동작하지만 재설치 후 실패함 설치 간에 App User ID가 바뀌어 새로운 익명 사용자가 생성됩니다. 안정적인 사용자 ID(예: 인증 시스템에서 발급한 ID)와 함께 Purchases.logIn()을 사용해 설치 간에 신원을 유지합니다. 또는 재설치 후 restorePurchases()를 호출해 스토어 계정을 연결합니다.
대시보드에서는 Entitlement가 부여되었으나 SDK에서는 비활성으로 표시됨 SDK 캐시가 아직 최신 서버 데이터로 갱신되지 않았습니다. Purchases.shared.invalidateCustomerInfoCache()를 호출한 뒤 고객 정보를 다시 가져옵니다. SDK는 고객 정보를 5분간 캐시합니다. 새로 부여된 Entitlement의 경우 캐시 비우기가 필요합니다. 커뮤니티 논의를 참고하세요.
사용자에게 활성 구독은 있으나 Entitlement가 없음 RevenueCat에서 상품이 Entitlement에 연결되어 있지 않습니다. RevenueCat 대시보드 → Product Catalog → Entitlements에서 상품이 올바른 Entitlement에 연결되어 있는지 확인합니다. 각 상품은 명시적으로 연결해야 합니다. 거래 세부 정보는 대시보드의 고객 페이지에서 확인합니다.
동일 인물에게 여러 사용자 계정이 생김 로그인 전에 익명 ID가 생성되었거나 서로 다른 앱 사용자 ID가 사용되었습니다. 앱 수명 주기에서 가능한 한 이른 시점에 Purchases.logIn()을 사용합니다. RevenueCat은 익명 사용자와 식별된 사용자 간에 구매를 이전할 수 있습니다. 사용자 식별 문서를 확인하세요.
Android에서 구매 복원이 동작하지 않음 구매자와 다른 Google 계정으로 앱이 설치되었습니다. 사용자는 원래 구매를 진행한 Google 계정으로 로그인해야 합니다. 기기에 여러 계정이 있는 경우, 기본 계정(앱을 설치하는 데 사용한 계정)이 구매자여야 합니다. 커뮤니티 논의를 참고하세요.
로컬에서는 동작하지만 CI/CD에서는 실패함 CI 환경에 스토어 구성이나 네트워크 접근이 없습니다. CI/CD 파이프라인에는 RevenueCat Test Store를 사용합니다. Test Store는 실제 스토어 자격 증명이 필요 없고, 에뮬레이터에서 동작하며, 예측 가능한 결과를 제공합니다. Test Store 코드랩을 참고하세요.
웹훅 이벤트가 도착하지 않음 서버 알림 URL이 구성되지 않았거나 도달할 수 없습니다. RevenueCat 대시보드 → Integrations → Webhooks에서 URL이 올바른지, 서버가 외부에서 접근 가능한지 확인합니다. 들어오는 요청이 있는지 서버 로그를 점검합니다. 먼저 webhook.site 같은 도구로 테스트해 봅니다.
대시보드에 매출이 $0으로 표시됨 모든 구매가 샌드박스/테스트 환경에서 발생했습니다. 샌드박스 구매는 실제 매출을 발생시키지 않습니다. 대시보드는 환경별로 필터링합니다. 테스트 구매 데이터를 보려면 대시보드 보기를 "Sandbox"로 전환합니다. 프로덕션 매출은 실제 스토어 구매가 발생한 후에만 나타납니다.
Purchases.configure() 호출 시 앱이 크래시함 잘못된 스레드에서 SDK를 초기화했거나 구성을 중복으로 호출했습니다. Purchases.configure()메인 스레드에서 한 번만 호출합니다. iOS에서는 AppDelegate.application(_:didFinishLaunchingWithOptions:)를 사용합니다. Android에서는 Application.onCreate()를 사용합니다. 백그라운드 스레드에서는 절대 구성하지 마세요.
계정 간 소유권 이전 사용자가 구독을 다른 계정으로 옮기려고 합니다. RevenueCat은 이전 동작 설정을 지원합니다. 대시보드 → Project Settings → General에서 Transfer Behavior를 구성해 사용자 계정 간에 구매가 이전되는 방식을 제어합니다. 이전 동작 문서를 참고하세요.
플랫폼마다 Offering이 다르게 표시됨 패키지에 연결된 상품이 플랫폼별로 다릅니다. Offering의 각 패키지는 iOS와 Android 상품을 별도로 가질 수 있습니다. Offering 편집기에서 각 패키지에 두 플랫폼 상품이 모두 연결되어 있는지 확인합니다. iOS 상품만 있는 패키지는 Android에서 비어 있는 것으로 표시됩니다.
"Invalid Play Store credentials" 오류가 72시간이 지나도 지속됨 최초 설정 이후 서비스 계정 권한이 변경되었거나 불완전합니다. Play Console → Users and Permissions에서 서비스 계정에 Financial Data, Manage Orders, Monetization 권한이 있는지 다시 확인합니다. JSON 자격 증명 파일을 다시 다운로드해 업로드합니다. 전체 세부 정보를 확인하려면 오류 객체 전체를 로깅합니다. 커뮤니티 논의를 참고하세요.
대시보드에 "Credentials need attention"이 표시됨 Google이 자격 증명을 전파하는 데 최대 36시간이 걸립니다. 자격 증명을 생성한 후 최소 36~48시간 기다립니다. Google Cloud Console의 IAM & Admin에 서비스 계정 이메일이 나타나는지 확인합니다. 전파가 진행되는 동안 반복해서 다시 업로드하지 마세요. 커뮤니티 논의를 참고하세요.
대시보드에 "Credentials validation" 오류가 발생함 Shared Secret, IAP Key, 또는 JSON 자격 증명 파일이 유효하지 않습니다. App Store의 경우: Shared Secret을 다시 생성하거나 IAP Key를 다시 다운로드합니다. App Store Connect에서 Key ID와 Issuer ID를 다시 확인합니다. Play Store의 경우: 서비스 계정 JSON 키 파일을 다시 생성합니다. 커뮤니티 논의를 참고하세요.

디버깅 체크리스트

도움을 요청하기 전에 다음 단계를 모두 마쳤는지 확인하세요.

  • 디버그 로깅을 활성화했는가(Purchases.logLevel = .debug).
  • RevenueCat 대시보드에서 구성 경고를 확인했는가.
  • 대시보드에서 고객을 확인했는가(해당하는 경우).
  • 스토어와 RevenueCat 간에 상품 ID가 일치하는지 확인했는가.
  • 플랫폼에 맞는 올바른 API 키인지 확인했는가.
  • 샌드박스와 프로덕션 양쪽에서 테스트했는가(가능한 경우).
  • 캐시를 비우고 앱을 재시작했는가.
  • 커뮤니티 포럼에서 비슷한 문제를 검색했는가.
  • 문제를 분리하기 위해 최소 테스트 케이스를 만들었는가.
  • 공식 문서를 확인했는가.