Flutter 튜토리얼 63편: Android/iOS 스토어 배포

Flutter 튜토리얼 63편: Android/iOS 스토어 배포#

이번 튜토리얼에서는 Flutter 앱을 Google Play Store와 Apple App Store에 배포하는 전체 과정을 학습합니다. 지난 튜토리얼에서 준비한 코드 난독화와 빌드 플레이버를 기반으로 실제 스토어 배포를 진행해 봅니다.

학습 목표#

  • Google Play Store에 Android 앱 배포하기
  • Apple App Store에 iOS 앱 배포하기
  • 앱 서명 및 인증서 관리 이해하기
  • 스토어 등록 정보 작성하기

1. 스토어 배포 개요#

1.1 왜 스토어 배포가 필요한가?#

이유: 앱 스토어는 사용자가 앱을 안전하게 다운로드할 수 있는 공식 채널입니다. 직접 APK나 IPA를 배포하는 것보다 신뢰성이 높고, 자동 업데이트 및 결제 시스템을 활용할 수 있습니다.

1.2 배포 프로세스 흐름#

flowchart TD A[앱 개발 완료] --> B[릴리스 빌드 생성] B --> C{플랫폼 선택} C -->|Android| D[앱 서명] C -->|iOS| E[프로비저닝 프로파일] D --> F[App Bundle 생성] E --> G[Archive 생성] F --> H[Google Play Console] G --> I[App Store Connect] H --> J[내부 테스트] I --> K[TestFlight] J --> L[프로덕션 출시] K --> L

1.3 플랫폼별 요구사항#

항목AndroidiOS
개발자 계정 비용$25 (1회)$99/년
빌드 형식App Bundle (.aab)App Store Archive (.ipa)
서명 방식Keystore인증서 + 프로비저닝
심사 기간수 시간~수 일1~3일
테스트 배포내부/비공개/공개 테스트TestFlight1

2. Android - Google Play Store 배포#

2.1 왜 App Bundle을 사용하는가?#

이유: App Bundle2은 Google Play에서 기기별로 최적화된 APK를 자동 생성합니다. 앱 크기가 줄어들고 사용자에게 더 나은 다운로드 경험을 제공합니다.

2.2 앱 서명 키 생성#

무엇을: 앱에 디지털 서명을 하기 위한 키를 생성합니다.

Terminal window
# Keystore 생성
keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA \
-keysize 2048 -validity 10000 -alias upload

주의사항:

  • Keystore 파일과 비밀번호는 절대 분실하면 안 됩니다
  • 분실 시 앱 업데이트가 불가능합니다
  • 안전한 장소에 백업을 유지하세요

2.3 앱 서명 설정#

android/key.properties 파일을 생성합니다.

storePassword=<keystore 비밀번호>
keyPassword=<key 비밀번호>
keyAlias=upload
storeFile=<keystore 파일 경로>

android/app/build.gradle.kts에서 서명 설정을 추가합니다.

import java.util.Properties
import java.io.FileInputStream
val keystoreProperties = Properties()
val keystorePropertiesFile = rootProject.file("key.properties")
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}
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
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
}

2.4 App Bundle 빌드#

Terminal window
# App Bundle 생성 (권장)
flutter build appbundle --release
# 난독화와 함께 빌드
flutter build appbundle --obfuscate --split-debug-info=./symbols/android
# 빌드 결과 위치
# build/app/outputs/bundle/release/app-release.aab

2.5 Google Play Console 등록#

어떻게: Google Play Console에서 앱을 등록하고 스토어 정보를 작성합니다.

flowchart LR A[Play Console 로그인] --> B[앱 만들기] B --> C[스토어 등록정보] C --> D[앱 콘텐츠 설정] D --> E[프로덕션 트랙] E --> F[App Bundle 업로드] F --> G[심사 제출]

스토어 등록정보 체크리스트:

