반응형

안녕하세요 다음 글은 claude-code 가 작성한 블로그 글입니다. 오전에 만든 앱을 테스트 하기 위해 준비하는 과정을 정리해서 공유해 드립니다. 

너무 오래 전에 어플을 테스트 및 등록 해 보고, 너무 오랜만에 작업하는 것이여서, 개발자 콘솔 환경도 많이 바뀌었고, 없던 기능들도 많아져서, 진행하는데에 막힘이 많았습니다. 하지만 ai 가 잘 가이드를 해줘서 내부테스트 패키지가 무사히 잘 등록이 되었습니다. 

google play 내 - 내부테스트 링크

 

Flutter 앱 Google Play 내부 테스트 배포 완벽 가이드

작성일: 2025-11-10
프로젝트: RentHouse (가재 Flutter 임대관리 앱)
목표: RevenueCat 구독 기능 테스트를 위한 Google Play Console 내부 테스트 배포


📌 시작하기 전에

이 글은 Flutter 앱을 Google Play Console의 내부 테스트(Internal Testing) 트랙에 처음 배포하면서 겪은 실제 문제들과 해결 과정을 기록한 것입니다. 특히 RevenueCat 구독 기능을 테스트하기 위해서는 반드시 Play Console을 통해야 하므로, 이 과정이 필수입니다.

내부 테스트 vs 프로덕션

구분 내부 테스트 프로덕션
심사 ❌ 없음 (즉시 배포) ✅ 있음 (3-7일)
테스터 수 최대 100명 무제한
공개 범위 지정된 테스터만 전체 사용자
취소/수정 ✅ 언제든지 가능 ⚠️ 어려움
RevenueCat 테스트 ✅ 가능 ✅ 가능

🔐 1단계: Android 앱 서명 설정

Google Play에 앱을 업로드하려면 Release 서명이 필수입니다.

1.1. Keystore 생성

cd renthouse

keytool -genkey -v -keystore upload-keystore.jks \
  -keyalg RSA -keysize 2048 -validity 10000 -alias upload \
  -storepass YOUR_PASSWORD -keypass YOUR_PASSWORD \
  -dname "CN=Your Name, OU=Development, O=Company, L=City, ST=State, C=KR"

중요 포인트:

  • validity 10000: 27년 유효 (Google Play 요구: 최소 25년)
  • ⚠️ 처음에 3개월로 설정했다가 오류 발생!
    오류: 너무 일찍 만료되는 인증서로 서명한 APK

 

1.2. key.properties 생성

android/key.properties 파일 생성:

storePassword=YOUR_PASSWORD
keyPassword=YOUR_PASSWORD
keyAlias=upload
storeFile=../upload-keystore.jks

 

1.3. build.gradle.kts 수정

android/app/build.gradle.kts:

import java.util.Properties
import java.io.FileInputStream

// Keystore 속성 로드
val keystorePropertiesFile = rootProject.file("key.properties")
val keystoreProperties = Properties()
if (keystorePropertiesFile.exists()) {
    keystorePropertiesFile.inputStream().use { keystoreProperties.load(it) }
}

