๋ฆด๋ฆฌ์ค ๋น๋์ Play ์คํ ์ด ๋ฐฐํฌ: ์๋ช ํค๋ถํฐ AAB๊น์ง
์ฑ์ ๋ค ๋ง๋ค์๋ค๊ณ ๋์ด ์๋๋ค. ์ง๊ธ๊น์ง ./gradlew installDebug๋ก ๋ด ํฐ์๋ง ๊น์๋ดค๋ค๋ฉด, ์ด์ ๋ ๋ค๋ฅธ ์ฌ๋ ํฐ์๋ ๊น๋ฆด ์ ์๋ ํํ๋ก ๋ง๋ค์ด์ผ ํ๋ค. ๊ทธ๊ฒ ๋ฆด๋ฆฌ์ค ๋น๋๊ณ , ๊ทธ๊ฑธ ์ฌ๋๋ค์ด ๋ฐ์ ์ ์๊ฒ ์ฌ๋ฆฌ๋ ๊ฒ Play ์คํ ์ด ๋ฐฐํฌ๋ค.
์ฒ์ ํด๋ณด๋ฉด "์๋ช "์ด๋ผ๋ ๊ฐ๋ ์์๋ถํฐ ๋งํ๋ค. ์ ์ฑ์ ์๋ช ์ ํด์ผ ํ๊ณ , ํค๊ฐ ์ ๋ ์ข ๋ฅ๋ ์๋์ง๋ถํฐ ๋ณด์.
์ ์๋ช ์ด ํ์ํ๊ฐ
์๋๋ก์ด๋๋ ์ฑ์ ์ค์นํ ๋ "์ด ์ฑ์ด ์ง์ง ๊ทธ ๊ฐ๋ฐ์๊ฐ ๋ง๋ ๊ฑด์ง"๋ฅผ ํ์ธํ๋ค. ๊ทธ ํ์ธ ์๋จ์ด ์๋ช
์ด๋ค. ๋๋ฒ๊ทธ ๋น๋(installDebug)๋ ์๋๋ก์ด๋ ์คํ๋์ค๊ฐ ์๋์ผ๋ก ๋ง๋ค์ด์ฃผ๋ ์์ ๋๋ฒ๊ทธ ํค๋ก ์๋ช
๋๋๋ฐ, ์ด ํค๋ ์๋ฌด๋ ๊ฐ์ง ๊ฑฐ๋ผ ์คํ ์ด์ ์ฌ๋ฆด ์ ์๋ค. ๋ฆด๋ฆฌ์ค์ฉ์ผ๋ก๋ ๋๋ง ๊ฐ์ง ํค๋ก ์๋ช
ํด์ผ ํ๋ค.
์๋ช ํค๊ฐ ๋ ์ข ๋ฅ์ธ ์ด์ : ์ ๋ก๋ ํค vs ์ฑ ์๋ช ํค
์ฌ๊ธฐ์ ์ฒ์ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ด ๋์จ๋ค. Play ์คํ ์ด์ "Play ์ฑ ์๋ช (Play App Signing)"์ด๋ผ๋ ๊ธฐ๋ฅ์ด ์๋๋ฐ, ์ด๊ฑธ ์ฐ๋ฉด ํค๊ฐ ๋ ๊ฐ๋ก ๋๋๋ค.
- ์ ๋ก๋ ํค(upload key): ๋ด๊ฐ ๋ค๊ณ ์๋ ํค. AAB ํ์ผ์ ์๋ช ํด์ Play Console์ ์ฌ๋ฆด ๋ ์ด๋ค.
- ์ฑ ์๋ช ํค(app signing key): Google์ด ๋ณด๊ดํ๋ ํค. ์ค์ ๋ก ์ฌ์ฉ์ ๊ธฐ๊ธฐ์ ์ค์น๋๋ ์ต์ข APK๋ ์ด ํค๋ก ๋ค์ ์๋ช ๋ผ์ ๋๊ฐ๋ค.
์ ์ด๋ ๊ฒ ๋๋ ๋จ์๊น. ์ ๋ก๋ ํค๋ ๋ด ์ปดํจํฐ์ ํ์ผ๋ก ์์ผ๋ ๋ถ์คํ๊ฑฐ๋ ์ ์ถ๋ ์ํ์ด ์๋ค. ๋ง์ฝ ๋ถ์คํด๋, ์ฑ ์๋ช ํค๋ Google์ด ์์ ํ๊ฒ ๋ณด๊ดํ๊ณ ์์ผ๋ "์ ๋ก๋ ํค๋ฅผ ๋ถ์คํ๋ค"๊ณ Google์ ์์ฒญํ๋ฉด ์ ์ ๋ก๋ ํค๋ก ๊ต์ฒดํ ์ ์๋ค. ๋ฐ๋ฉด ์ฑ ์๋ช ํค ์์ฒด๋ฅผ ์์ด๋ฒ๋ฆฌ๋ฉด ๊ทธ ์ฑ์ ์์ ์ ๋ฐ์ดํธ๋ฅผ ๋ชป ์ฌ๋ฆฌ๊ฒ ๋๋ค. ๊ทธ๋์ ๊ทธ ์ค์ํ ํค๋ Google์ด ๋์ ๋ค๊ณ ์์ด์ฃผ๋ ๊ตฌ์กฐ๋ค.
์ฒ์ ์ฑ์ ๋ง๋ค ๋๋ ์ด ๊ตฌ์กฐ๋ฅผ ์ ๊ฒฝ ์ธ ํ์ ์์ด, Android Studio๊ฐ ์๋ดํ๋ ๋๋ก ์ ๋ก๋ ํค ํ๋๋ง ๋ง๋ค๋ฉด ๋๋จธ์ง๋ Play Console์ด ์์์ ์ฒ๋ฆฌํด์ค๋ค.
1. ์๋ช ํค ๋ง๋ค๊ธฐ
Android Studio์์ Build โ Generate Signed Bundle / APK๋ฅผ ์ ํํ๋ฉด, ํค๊ฐ ์๋ ๊ฒฝ์ฐ Create new...๋ก ์ ํค์คํ ์ด(keystore)๋ฅผ ๋ง๋ค ์ ์๋ค. ์ด๋ ์
๋ ฅํ๋ ๊ฐ๋ค:
- Key store path:
.jksํ์ผ์ด ์ ์ฅ๋ ์์น. ์ด ํ์ผ ์์ฒด๊ฐ ํค๋ค. ์ ๋ ์์ด๋ฒ๋ฆฌ๋ฉด ์ ๋๊ณ , git์ ์ฌ๋ฆฌ๋ฉด ์ ๋๋ค. - Password: ํค์คํ ์ด ๋น๋ฐ๋ฒํธ, ํค ๋น๋ฐ๋ฒํธ. ์ด๊ฒ๋ ์์ด๋ฒ๋ฆฌ๋ฉด ์ ๋๋ค.
- Alias: ํค ์ด๋ฆ. ๋ณดํต ์ฑ ์ด๋ฆ์ผ๋ก ์ง๋๋ค.
- Validity (years): ์ ํจ ๊ธฐ๊ฐ. ๋๋ํ๊ฒ 25๋ ์ด์์ผ๋ก ์ก๋ ๊ฒ ๋ณดํต์ด๋ค. (๋๋ฌด ์งง๊ฒ ์ก์ผ๋ฉด ๋ช ๋ ๋ค "์๋ช ์ด ๋ง๋ฃ๋๋ค"๋ ์ฌ๊ณ ๊ฐ ๋๋ค.)
์ปค๋งจ๋๋ผ์ธ์ผ๋ก ์ง์ ๋ง๋ค ์๋ ์๋ค.
keytool -genkey -v -keystore my-release-key.jks \
-keyalg RSA -keysize 2048 -validity 10000 \
-alias my-key-alias2. ๋น๋ฐ๋ฒํธ๋ฅผ ์ฝ๋์ ๋ฐ์ง ์๊ธฐ
ํค์คํ ์ด ๊ฒฝ๋ก์ ๋น๋ฐ๋ฒํธ๋ฅผ build.gradle.kts์ ๊ทธ๋๋ก ์ ์ผ๋ฉด git์ ์ฌ๋ผ๊ฐ์ ์ ์ถ๋๋ค. ๊ทธ๋์ ๋ฐ๋ก ํ์ผ๋ก ๋บ๋ค.
# keystore.properties (git์ ์ฌ๋ฆฌ์ง ์์, .gitignore์ ์ถ๊ฐ)
storeFile=../my-release-key.jks
storePassword=์ฌ๊ธฐ์_๋น๋ฐ๋ฒํธ
keyAlias=my-key-alias
keyPassword=์ฌ๊ธฐ์_๋น๋ฐ๋ฒํธ// app/build.gradle.kts
val keystorePropertiesFile = rootProject.file("keystore.properties")
val keystoreProperties = Properties()
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}
android {
signingConfigs {
create("release") {
storeFile = file(keystoreProperties["storeFile"] as String)
storePassword = keystoreProperties["storePassword"] as String
keyAlias = keystoreProperties["keyAlias"] as String
keyPassword = keystoreProperties["keyPassword"] as String
}
}
buildTypes {
getByName("release") {
signingConfig = signingConfigs.getByName("release")
isMinifyEnabled = true
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
}keystore.properties๋ฅผ ๊ผญ .gitignore์ ์ถ๊ฐํ์. ์ด ํ์ผ์ด ๊นํ๋ธ ๊ณต๊ฐ ์ ์ฅ์์ ์ฌ๋ผ๊ฐ๋ ์ฌ๊ณ ๊ฐ ์๊ฐ๋ณด๋ค ํํ๋ค.
3. AAB๋ก ๋น๋ํ๊ธฐ
์์ ์๋ APK๋ฅผ ์ฌ๋ ธ์ง๋ง, ์ง๊ธ Play ์คํ ์ด๋ AAB(Android App Bundle)๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์๊ตฌํ๋ค. APK๋ ๋ชจ๋ ๊ธฐ๊ธฐ์ฉ ๋ฆฌ์์ค(ํ๋ฉด ๋ฐ๋๋ณ ์ด๋ฏธ์ง, CPU ์ํคํ ์ฒ๋ณ ๋ฐ์ด๋๋ฆฌ ๋ฑ)๋ฅผ ๋ค ํ ํ์ผ์ ์ฑ์ฌ๋ฃ์ ๊ฑฐ๊ณ , AAB๋ ๊ทธ ์กฐ๊ฐ๋ค์ ๋ฐ๋ก ๋ด์์ Google์ด "์ด ์ฌ์ฉ์ ๊ธฐ๊ธฐ์๋ ์ด ์กฐ๊ฐ๋ค๋ง ์กฐํฉํด์ ๋ณด๋ด์ค"๋ผ๊ณ ์ฒ๋ฆฌํ๊ฒ ๋ง๋ ํ์์ด๋ค. ๊ทธ๋์ ์ฌ์ฉ์๊ฐ ๋ฐ๋ ์ค์น ํ์ผ ์ฉ๋์ด ๋ ์์์ง๋ค.
Build โ Generate Signed Bundle / APK์์ Android App Bundle์ ์ ํํ๊ณ ์์ ๋ง๋ ์๋ช
ํค๋ฅผ ์ง์ ํ๋ฉด app-release.aab ํ์ผ์ด ๋์จ๋ค. ์ปค๋งจ๋๋ผ์ธ์ผ๋ก๋:
./gradlew bundleRelease๊ฒฐ๊ณผ๋ฌผ์ app/build/outputs/bundle/release/app-release.aab์ ์๊ธด๋ค.
4. Play Console์ ์ฒ์ ๋ฑ๋กํ๊ธฐ
Play Console(play.google.com/console)์์ ์ ์ฑ์ ๋ง๋ค๋ฉด ๋๋ต ์ด๋ฐ ์์๋ก ์งํ๋๋ค.
- ์ฑ ์ด๋ฆ, ๊ธฐ๋ณธ ์ธ์ด, ์ฑ/๊ฒ์ ๊ตฌ๋ถ, ๋ฌด๋ฃ/์ ๋ฃ ์ ํ
- ์คํ ์ด ๋ฑ๋ก์ ๋ณด ์์ฑ: ์งง์ ์ค๋ช , ๊ธด ์ค๋ช , ์คํฌ๋ฆฐ์ท(ํฐ/ํ๋ธ๋ฆฟ๋ณ ๊ท๊ฒฉ ์์), ์์ด์ฝ, ๊ทธ๋ํฝ ์ด๋ฏธ์ง
- ์ฝํ ์ธ ๋ฑ๊ธ ์ค๋ฌธ: ์ง๋ฌธ์ ๋ตํ๋ฉด ์๋์ผ๋ก ๋ฑ๊ธ์ด ๋งค๊ฒจ์ง
- ํ๊ฒ ์ฌ์ฉ์์ธต, ๊ฐ์ธ์ ๋ณด์ฒ๋ฆฌ๋ฐฉ์นจ URL ๋ฑ๋ก (๋ฐ์ดํฐ๋ฅผ ํ๋๋ผ๋ ์์งํ๋ฉด ํ์)
- ์ฑ ์ก์ธ์ค ๊ถํ: ๋ก๊ทธ์ธ์ด ํ์ํ ์ฑ์ด๋ฉด ํ ์คํธ ๊ณ์ ์ ๋ณด ์ ๊ณต
- ํ๋ก๋์ (๋๋ ๋จผ์ ๋ด๋ถ ํ ์คํธ/๋น๊ณต๊ฐ ํ ์คํธ) ํธ๋์ AAB ์ ๋ก๋
์ฒ์ ์ฌ๋ฆฌ๋ ์ฑ์ ๋ฐ๋ก ํ๋ก๋์ ์ ๊ณต๊ฐํ๊ธฐ๋ณด๋ค ๋ด๋ถ ํ ์คํธ(internal testing) ํธ๋์ ๋จผ์ ์ฌ๋ ค์ ๋์ ์์์ ํ ์คํฐ๋ผ๋ฆฌ ์ค์น๊ฐ ์ ๋๋์ง ํ์ธํ๋ ๊ฑธ ๊ถ์ฅํ๋ค. ํธ๋๋ง๋ค ์ฌ์ฌ ์๋์ ๊ณต๊ฐ ๋ฒ์๊ฐ ๋ค๋ฅด๋ค.
5. ์ ๋ฐ์ดํธํ ๋๋ versionCode๋ฅผ ๊ผญ ์ฌ๋ฆฐ๋ค
android {
defaultConfig {
versionCode = 2 // ๋งค ์
๋ก๋๋ง๋ค ๋ฐ๋์ ์ฆ๊ฐ
versionName = "1.1.0" // ์ฌ์ฉ์์๊ฒ ๋ณด์ด๋ ๋ฒ์ , ์์ ๋กญ๊ฒ
}
}versionCode๋ฅผ ์ ์ฌ๋ฆฌ๊ณ AAB๋ฅผ ๋ค์ ์ฌ๋ฆฌ๋ฉด Play Console์ด "์ด๋ฏธ ์๋ ๋ฒ์ ์ฝ๋"๋ผ๋ฉฐ ์
๋ก๋๋ฅผ ๊ฑฐ๋ถํ๋ค. versionName์ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ฃผ๋ ์ซ์๋ผ ์์ ๋กญ๊ฒ ์ง์ด๋ ๋์ง๋ง, versionCode๋ ๋ด๋ถ ๊ด๋ฆฌ์ฉ ์ ์๋ผ์ ๋งค๋ฒ ์ฌ๋ ค์ผ ํ๋ค.
์ฝ์ง ์ฌ๋ก: ์ ๋ก๋ํ๋๋ฐ "์๋ช ์ด ๊ธฐ์กด ์ฑ๊ณผ ๋ค๋ฅด๋ค"๋ ์๋ฌ
์
๋ก๋ํ์ APK ๋๋ Android App Bundle์ด ์ด ์ฑ์ ๋ํด ์ด์ ์ ์ฌ์ฉ๋ ๊ฒ๊ณผ ๋ค๋ฅธ ์๋ช
์ธ์ฆ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ช
๋์์ต๋๋ค.์ฒ์ ์ฑ์ ๋ง๋ค ๋ ์ด ํค์คํ ์ด ํ์ผ์ ๋์ค์ ์์ด๋ฒ๋ฆฌ๊ฑฐ๋, ๋ค๋ฅธ ์ปดํจํฐ์์ ์๋ก ๋ง๋ ํค์คํ ์ด๋ก ๋น๋ํด์ ์๊ธฐ๋ ๋ฌธ์ ๋ค. ์ ๋ก๋ ํค๋ ์ฑ๋ง๋ค ํ ๋ฒ ์ ํด์ง๋ฉด (๋ถ์ค ์ ๊ณ ์ ๊น์ง๋) ๊ณ์ ๊ฐ์ ๊ฑธ ์จ์ผ ํ๋ค. ๊ทธ๋์ ํค์คํ ์ด ํ์ผ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ ํ ๊ณณ์ ๋ฐ๋ก ๋ฐฑ์ ํด๋๋ ๊ฒ ์ค์ํ๋ค. ํ์ผ๋ก ์์ ํ๋ค๋ฉด 1Password ๊ฐ์ ๋น๋ฐ๋ฒํธ ๊ด๋ฆฌ ๋๊ตฌ๋ CI ์์คํ ์ ์ํฌ๋ฆฟ ์ ์ฅ์์ ๋ฃ์ด๋๋ ๊ฑธ ์ถ์ฒํ๋ค.
์ ๋ฆฌ
- ๋ฆด๋ฆฌ์ค ๋น๋๋ ๋๋ง์ ์๋ช ํค๋ก ์๋ช ํด์ผ ์คํ ์ด์ ์ฌ๋ฆด ์ ์๋ค.
- Play ์ฑ ์๋ช ์ ์ฐ๋ฉด ์ ๋ก๋ ํค(๋ด๊ฐ ๋ณด๊ด)์ ์ฑ ์๋ช ํค(Google์ด ๋ณด๊ด)๊ฐ ๋๋๋๋ฐ, ์ ๋ก๋ ํค๋ฅผ ์์ด๋ฒ๋ ค๋ Google์ ์ฌ๋ฐ๊ธ์ ์์ฒญํ ์ ์๋ ์์ ์ฅ์น๋ค.
- ํค์คํ ์ด ๊ฒฝ๋ก/๋น๋ฐ๋ฒํธ๋
keystore.properties๊ฐ์ ๋ณ๋ ํ์ผ๋ก ๋นผ์ git์์ ์ ์ธํ๋ค. - ์ง๊ธ Play ์คํ ์ด๋ APK ๋์ AAB(
./gradlew bundleRelease)๋ฅผ ์๊ตฌํ๋ค. - ์ฒ์ ์ฑ์ ๋ด๋ถ ํ ์คํธ ํธ๋๋ถํฐ ์ฌ๋ ค์ ์ค์น/๋์์ ํ์ธํ๊ณ ๋์ด๊ฐ๋ ๊ฒ ์์ ํ๋ค.
- ์
๋ฐ์ดํธ ๋๋ง๋ค
versionCode๋ฅผ ์ฌ๋ฆฌ๋ ๊ฑธ ์์ง ๋ง ๊ฒ.
(์ฐธ๊ณ : Play App Signing, ์ ๋ก๋ ํค/์ฑ ์๋ช ํค ๊ตฌ์กฐ๋ Android ๊ณต์ ๋ฌธ์ - ์ฑ ์๋ช ์์ ๋ค์ ํ์ธํ๋ ๊ฑธ ๊ถ์ฅํ๋ค. Play Console ํ๋ฉด ๊ตฌ์ฑ์ ์์๋ก ๋ฐ๋๋, ์ค์ ๋ฑ๋กํ ๋๋ ๊ทธ ์์ ์ ํ๋ฉด์ ๊ธฐ์ค์ผ๋ก ๋ฐ๋ผ๊ฐ๋ฉด ๋๋ค.)
๋ค์ ๊ธ์ ์ด ์๋ฆฌ์ฆ์ ๋ง์ง๋ง ๊ธ์ด๋ค. ํ๋์ To-do ์ฑ์ 1๋ฒ ๊ธ์ ์ปดํฌ์ ๋ธ ๊ธฐ์ด๋ถํฐ ์ค๋์ ๋ฐฐํฌ๊น์ง, ๊ตฌ์กฐ๊ฐ ์ด๋ป๊ฒ ๋ฐ๋์ด์๋์ง ์ ์ฒด๋ฅผ ๋์๋ณด๋ ํ๊ณ ํ ๊ธ๋ก ์ ๋ฆฌํ๋ค.
