안드로이드 자바

[Java][Android] 안드로이드 앱에서 특정 값을 전역으로 사용하기: BuildConfig

teamnova 2025. 8. 2. 17:46
728x90

안녕하세요,

앱을 만들다 보면 서버와 통신해야 하는 경우가 대부분입니다.

이때 서버의 API 베이스 URL을 어떻게 관리하고 계신가요?

혹시 각 클래스마다 private static final String BASE_URL = "..." 이런 식으로 하드코딩하고 계신가요?
(제가 이렇게 작성하여 관리했습니다..(^^))

 

서버 주소가 변경될 때마다 수십 개의 파일을 수정하거나, 

개발/운영 환경에 따라 주소를 일일이 바꿔주는 번거로움은 조금 줄어 들 수있습니다.

 

안드로이드 빌드 시스템의 기능인 BuildConfig를 활용하여 특정값을 전역으로 사용하는 방법을 알아보겠습니다.

 

예시코드

 

# bulid.gradle(Module :app)

plugins {
    alias(libs.plugins.android.application)
}

android {
    namespace 'com.example.buildconfigtest' // <-- BuildConfig의 패키지 경로를 결정합니다.
    compileSdk 35

    defaultConfig {
        applicationId "com.example.buildconfigtest" // 이 값도 BuildConfig의 패키지에 영향을 줄 수 있습니다 (특히 구버전).
        minSdk 35
        targetSdk 35
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildFeatures {
        buildConfig = true // 추가!
    }

    buildTypes {
        debug {
            // **여기 수정!**
            // String 값은 반드시 외부 따옴표와 내부 이스케이프된 따옴표로 감싸야 합니다.
            buildConfigField "String", "API_BASE_URL", "\"https://10.0.0.2(이런식으로 주소값입력)\"" // <-- 이렇게!

            buildConfigField "boolean", "ENABLE_DEBUG_LOGS", "true"
            resValue "string", "app_name", "루미 그리고 진우"
        }

        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            // **여기 수정!**
            buildConfigField "String", "API_BASE_URL", "\"https://api.yourcompany.com\"" // <-- 이렇게!

            buildConfigField "boolean", "ENABLE_DEBUG_LOGS", "false"
            resValue "string", "app_name", "내 앱"
        }
        // staging 빌드 타입이 필요한 경우 주석 해제하여 사용
        /*
        staging {
            initWith debug
            buildConfigField "String", "API_BASE_URL", "\"https://staging.api.yourcompany.com\""
            buildConfigField "boolean", "ENABLE_DEBUG_LOGS", "true"
            resValue "string", "app_name", "내 앱 (테스트)"
        }
        */
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }
}

dependencies {
    implementation libs.appcompat
    implementation libs.material
    implementation libs.activity
    implementation libs.constraintlayout
    testImplementation libs.junit
    androidTestImplementation libs.ext.junit
    androidTestImplementation libs.espresso.core
}

 

Sync Now를 해주시면 됩니다.

 

MainActivity

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "BuildConfigTest";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView apiBaseUrlTextView = findViewById(R.id.apiBaseUrlTextView);
        TextView appNameTextView = findViewById(R.id.appNameTextView);

        String currentBaseUrl = BuildConfig.API_BASE_URL;
        apiBaseUrlTextView.setText("API Base URL: " + currentBaseUrl);

        Log.d(TAG, "현재 API 베이스 URL: " + currentBaseUrl);

        if (BuildConfig.ENABLE_DEBUG_LOGS) {
            Log.d(TAG, "이 로그는 디버그 또는 스테이징 빌드에서만 보입니다!");
        } else {
            Log.d(TAG, "이 로그는 릴리즈 빌드에서만 보입니다!");
        }

        String appName = getResources().getString(R.string.app_name);

        appNameTextView.setText("앱 이름: " + appName);

        Log.d(TAG, "현재 앱 이름: " + appName);
    }
}

 

시연영상