본문 바로가기

모바일(Mobile)/안드로이드(Android)

[TIPS] 안드로이드 컴포즈(Compose) 환경에서 local.properties 파일로 key 값 관리하기 with KTS

https://developer.android.com/studio/build/migrate-to-kts?hl=ko 

 

Groovy에서 KTS로 빌드 구성 이전  |  Android 개발자  |  Android Developers

Gradle 구성 파일을 Groovy에서 KTS로 이전합니다.

developer.android.com

 

구글에서 위와 같이 기존 groovy(build.grale)에서 KTS로 빌드 구성을 이전했습니다.

2023년 8월 프로젝트를 처음 시작했기에, 자동으로 KTS로 빌드 파일이 구성되었는데,

이때는 몰랐습니다... 이로 인해 의존성 추가 하나 하는 것도 더 찾아보게 되었다는 것을..ㄷㄷ

 

안드로이드 앱 개발 시, 민감한 데이터의 경우 GitHub와 같은 원격 레포지토리에 올라가지 않게 관리할 필요가 있습니다.

그래서, 이러한 부분은 개인 PC에서 별도로 관리할 필요가 있는데요. (안그러면 키 값 도용되서 요금폭탄...👀)

 

물론 string.xml 파일을 통해 키 값을 관리할 수도 있겠으나, 보안상 별로 좋은거 같진 않기에

지금부터는 local.properties파일과 KTS를 통해 안드로이드 앱에서 키 값을 관리하는 방법에 대해 소개하겠습니다.

 

step1. local.properties 파일 생성

안드로이드 프로젝트 생성 시 같이 만들어지는 local.properties 파일에 원하는 키 값을 적습니다.

 

local.properties 

## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Thu Aug 17 09:03:36 KST 2023
/* 생략  */
NAVER_CLIENT_ID="abcdefg123456" // 네이버 맵 Client ID를 다음과 같이 적어둔다.

// 왼쪽에 적어두는 key 값이 아래 앱수준의 build.gradle.kts에서 사용할 key 값이 된다.
// 로컬 프로퍼티에 적힌 값을 불러오기 위한 함수(getAPiKey)에서 사용될 예정

 

step2. 앱 수준의 build.gradle.kts 에서 아래와 같이 작성

 

앱수준 그래들 파일로 이동합니다.
이해를 돕기 위해 실제 프로젝트에서 사용한 build.gradle.kts 파일을 그대로 가져왔습니다.
실제 내부 정보는 일부 생략했는데, 

이 글을 읽으실 분들이 정확한 위치 파악하는 데  도움이 될까 해서 전체 구조는 남겨두었습니다 .😀

build.gradle.kts

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

plugins {
    id("com.android.application")
    /* 생략 */
}

android {
    /* 생략 */

    defaultConfig {
    /* 생략 */

		// manifest에서 meta-data로 값을 등록할 수 있도록 한다.
        manifestPlaceholders["NAVER_CLIENT_ID"] =  "NAVER_CLIENT_ID"
        // BuildConfig 클래스로부터 키를 가져오기 위한 kts의 메서드(?)인 셈인데,
        // 3번째 파라미터인 getApiKey는 별도로 선언한 함수이므로 아래에서 확인한다.
        buildConfigField("String", "NAVER_CLIENT_ID", getApiKey("NAVER_CLIENT_ID"))
    }

    buildTypes {
// 구체적으로 빌드 타입에 따라서 아래와 같이 세부적으로 분기도 가능하다.

        debug {
            buildConfigField("String", "NAVER_CLIENT_ID", getApiKey("NAVER_CLIENT_ID"))
        }
        release {
    /* 생략 */
            buildConfigField("String", "NAVER_CLIENT_ID", getApiKey("NAVER_CLIENT_ID"))
        }
    }
    compileOptions {
        /* 생략 */
    }
    kotlinOptions {
        /* 생략 */
    }
    buildFeatures {
        /* 생략 */
		// buildConfig 옵션을 활성화(true) 되어 있지 않다면 아래와 같이 수정해준다.
        buildConfig = true
    }
    /* 생략 */
}

dependencies {

    /* 생략 */
}

// 앱수준 build.gradle.kts 파일에서 별도로 빌드시 localProperties에 적힌 값을 불러오도록 하는 함수
// 함수명 자체는 바꾸어도 상관 없다 :)
// 이 함수를 통해 로컬프로퍼티로부터 값을 읽어오고 위의 빌드 옵션에서 키 값으로 불러오고 세팅할 수 있다.
fun getApiKey(propertyKey: String): String {
    return gradleLocalProperties(rootDir).getProperty(propertyKey)
}

 

위에 작성한 앱수준 빌드 파일에서 defaultConfig 에 적어둔 코드와

아래의 getApiKey 함수는 안쓰면 빌드 시 오류를 발생시킬 것이니 필히 같이 사용하셔야 됩니당 😀

함수로 별도로 뺀 이유는 defaultConfig 에서 세팅시 그대로 쓰면 너무 길어져서 가독성 높이려고 빼두었답니다.

 

step3. manifest에서 메타데이터로 등록해주기 [선택사항(Optional) 👀]

아래와 같이 manifest파일에 meta-data로 등록하여 사용할 수도 있는데,
경우에 따라서는 메타데이터로 등록할 필요가 없을 수도 있습니다.
그래도 나중에 다른 곳에서 불러다쓸 용도로 활용 가능하니 필요하다면 메타데이터에도 설정해둬도 좋습니다.

manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <!-- 권한설정 -->
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
	<!-- 생략 -->
	>

		<!-- 어플리케이션 내부에 아래와 같이 메타데이터 세팅 가능 -->
        <meta-data
            android:name="com.naver.maps.map.CLIENT_ID"
            android:value="${NAVER_CLIENT_ID}" />

	<!-- 생략 -->

    </application>


step4. 액티비티에서 사용하기 [최종 USAGE]

저 같은 경우는 이번에 앱 개발 시 Compose를 사용해 개발했기 때문에 
메인 액티비티 클래스가 컴포넌트 액티비티(ComponentActivity)를 상속했습니다.
이 클래스를 안드로이드 스튜디오에서 Crtl키를 눌러 소스코드를 확인해보면,

 

public class ComponentActivity extends androidx.core.app.ComponentActivity implements


위와 같이 androidx 패키지 어쩌구를 상속 받는데,

 

public class ComponentActivity extends Activity ...


얘도 결국 액티비티 클래스를 상속받습니다.

결론 : xml 기반의 앱 개발에서의 액티비티와 같다고 생각해도 무방한거 같습니다.

그러므로 메인액티비티 파일 등에서 아래와 같이

MainActivity.kt

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            // 네이버 지도를 위한 SDK Client 등록!
            NaverMapSdk.getInstance(this).client =
                NaverMapSdk.NaverCloudPlatformClient(BuildConfig.NAVER_CLIENT_ID) // local.properties로부터 읽어들임

 

키(Key)가 필요한 부분에서 사용이 가능하고, BuildConfig 클래스를 통해 키 값을 불러올 수 있습니다.

 

물론, 제대로 설정이 됐다면 build.gradle.kts 의 빌드 시 아래와 같이 BuildConfig 자바 클래스가 생성이 되는데요.



눌러서 확인해보면 아래와 같이 

public final class BuildConfig {

  /* 생략 */
  // Field from build type: debug
  public static final String NAVER_CLIENT_ID = "abcdefg123456";

}

 

 

키 값이 잘 맵핑된 것을 확인할 수 있습니다.

 

도움이 되셨길 바라며,

이번 포스팅은 여기까지입니다 😋