항목설명요구사항
앱 이름스토어에 표시될 이름최대 30자
간략한 설명앱 소개 한 줄최대 80자
전체 설명상세 앱 설명최대 4,000자
스크린샷앱 화면 캡처휴대전화 2장 이상
고해상도 아이콘스토어 아이콘512x512 PNG
그래픽 이미지스토어 배너1024x500 PNG

2.6 테스트 트랙 활용#

flowchart TD A[App Bundle] --> B{테스트 트랙} B -->|내부 테스트| C[팀원 100명 이하] B -->|비공개 테스트| D[선택된 테스터] B -->|공개 테스트| E[누구나 참여] C --> F[피드백 수집] D --> F E --> F F --> G[프로덕션 출시]

3. iOS - App Store 배포#

3.1 왜 Apple Developer Program이 필요한가?#

이유: iOS 앱을 App Store에 배포하려면 Apple Developer Program3 멤버십이 필수입니다. 이를 통해 코드 서명 인증서와 프로비저닝 프로파일을 발급받을 수 있습니다.

3.2 Bundle ID 등록#

무엇을: App Store Connect에서 앱을 식별하는 고유 ID를 등록합니다.

  1. Apple Developer 계정의 Identifiers 페이지로 이동
  2. + 버튼을 클릭하여 새 Bundle ID 생성
  3. 앱 이름과 Explicit App ID 입력
  4. 필요한 Capabilities 선택 (Push Notifications, Sign in with Apple 등)
  5. Register 클릭

3.3 Xcode 프로젝트 설정#

Terminal window
# Xcode workspace 열기
open ios/Runner.xcworkspace

확인해야 할 설정들:

설정위치설명
Display NameGeneral > Identity앱 표시 이름
Bundle IdentifierGeneral > Identity등록한 Bundle ID
VersionGeneral > Identity사용자 버전 (예: 1.0.0)
BuildGeneral > Identity빌드 번호 (정수)
TeamSigning & Capabilities개발자 계정 팀
iOS Deployment TargetBuild Settings최소 지원 iOS 버전

3.4 앱 아이콘 및 런치 이미지#

어떻게: Xcode에서 Assets.xcassets의 아이콘과 런치 이미지를 설정합니다.

Terminal window
# Runner 폴더의 Assets.xcassets 열기
ios/Runner/Assets.xcassets/
├── AppIcon.appiconset/ # 앱 아이콘
├── LaunchImage.imageset/ # 런치 이미지
└── Contents.json

iOS 앱 아이콘 요구사항:

용도크기 (pt)@1x@2x@3x
iPhone App60-120x120180x180
iPad App7676x76152x152-
iPad Pro App83.5-167x167-
App Store10241024x1024--

3.5 Archive 생성 및 업로드#

버전 정보 업데이트 (pubspec.yaml):

version: 1.0.0+1
# 형식: <version>+<build-number>
# version: CFBundleShortVersionString (1.0.0)
# build-number: CFBundleVersion (1)

IPA 빌드:

Terminal window
# iOS Archive 및 IPA 생성
flutter build ipa --release
# 난독화와 함께 빌드
flutter build ipa --obfuscate --split-debug-info=./symbols/ios
# 결과 파일 위치
# build/ios/ipa/*.ipa
# build/ios/archive/Runner.xcarchive

3.6 App Store Connect 업로드#

방법 1: Transporter 앱 사용

Terminal window
# Mac App Store에서 Transporter 앱 설치 후
# build/ios/ipa/*.ipa 파일을 드래그 앤 드롭

방법 2: 명령줄 업로드

