Android/Module

[Android Multi module] local.properties 파일로 API Key 관리

whjungdev 2024. 9. 13. 20:57

API Key 값 (client_id, client_secret)에 대해서 코드 베이스로 넣게 된다면 프로젝트 공유 시 해당 파일이 포함되어 있으면 문제가 될 것이다.

해당 요소의 문제를 없애기 위해서 다음과 같이 설정해서 사용한다.

 

1. local.properties 파일에 Key/Value 정리

NAVER_CLIENT_ID=""
NAVER_CLIENT_SECRET=""

 

2. build-logic 모듈의 DataAndroid 파일에 android gradle configure 설정
https://github.com/woohyun-jeong/AndroidSampleApp/blob/datastore_test1/build-logic/src/main/kotlin/com/example/sampleapp/DataAndroid.kt

import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties
import org.gradle.api.Project

/**
 * https://github.com/android/nowinandroid/blob/main/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt
 */
internal fun Project.configureDataAndroid() {
    androidExtension.apply {
        buildFeatures {
            buildConfig = true
        }

        defaultConfig {
            buildConfigField("String", "NAVER_CLIENT_ID", getApiKey("NAVER_CLIENT_ID"))
            buildConfigField("String", "NAVER_CLIENT_SECRET", getApiKey("NAVER_CLIENT_SECRET"))
        }
    }
}

fun Project.getApiKey(propertyKey: String): String {
    return gradleLocalProperties(rootDir).getProperty(propertyKey)
}

 

3. 커스텀하여 작성된 gradle.kts 파일에 적용할 내용 나열
example.android.library.gradle.kts 파일로 작성해보았습니다.
https://github.com/woohyun-jeong/AndroidSampleApp/blob/datastore_test1/build-logic/src/main/kotlin/example.android.library.gradle.kts

plugins {
    id("com.android.library")
    id("example.verify.detekt")
}

configureKotlinAndroid()
configureKotest()
configureCoroutineAndroid()
configureHiltAndroid()
configureDataAndroid()
configurePagingAndroid()
configureCoilAndroid()

 

4. 사용하는 모듈에서 적용된 플러그인을 gradle.kts 설정으로 가져옵니다.
import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties
해당 내용을 꼭 import 해야 코틀린 코드로 가져올 수 있습니다.
https://github.com/woohyun-jeong/AndroidSampleApp/blob/datastore_test1/core/data/build.gradle.kts

import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties

plugins {
    id("example.android.library")
    id("example.android.hilt")
    id("kotlinx-serialization")
}

android {
    namespace = "com.example.sampleapp.core.data"
}

dependencies {
    implementation(projects.core.model)
    implementation(projects.core.datastore)

    implementation(libs.retrofit.core)
    implementation(libs.retrofit.kotlin.serialization)
    implementation(libs.okhttp.logging)
    implementation(libs.kotlinx.serialization.json)
    implementation(libs.kotlinx.datetime)
    testImplementation(libs.turbine)
    testImplementation(libs.junit4)
    testImplementation(libs.kotlin.test)
}

 

5. 해당 모듈의 코드내에서 설정된 KEY 값을 통해 사용할 수 있습니다.
https://github.com/woohyun-jeong/AndroidSampleApp/blob/datastore_test1/core/data/src/main/java/com/example/sampleapp/core/data/api/interceptor/NaverAuthInterceptor.kt

class NaverAuthInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val req = chain.request()
        val builder = req.newBuilder().apply {
            addHeader("X-Naver-Client-Id", BuildConfig.NAVER_CLIENT_ID)
            addHeader("X-Naver-Client-Secret", BuildConfig.NAVER_CLIENT_SECRET)
        }
        return chain.proceed(builder.build())
    }
}