Android

[Java][Android] BuildConfig을 사용하여 안드로이드 앱에서 특정 값을 전역으로 사용하기 / 모든 클래스 사용 /

어렵지만 2025. 8. 2. 18:11

안녕하세요,

AWS를 1년간 무료로 사용하고 있었고 그 기한이 다 되서 이제 로컬 서버로 대신하려고합니다.

 

현재 만들어진 앱의 코드는 해당 서버 주소 값을 모든 클래스에 하드코딩으로 작성하였고

이번 로컬 서버로 옮기는 작업에서 하나 하나 찾아가면서.... 전부 수정을 완료했습니다..

 

이로써 느낀점은... 한번에 바꿀수 있는 방법이 있지 않을까?

 

생각하여 찾아보니 BuildConfig 을 사용해서 빌드에 설정한 값들을 사용 할 수 있게 할 수 있었습니다.

 

또한 다른 값들을 지정하여 사용 할 수 있었습니다.

 

예제코드

 

# build.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://여기에 주소값을 입력\"" // <-- 이렇게!
            // 여기서 설정한 값을 BuildConfig.API_BASE_URL; 이런식으로 모든 클래스에서 불러 사용 할 수 있습니다.
            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
}

 

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);
    }
}

 

시연영상