프로젝트하다가 실수로 API 키를 GitHub에 푸시한 적 있으신가요? 저는 있습니다… Google Maps API 키를 하드코딩해놨다가 커밋하고 나서 식은땀이 났던 기억이 나네요. 오늘은 Google에서 제공하는 Secrets Gradle Plugin으로 API 키를 안전하게 관리하는 방법을 공유해볼게요.
기존에 어떻게 했나?
보통 이런 식으로 했죠:
// ❌ 절대 하면 안 되는 방법
class MapsActivity : AppCompatActivity() {
private val API_KEY = "AIzaSyD_실제키값_여기에_하드코딩"
}
아니면 조금 나은 방법으로 local.properties
에 넣고 BuildConfig에서 읽어오기도 했고요:
// local.properties
MAPS_API_KEY=AIzaSyD_xxx
// build.gradle
def localProperties = new Properties()
localProperties.load(new FileInputStream(rootProject.file("local.properties")))
android {
defaultConfig {
buildConfigField "String", "MAPS_API_KEY", "\"${localProperties['MAPS_API_KEY']}\""
}
}
이것도 나쁘진 않은데, 매번 BuildConfig 필드 추가하고, Properties 읽는 코드 작성하고… 귀찮더라구요.
Secrets Gradle Plugin 설치
Google에서 만든 이 플러그인을 쓰면 훨씬 간단해집니다:
1. 프로젝트 레벨 build.gradle.kts
plugins {
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin") version "2.0.1" apply false
}
2. 앱 레벨 build.gradle.kts
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
}
android {
// 기존 설정들...
}
3. local.properties에 키 추가
# local.properties (gitignore에 포함됨)
MAPS_API_KEY=AIzaSyD_실제키값
WEATHER_API_KEY=다른API키값
MY_SECRET_KEY=비밀키값
끝! 이제 코드에서 바로 사용할 수 있어요.
실제 사용법
AndroidManifest.xml에서
<application>
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="${MAPS_API_KEY}" />
</application>
플러그인이 빌드 시점에 ${MAPS_API_KEY}
를 실제 값으로 치환해줍니다.
코드에서 사용하기
// BuildConfig에 자동으로 추가됨
class WeatherRepository {
private val apiKey = BuildConfig.WEATHER_API_KEY
suspend fun getWeather(city: String) {
val url = "https://api.weather.com/v1/forecast?city=$city&key=$apiKey"
// API 호출...
}
}
더 나은 설정들
1. 기본값 설정
CI/CD나 팀원들이 키 없이도 빌드할 수 있게 기본값을 설정할 수 있어요:
// build.gradle.kts
secrets {
// 키가 없을 때 기본값 사용
defaultPropertiesFileName = "secrets.defaults.properties"
// 특정 키만 포함/제외
ignoreList.add("keyToIgnore")
ignoreList.add("ignore*")
}
2. 프로덕션/개발 환경 분리
// local.properties
MAPS_API_KEY_DEBUG=디버그용키
MAPS_API_KEY_RELEASE=프로덕션키
// build.gradle.kts
android {
buildTypes {
debug {
manifestPlaceholders["mapsApiKey"] = localProperties['MAPS_API_KEY_DEBUG']
}
release {
manifestPlaceholders["mapsApiKey"] = localProperties['MAPS_API_KEY_RELEASE']
}
}
}
실전 팁
1. secrets.defaults.properties 활용
# secrets.defaults.properties (이건 커밋해도 됨)
MAPS_API_KEY=REPLACE_WITH_YOUR_API_KEY
WEATHER_API_KEY=DEMO_KEY_FOR_DEVELOPMENT
이렇게 하면 새로운 팀원이 프로젝트 클론받고 바로 빌드할 수 있어요. 실제 키는 나중에 받아서 local.properties에 넣으면 됩니다.
2. CI/CD에서 사용하기
# GitHub Actions 예시
- name: Create local.properties
run: |
echo "MAPS_API_KEY=${{ secrets.MAPS_API_KEY }}" >> local.properties
echo "WEATHER_API_KEY=${{ secrets.WEATHER_API_KEY }}" >> local.properties
3. ProGuard 설정
# proguard-rules.pro
-keep class com.myapp.BuildConfig { *; }
난독화해도 BuildConfig 필드는 유지되도록 설정해야 합니다.
주의사항
이 플러그인 쓰면서 겪은 이슈들:
- Sync 후 BuildConfig 안 보일 때: Clean → Rebuild 한 번 해주면 됩니다.
- 키 이름 규칙: 대문자와 언더스코어만 사용하세요.
maps-api-key
이런 거 안 됩니다. - 멀티모듈: 각 모듈마다 플러그인 적용해야 해요.
이점 정리
- 간편함: Properties 파싱 코드 안 써도 됨
- 안전함: local.properties는 기본적으로 gitignore에 포함
- 유연함: 환경별로 다른 키 사용 가능
- 호환성: AndroidManifest와 코드 모두에서 사용 가능
마무리
Secrets Gradle Plugin 쓰고 나서 API 키 관리가 정말 편해졌어요. 특히 팀 프로젝트할 때 “API 키 좀 공유해주세요” 이런 메시지 주고받을 필요 없이, README에 “local.properties에 키 넣으세요”만 써놓으면 끝!
Google Maps 뿐만 아니라 Firebase, 각종 API 키 관리할 때도 유용하니까 꼭 써보세요. 한 번 설정해놓으면 계속 편하게 쓸 수 있습니다.
혹시 다른 좋은 API 키 관리 방법 있으면 공유해주세요!