ASP.NET Core 환경에서 설정(Configuration) 읽기 전략
ASP.NET Core로 마이그레이션을 진행하면, 기존의 web.config 또는 app.config 기반 설정 방식에서 벗어나 새로운 설정 시스템을 이해하는 것이 필수적입니다. 이 글에서는 가장 일반적으로 사용되는 설정 소스들과 그 활용법을 코드 중심으로 정리합니다.
지원되는 설정 공급자 (Configuration Providers)
ASP.NET Core는 다양한 설정 소스를 유연하게 결합할 수 있도록 설계되어 있으며, 기본적으로 다음과 같은 순서로 설정 값을 로드합니다:
- ChainedConfigurationProvider: 기존 설정 인스턴스를 연결해 재사용
- appsettings.json 및 환경별 파일 (
appsettings.Development.json,appsettings.Production.json) - 환경 변수
- 명령줄 인수
이러한 공급자들은 우선순위에 따라 등록되며, 나중에 등록된 설정이 이전 설정을 오버라이드합니다. 다음 코드로 현재 로드된 설정 공급자를 확인할 수 있습니다:
var root = (IConfigurationRoot)Configuration;
foreach (var provider in root.Providers)
{
Console.WriteLine($"설정 공급자: {provider}");
}
1. JSON 설정 파일 사용 (appsettings.json)
기본 설정 파일인 appsettings.json은 계층적 구조를 지원합니다. 예시 파일은 다음과 같습니다:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning"
}
},
"AllowedHosts": "*"
}
단일 값을 읽으려면 인덱서를 사용합니다:
var allowedHosts = Configuration["AllowedHosts"];
var defaultLevel = Configuration["Logging:LogLevel:Default"];
Console.WriteLine($"호스트 허용: {allowedHosts}");
Console.WriteLine($"기본 로그 레벨: {defaultLevel}");
객체 바인딩을 통한 복잡한 설정 읽기
계층적 설정을 C# 객체로 매핑하려면 POCO 클래스를 정의하고 GetSection().Bind()를 사용합니다:
public class LogLevelConfig
{
public string Default { get; set; }
public string Microsoft { get; set; }
}
public class LoggingConfig
{
public LogLevelConfig LogLevel { get; set; }
}
바인딩 코드:
var loggingSettings = new LoggingConfig();
Configuration.GetSection("Logging").Bind(loggingSettings);
// 콜론 포함 키는 직접 처리 필요
var lifetimeKey = "Logging:LogLevel:Microsoft.Hosting.Lifetime";
loggingSettings.LogLevel.MicrosoftHostingLifetime = Configuration[lifetimeKey];
환경별 설정 파일
ASP.NET Core는 자동으로 appsettings.{Environment}.json 파일을 로드합니다. 환경은 프로그램 진입점에서 지정됩니다:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseEnvironment("Development"); // 개발 환경
webBuilder.UseStartup<Startup>();
});
예: appsettings.Development.json은 개발 중에만 적용되며, 동일한 키가 있을 경우 기본 appsettings.json 값을 덮어씁니다.
2. 환경 변수로부터 설정 읽기
모든 플랫폼에서 호환성을 보장하기 위해, 환경 변수의 계층 구조는 콜론 대신 이중 밑줄(__)로 표현해야 합니다.
Windows 예시 (명령 프롬프트):
set Key1=Value1
set Logging__LogLevel__Customer=Debug
Linux/macOS 예시:
export Key1=Value1
export Logging__LogLevel__Customer=Debug
코드에서 읽기:
var key1 = Configuration["Key1"];
var customerLog = Configuration["Logging:LogLevel:Customer"];
기본적으로 환경 변수 공급자는 자동 등록되지만, 커스텀 설정이 필요하면 다음과 같이 명시적으로 추가할 수 있습니다:
.ConfigureAppConfiguration((context, config) =>
{
config.AddEnvironmentVariables();
})
3. 명령줄 인수를 통한 설정 제공
실행 시점에 설정을 주입하려면 명령줄 인수를 사용합니다. CLI에서 앱 실행:
dotnet run -- Key1=Value1 Logging:LogLevel:Customer=Warning
ASP.NET Core는 -- 이후의 인수를 자동으로 설정으로 해석합니다. 이 방식은 CI/CD 파이프라인에서 매우 유용합니다.
4. 기존 app.config 파일 사용하기
레거시 시스템과의 호환성을 위해 app.config를 계속 사용해야 하는 경우, System.Configuration.ConfigurationManager NuGet 패키지를 추가하면 됩니다:
Install-Package System.Configuration.ConfigurationManager
프로젝트에 app.config 파일을 추가:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="LegacyKey" value="LegacyValue" />
</appSettings>
</configuration>
C# 코드에서 접근:
var legacyValue = System.Configuration.ConfigurationManager.AppSettings["LegacyKey"];
Console.WriteLine($"레거시 설정: {legacyValue}");
이 방법은 마이그레이션 과정에서 점진적인 전환을 가능하게 합니다.