안녕하세요 다음 글은 claude-code 가 작성한 블로그 글입니다. 오전에 만든 앱을 테스트 하기 위해 준비하는 과정을 정리해서 공유해 드립니다.
너무 오래 전에 어플을 테스트 및 등록 해 보고, 너무 오랜만에 작업하는 것이여서, 개발자 콘솔 환경도 많이 바뀌었고, 없던 기능들도 많아져서, 진행하는데에 막힘이 많았습니다. 하지만 ai 가 잘 가이드를 해줘서 내부테스트 패키지가 무사히 잘 등록이 되었습니다.

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. 내부 테스트 트랙 생성
- Google Play Console 접속
- 앱 선택: RentHouse
- 테스트 > 내부 테스트(Internal testing)
- 새 버전 만들기 클릭
4.2. AAB 업로드
- Android App Bundle 업로드
- 파일:
build/app/outputs/bundle/release/app-release.aab - 드래그 앤 드롭
- 파일:
- 출시명 입력: "구독테스트버전" (개발자만 보임)
- 출시 노트 작성:
- RevenueCat 구독 기능 연동 - Firestore 구독 동기화 - Target SDK 35 업데이트 - 검토 → 저장 및 출시
4.3. 테스터 추가
중요! 테스터를 추가하지 않으면 아무도 다운로드할 수 없습니다.
- 테스터 탭 클릭
- 이메일 목록 만들기
- 목록 이름: "Internal Testers"
- 이메일 추가: 본인 Gmail 주소
- 저장
- 트랙에 추가 (내부 테스트 트랙 선택)
4.4. 라이선스 테스터 추가 (구독 테스트용)
구독 기능을 무료로 테스트하려면 라이선스 테스터 등록 필수!
- 설정 > 라이선스 테스트
- 라이선스 테스터 섹션
- 이메일 추가: 본인 Gmail
- 라이선스 응답:
LICENSED선택 - 저장
효과:
- ✅ 구독 구매 시 실제 결제 없음
- ✅ RevenueCat 구독 플로우 전체 테스트 가능
📲 5단계: 테스트 앱 설치
5.1. 테스트 링크 받기
- 내부 테스트 페이지
- 테스트 방법 섹션
- 공유 가능한 링크 복사
- 예:
https://play.google.com/apps/internaltest/xxxxxxxx
- 예:
5.2. Android 기기에서 설치
- 테스트 링크를 모바일 브라우저에서 열기
- 테스터가 되기 버튼 클릭
- Google Play에서 다운로드 클릭
- 앱 설치
⚠️ 주의: 테스터로 등록한 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)는 절대 앱에 포함 금지
다음 단계
- Google Play Console > 제품 > 구독
- 구독 상품 등록:
premium_monthly: 월간 ₩5,000premium_yearly: 연간 ₩50,000
- RevenueCat Dashboard > Products
- Google Play 구독 상품 가져오기
- Entitlement 생성:
premium - 모바일 기기에서 구독 구매 테스트
- 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 내부 테스트 트랙
- ✅ 테스터 지정 완료
- ✅ 라이선스 테스터 등록 완료
- ✅ 테스트 링크 발급 완료
💡 배운 점
- 인증서 유효기간은 충분히 길게
- 최소 25년 이상 (Google Play 요구사항)
- 권장: 27년 (10,000일)
- 버전 코드는 항상 증가
- 한 번 사용한 코드는 재사용 불가
- 삭제한 릴리즈도 마찬가지
- Target SDK는 최신으로
- 2025년 11월 기준: SDK 35 이상 필요
- Google Play 요구사항은 계속 업데이트됨
- 테스터 설정 필수
- 내부 테스트도 테스터 지정 필요
- 라이선스 테스터는 구독 테스트용 별도 설정
- AAB vs APK
- Play Console 업로드: AAB 권장
- 직접 설치 테스트: APK
- RevenueCat 테스트: Play Console 필수 (AAB)
📚 참고 자료
🔗 관련 문서
'초짜 IT보이 서바이벌 스토리 > AI - Vibe-Coding' 카테고리의 다른 글
| #Spec #Driven #Development 란? ( #명세기반개발 ) (0) | 2025.12.22 |
|---|---|
| 02. #바이브코딩 으로 앱 만들기 - 실제 코딩 진행 (1) | 2025.11.04 |
| 01. #바이브코딩 으로 앱 만들기 - 과연 가능할까? (0) | 2025.10.30 |
| #UniRent - #스마트 한 #임대 #관리 #솔루션 소개 (0) | 2025.10.02 |