android {
    // ... 기존 설정

    signingConfigs {
        create("release") {
            keyAlias = keystoreProperties["keyAlias"] as String
            keyPassword = keystoreProperties["keyPassword"] as String
            storeFile = file(keystoreProperties["storeFile"] as String)
            storePassword = keystoreProperties["storePassword"] as String
        }
    }

    buildTypes {
        release {
            signingConfig = signingConfigs.getByName("release")
            isMinifyEnabled = true
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
}

 

1.4. .gitignore 업데이트

절대 커밋하면 안 되는 파일들:

# Android signing keys (NEVER commit these!)
*.jks
*.keystore
/android/key.properties
upload-keystore.jks

 

📱 2단계: Target SDK 업데이트

Google Play는 Target SDK 35 이상을 요구합니다 (2025년 11월 기준).

2.1. build.gradle.kts 수정

android/app/build.gradle.kts:

android {
    defaultConfig {
        applicationId = "com.a88888.renthouse"
        minSdk = flutter.minSdkVersion
        targetSdk = 35  // 34 → 35로 변경 ✅
        versionCode = flutter.versionCode
        versionName = flutter.versionName
    }
}

발생했던 오류:

현재 앱이 34의 API 수준을 타겟팅하고 있지만,
API 수준 35 이상을 타겟팅해야 합니다.

 

📦 3단계: App Bundle (AAB) 빌드

3.1. 버전 코드 증가

pubspec.yaml:

version: 0.7.0+3
         ^^^^^  ^
         |      └─ versionCode (Play Console에서 고유해야 함)
         └──────── versionName (사용자가 보는 버전)

문제 발생:

버전 코드 2는 이미 사용되었습니다.
다른 버전 코드를 사용해 보세요.

해결:

  • 이전: 0.7.0+2
  • 수정: 0.7.0+3

 

3.2. App Bundle 빌드

cd renthouse

# Clean build (선택사항)
flutter clean

# AAB 빌드
flutter build appbundle

결과:

✓ Built build/app/outputs/bundle/release/app-release.aab (62MB)

Warning 무시 가능:

Release app bundle failed to strip debug symbols from native libraries.

→ 앱 기능에는 영향 없음, 프로덕션 배포 전에 해결 권장


 

🚀 4단계: Google Play Console 설정

4.1. 내부 테스트 트랙 생성

  1. Google Play Console 접속
  2. 앱 선택: RentHouse
  3. 테스트 > 내부 테스트(Internal testing)
  4. 새 버전 만들기 클릭

 

4.2. AAB 업로드

  1. Android App Bundle 업로드
    • 파일: build/app/outputs/bundle/release/app-release.aab
    • 드래그 앤 드롭
  2. 출시명 입력: "구독테스트버전" (개발자만 보임)
  3. 출시 노트 작성:
    - RevenueCat 구독 기능 연동
    - Firestore 구독 동기화
    - Target SDK 35 업데이트
  4. 검토저장 및 출시

 

4.3. 테스터 추가

중요! 테스터를 추가하지 않으면 아무도 다운로드할 수 없습니다.

  1. 테스터 탭 클릭
  2. 이메일 목록 만들기
  3. 목록 이름: "Internal Testers"
  4. 이메일 추가: 본인 Gmail 주소
  5. 저장
  6. 트랙에 추가 (내부 테스트 트랙 선택)

 

4.4. 라이선스 테스터 추가 (구독 테스트용)

구독 기능을 무료로 테스트하려면 라이선스 테스터 등록 필수!

  1. 설정 > 라이선스 테스트
  2. 라이선스 테스터 섹션
  3. 이메일 추가: 본인 Gmail
  4. 라이선스 응답: LICENSED 선택
  5. 저장

효과:

  • ✅ 구독 구매 시 실제 결제 없음
  • ✅ RevenueCat 구독 플로우 전체 테스트 가능

 

📲 5단계: 테스트 앱 설치

5.1. 테스트 링크 받기

  1. 내부 테스트 페이지
  2. 테스트 방법 섹션
  3. 공유 가능한 링크 복사
    • 예: https://play.google.com/apps/internaltest/xxxxxxxx

 

5.2. Android 기기에서 설치

  1. 테스트 링크를 모바일 브라우저에서 열기
  2. 테스터가 되기 버튼 클릭
  3. Google Play에서 다운로드 클릭
  4. 앱 설치

⚠️ 주의: 테스터로 등록한 Gmail 계정으로 로그인된 기기여야 함!


 

🐛 트러블슈팅: 발생한 문제들

문제 1: 디버그 모드로 서명

오류:

디버그 모드로 서명한 APK 또는 Android App Bundle을 업로드했습니다.

원인:

  • build.gradle.kts에서 signingConfig = debug 사용

해결:

  • Release 서명 설정 (위 1단계 참고)

 

문제 2: 인증서 유효기간 부족

오류:

너무 일찍 만료되는 인증서로 서명한 APK

원인:

  • Keystore 생성 시 validity 값이 너무 작음 (3개월)

해결:

# 27년 유효 인증서 생성
keytool -genkey -v -keystore upload-keystore.jks \
  -validity 10000 ...  # 10,000일 = 27.4년

확인:

keytool -list -v -keystore upload-keystore.jks -storepass YOUR_PASSWORD
# Valid from: 2025-11-10
# Valid until: 2053-03-28 ✅

 

문제 3: Target SDK 34

오류:

현재 앱이 34의 API 수준을 타겟팅하고 있지만,
API 수준 35 이상을 타겟팅해야 합니다.

해결:

// android/app/build.gradle.kts
targetSdk = 35  // 34 → 35

 

문제 4: 버전 코드 중복

오류:

버전 코드 2는 이미 사용되었습니다.

원인:

  • 이전에 업로드한 AAB와 동일한 versionCode

해결:

# pubspec.yaml
version: 0.7.0+3  # +2 → +3으로 증가

참고:

  • 한 번 사용한 버전 코드는 재사용 불가
  • 삭제한 릴리즈의 버전 코드도 재사용 불가

 

문제 5: 테스터 미지정

경고:

아직 테스터가 지정되지 않았기 때문에
어떤 사용자도 이 버전을 이용할 수 없습니다.

해결:

  • 위 4.3단계: 테스터 이메일 목록 생성 및 추가

 

📊 RevenueCat 구독 테스트 준비

내부 테스트 배포가 완료되면 RevenueCat 구독 기능을 테스트할 수 있습니다.

RevenueCat API Key 확인

lib/core/services/revenuecat_service.dart:

const apiKey = 'goog_KWVteD89709876789858765WFgLQCM';

확인 사항:

  • ✅ API Key 형식: goog_xxxxx (Android)
  • ✅ RevenueCat Dashboard에서 발급받은 Public Key
  • ❌ Secret Key (sk_xxxxx)는 절대 앱에 포함 금지

다음 단계

  1. Google Play Console > 제품 > 구독
  2. 구독 상품 등록:
    • premium_monthly: 월간 ₩5,000
    • premium_yearly: 연간 ₩50,000
  3. RevenueCat Dashboard > Products
    • Google Play 구독 상품 가져오기
  4. Entitlement 생성: premium
  5. 모바일 기기에서 구독 구매 테스트
  6. Firestore에서 구독 정보 동기화 확인

✅ 체크리스트

빌드 준비

  • Keystore 생성 (27년 유효)
  • key.properties 설정
  • build.gradle.kts 서명 설정
  • .gitignore에 keystore 추가
  • Target SDK 35 설정
  • pubspec.yaml 버전 코드 증가

Play Console 설정

  • 내부 테스트 트랙 생성
  • AAB 업로드 (62MB)
  • 출시 노트 작성
  • 테스터 이메일 목록 생성
  • 라이선스 테스터 추가
  • 저장 및 출시

RevenueCat 준비

  • API Key 설정 확인
  • Firestore 구독 동기화 코드 구현
  • Google Play 구독 상품 등록 (다음 단계)
  • RevenueCat Products 가져오기 (다음 단계)
  • 구독 테스트 (다음 단계)

🎯 결과

최종 빌드 정보:

파일: app-release.aab
크기: 62MB
버전: 0.7.0+3
Target SDK: 35
인증서 유효기간: 2025-11-10 ~ 2053-03-28
상태: ✅ 내부 테스트 배포 완료

배포 상태:

  • ✅ Google Play Console 내부 테스트 트랙
  • ✅ 테스터 지정 완료
  • ✅ 라이선스 테스터 등록 완료
  • ✅ 테스트 링크 발급 완료

💡 배운 점

  1. 인증서 유효기간은 충분히 길게
    • 최소 25년 이상 (Google Play 요구사항)
    • 권장: 27년 (10,000일)
  2. 버전 코드는 항상 증가
    • 한 번 사용한 코드는 재사용 불가
    • 삭제한 릴리즈도 마찬가지
  3. Target SDK는 최신으로
    • 2025년 11월 기준: SDK 35 이상 필요
    • Google Play 요구사항은 계속 업데이트됨
  4. 테스터 설정 필수
    • 내부 테스트도 테스터 지정 필요
    • 라이선스 테스터는 구독 테스트용 별도 설정
  5. AAB vs APK
    • Play Console 업로드: AAB 권장
    • 직접 설치 테스트: APK
    • RevenueCat 테스트: Play Console 필수 (AAB)

📚 참고 자료


🔗 관련 문서

 

반응형

+ Recent posts