안드로이드 자바
[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);
}
}
시연영상