Terminal window
xcrun altool --upload-app --type ios \
-f build/ios/ipa/*.ipa \
--apiKey your_api_key \
--apiIssuer your_issuer_id

방법 3: Xcode에서 업로드

Terminal window
# Archive 파일 열기
open build/ios/archive/Runner.xcarchive
# Xcode에서:
# 1. Validate App 버튼 클릭
# 2. 문제 없으면 Distribute App 클릭
# 3. App Store Connect 선택

3.7 App Store Connect 설정#

flowchart TD A[App Store Connect] --> B[앱 정보] B --> C[가격 및 사용 가능 여부] B --> D[앱 프라이버시] B --> E[앱 스토어 정보] E --> F[스크린샷] E --> G[앱 미리보기] E --> H[설명] E --> I[키워드] B --> J[심사 정보] J --> K[심사 제출]

필수 입력 정보:

항목설명
앱 이름App Store에 표시될 이름
부제앱 이름 아래 표시되는 짧은 설명
프로모션 텍스트언제든 변경 가능한 홍보 문구
설명앱 상세 설명
키워드검색용 키워드 (쉼표로 구분)
지원 URL고객 지원 웹사이트
마케팅 URL앱 홍보 웹사이트 (선택)

3.8 TestFlight 배포#

왜 TestFlight를 사용하는가?

  • App Store 출시 전 베타 테스트 가능
  • 내부 테스터: 팀원 최대 100명
  • 외부 테스터: 최대 10,000명
  • 간편한 피드백 수집
sequenceDiagram participant D as 개발자 participant A as App Store Connect participant T as TestFlight participant U as 테스터 D->>A: IPA 업로드 A->>A: 자동 처리 (30분~1시간) A->>D: 빌드 준비 완료 알림 D->>T: 테스터 그룹에 빌드 추가 T->>U: 테스트 초대 U->>T: 앱 설치 및 테스트 U->>D: 피드백 전송

4. 버전 관리 전략#

4.1 시맨틱 버저닝#

무엇을: 버전 번호를 의미있게 관리하는 방법입니다.

MAJOR.MINOR.PATCH+BUILD
│ │ │ │
│ │ │ └── 빌드 번호 (내부 추적용)
│ │ └── 버그 수정
│ └── 새 기능 추가 (하위 호환)
└── 주요 변경 (하위 호환 X)

예시:

  • 1.0.0+1 → 첫 출시
  • 1.0.1+2 → 버그 수정
  • 1.1.0+3 → 새 기능 추가
  • 2.0.0+4 → 대규모 변경

4.2 빌드 번호 자동화#

Terminal window
# 빌드 번호를 날짜 기반으로 생성
flutter build apk --build-number=$(date +%Y%m%d%H)
# 또는 pubspec.yaml의 버전 사용
flutter build apk --build-name=1.2.0 --build-number=42

5. 배포 체크리스트#

5.1 출시 전 체크리스트#

flowchart TD A[출시 전 체크리스트] --> B[기능 테스트] A --> C[성능 최적화] A --> D[보안 검토] A --> E[법적 요구사항] B --> B1[모든 기능 동작 확인] B --> B2[다양한 기기 테스트] B --> B3[오프라인 동작 확인] C --> C1[앱 크기 최적화] C --> C2[메모리 사용량 확인] C --> C3[배터리 소모 테스트] D --> D1[API 키 보호] D --> D2[민감 정보 제거] D --> D3[난독화 적용] E --> E1[개인정보 처리방침] E --> E2[이용약관] E --> E3[저작권 확인]

5.2 플랫폼별 심사 가이드라인#

항목Google PlayApp Store
가이드라인개발자 프로그램 정책App Review Guidelines
주요 거부 사유권한 남용, 허위 광고버그, 불완전한 앱, 가이드라인 위반
심사 기간수 시간~수 일평균 24시간 (최대 48시간)
이의 제기가능가능

5.3 앱 업데이트 전략#

flowchart LR A[버그 발견] --> B{심각도} B -->|높음| C[핫픽스 배포] B -->|중간| D[다음 정기 업데이트] B -->|낮음| E[백로그 추가] C --> F[긴급 심사 요청] D --> G[정기 출시 일정] E --> H[우선순위 재검토]

6. Codemagic CLI 도구 활용#

6.1 왜 CLI 도구를 사용하는가?#

이유: CI/CD 파이프라인에서 자동화된 빌드와 배포가 가능합니다. 수동 작업을 줄이고 일관된 빌드 환경을 유지할 수 있습니다.

6.2 iOS 배포 자동화#

Terminal window
# Codemagic CLI 도구 설치
pip3 install codemagic-cli-tools
# App Store Connect API 키 설정
export APP_STORE_CONNECT_ISSUER_ID=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
export APP_STORE_CONNECT_KEY_IDENTIFIER=ABC1234567
export APP_STORE_CONNECT_PRIVATE_KEY=`cat /path/to/AuthKey.p8`
# 임시 키체인 설정
keychain initialize
# 코드 서명 파일 가져오기
app-store-connect fetch-signing-files $(xcode-project detect-bundle-id) \
--platform IOS \
--type IOS_APP_STORE \
--certificate-key=@file:/path/to/cert_key \
--create
# 인증서 추가
keychain add-certificates
# Xcode 프로젝트 설정 업데이트
xcode-project use-profiles
# Flutter 빌드
flutter build ipa --release \
--export-options-plist=$HOME/export_options.plist
# App Store Connect 업로드
app-store-connect publish \
--path $(find $(pwd) -name "*.ipa")
# 키체인 복원 (중요!)
keychain use-login

7. 문제 해결#

7.1 Android 일반적인 문제#

문제원인해결 방법
서명 오류Keystore 불일치key.properties 확인
업로드 실패버전 코드 중복빌드 번호 증가
앱 크기 초과150MB 이상Asset 최적화, Play Feature Delivery 사용
64비트 오류arm64-v8a 누락flutter build appbundle로 해결

7.2 iOS 일반적인 문제#

문제원인해결 방법
프로비저닝 오류프로파일 만료Xcode에서 새로 발급
아이콘 누락필수 크기 미포함모든 크기 아이콘 추가
빌드 번호 오류이전과 같은 번호빌드 번호 증가
심사 거부가이드라인 위반거부 사유 확인 후 수정

7.3 심사 거부 대응#

flowchart TD A[심사 거부 알림] --> B[거부 사유 확인] B --> C{사유 유형} C -->|기술적 문제| D[버그 수정] C -->|정책 위반| E[정책 검토 및 수정] C -->|정보 부족| F[추가 정보 제공] D --> G[재빌드 및 업로드] E --> G F --> H[심사 팀에 응답] G --> I[재심사 요청] H --> I

정리#

이번 튜토리얼에서 배운 핵심 내용입니다:

항목AndroidiOS
빌드 명령flutter build appbundleflutter build ipa
서명 방식Keystore + key.properties인증서 + 프로비저닝
배포 콘솔Google Play ConsoleApp Store Connect
테스트 배포내부/비공개/공개 트랙TestFlight
개발자 계정$25 (1회)$99/년

배포 핵심 포인트:

  1. 서명 키/인증서는 절대 분실하지 않도록 백업
  2. 버전 번호는 항상 증가해야 함
  3. 테스트 트랙을 활용한 단계적 출시 권장
  4. 스토어 가이드라인을 미리 숙지

다음 튜토리얼에서는 Desktop과 Web 플랫폼에 앱을 배포하는 방법을 학습하겠습니다.

참고 자료#

Footnotes#

  1. TestFlight: Apple에서 제공하는 베타 테스트 플랫폼으로, 내부 테스터(최대 100명)와 외부 테스터(최대 10,000명)에게 앱을 배포할 수 있습니다.

  2. App Bundle: Google에서 권장하는 앱 배포 형식으로, .aab 확장자를 가지며 Google Play에서 기기 구성에 맞는 최적화된 APK를 동적으로 생성합니다.

  3. Apple Developer Program: Apple의 공식 개발자 프로그램으로, 연간 $99의 비용이 발생하며 App Store 배포, TestFlight 베타 테스트, 고급 앱 기능 사용이 가능합니다.

공유

이 글이 도움이 되었다면 다른 사람과 공유해주세요!

Flutter 튜토리얼 63편: Android/iOS 스토어 배포
https://moodturnpost.net/posts/flutter/flutter-deployment-mobile/
작성자
Moodturn
게시일
2026-01-08
Moodturn

목차