구성 소스와 공급자
JSON 파일, 환경 변수, 명령줄 인수, 사용자 지정 공급자의 구성을 우선순위에 따라 계층화합니다.
구성 소스와 공급자은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
.NET의 구성
ASP.NET Core의 구성 시스템은 JSON 파일, 환경 변수, 명령줄 인수 등 여러 소스에서 설정을 읽고 하나의 평면 키-값 저장소로 병합합니다. 이렇게 병합된 저장소는 앱 어디에서나 사용할 수 있습니다.
appsettings.json
appsettings.json은 기본 구성 파일입니다. Host.CreateApplicationBuilder가 자동으로 로드합니다. 설정은 환경별 재정의 설정과 병합됩니다.
// appsettings.json
{
"App": {
"Name": "OrderService",
"MaxRetries": 3
},
"ConnectionStrings": {
"Default": "Server=localhost;Database=orders"
}
}
// appsettings.Production.json overrides the above:
{
"ConnectionStrings": {
"Default": "Server=prod-db;Database=orders;..."
}
}구성 값 읽기
IConfiguration을 통해 구성에 접근합니다. 중첩된 객체에는 콜론 표기법을 사용합니다. 배열에는 인덱스로 접근합니다.
// Inject IConfiguration
public class OrderService
{
private readonly IConfiguration _config;
public OrderService(IConfiguration cfg) => _config = cfg;
public void Configure()
{
string? name = _config["App:Name"]; // "OrderService"
int maxRetries = _config.GetValue<int>("App:MaxRetries"); // 3
string? connStr = _config.GetConnectionString("Default");
// Nested section
var section = _config.GetSection("App");
string? appName = section["Name"];
}
}환경 변수
환경 변수는 JSON 설정을 재정의하며 컨테이너화된 배포에 필수적입니다. 중첩된 키에서 콜론 구분 기호 대신 이중 밑줄(__)을 사용합니다.
# Set via shell or docker-compose:
export App__Name="OrderService-Prod"
export App__MaxRetries=5
export ConnectionStrings__Default="Server=prod-db;..."
// Equivalent to:
{
"App": { "Name": "OrderService-Prod", "MaxRetries": 5 },
"ConnectionStrings": { "Default": "Server=prod-db;..." }
}
// Priority: env vars > appsettings.{Environment}.json > appsettings.json명령줄 인수
기본적으로 명령줄 인수의 우선순위가 가장 높습니다. --key=value 또는 --key value 구문을 사용하며, 중첩에는 콜론이나 이중 밑줄을 사용합니다.
# Override config when launching the app:
dotnet run --App:Name="CLI-Override" --App:MaxRetries=10
# Or:
dotnet run --App__Name="CLI-Override"
// The builder.Configuration.AddCommandLine() is called
// automatically by Host.CreateApplicationBuilder().
// Priority order (highest to lowest):
// 1. Command-line args
// 2. Environment variables
// 3. appsettings.{ASPNETCORE_ENVIRONMENT}.json
// 4. appsettings.jsonUser Secrets
User Secrets는 개발 중 민감한 구성을 프로젝트 디렉터리 외부에 저장합니다. 소스 제어에 절대 커밋되지 않으며 로컬에서 appsettings.json보다 우선합니다.
# Initialize user secrets for the project:
dotnet user-secrets init
# Set a secret:
dotnet user-secrets set "Database:Password" "SuperSecret123"
dotnet user-secrets set "Jwt:SecretKey" "dev-only-key"
# List secrets:
dotnet user-secrets list
# Remove:
dotnet user-secrets remove "Database:Password"
# Stored in: ~/.microsoft/usersecrets/{projectId}/secrets.json
# Automatically loaded in Development environment only사용자 지정 구성 공급자
IConfigurationProvider와 IConfigurationSource를 구현하면 데이터베이스, Consul, Vault, Redis 등 모든 소스에서 구성을 로드할 수 있습니다.
public class DbConfigProvider : ConfigurationProvider
{
private readonly string _connStr;
public DbConfigProvider(string connStr) => _connStr = connStr;
public override void Load()
{
using var conn = new NpgsqlConnection(_connStr);
conn.Open();
using var cmd = new NpgsqlCommand(
"SELECT key, value FROM app_config", conn);
using var reader = cmd.ExecuteReader();
while (reader.Read())
Data[reader.GetString(0)] = reader.GetString(1);
}
}
public class DbConfigSource : IConfigurationSource
{
private readonly string _connStr;
public DbConfigSource(string connStr) => _connStr = connStr;
public IConfigurationProvider Build(IConfigurationBuilder b)
=> new DbConfigProvider(_connStr);
}사용자 지정 공급자 등록
Build()를 호출하기 전에 빌더에 사용자 지정 구성 소스를 추가합니다. 사용자 지정 소스는 기본 제공 공급자와 동일한 우선순위 체계에 포함됩니다.
var builder = Host.CreateApplicationBuilder(args);
// Add custom DB config provider after appsettings.json
builder.Configuration.Add(
new DbConfigSource(
builder.Configuration.GetConnectionString("Default")!));
// Or as an extension method:
public static class ConfigExtensions
{
public static IConfigurationBuilder AddDatabaseConfig(
this IConfigurationBuilder b, string connStr)
=> b.Add(new DbConfigSource(connStr));
}
// Usage:
builder.Configuration.AddDatabaseConfig(connStr);Azure App Configuration
Azure App Configuration은 기능 플래그, 레이블, 버전 관리를 사용해 마이크로서비스 전반의 설정을 중앙에서 관리합니다. 공식 공급자는 표준 구성 소스로 통합됩니다.
// dotnet add package Azure.Extensions.AspNetCore.Configuration.Secrets
// dotnet add package Microsoft.Azure.AppConfiguration.AspNetCore
builder.Configuration.AddAzureAppConfiguration(options =>
options
.Connect(builder.Configuration["AzureAppConfig:ConnectionString"])
.Select(KeyFilter.Any) // all keys
.Select(KeyFilter.Any, "Production") // label override
.UseFeatureFlags(ff =>
ff.CacheExpirationInterval = TimeSpan.FromMinutes(5))
.ConfigureRefresh(r =>
r.Register("App:Version", refreshAll: true)
.SetCacheExpiration(TimeSpan.FromMinutes(1)))
);
app.UseAzureAppConfiguration(); // enable dynamic refresh구성 다시 로드
일부 공급자는 변경 감지를 지원합니다. JSON 공급자는 파일이 변경될 때 다시 로드할 수 있습니다. 실행 중 변경 사항에 대응하려면 IOptionsMonitor<T>를 사용합니다.
// Enable JSON file reload on change:
builder.Configuration.AddJsonFile("appsettings.json",
optional: false, reloadOnChange: true);
// In a service, use IOptionsMonitor (not IOptions) to get live values:
public class FeatureService
{
private readonly IOptionsMonitor<FeatureFlags> _monitor;
public FeatureService(IOptionsMonitor<FeatureFlags> m) => _monitor = m;
public bool IsBetaEnabled
=> _monitor.CurrentValue.BetaEnabled; // always fresh
// React to changes:
public FeatureService(IOptionsMonitor<FeatureFlags> m)
{
_monitor = m;
m.OnChange(flags => Console.WriteLine("Config changed!"));
}
}빠른 확인
중첩된 JSON 구성 키를 환경 변수로 나타내려면 어떤 구분 기호를 사용해야 합니까?
실전: 다중 소스 구성
명시적인 우선순위 순서로 appsettings, 환경 변수, User Secrets를 조합하는 프로덕션 설정입니다.
var builder = Host.CreateApplicationBuilder(args);
// Default: appsettings.json → appsettings.{env}.json → env vars → CLI
// Add user secrets in development:
if (builder.Environment.IsDevelopment())
builder.Configuration.AddUserSecrets<Program>();
// Optionally add Azure Key Vault in production:
if (!builder.Environment.IsDevelopment())
{
var keyVaultUri = builder.Configuration["Azure:KeyVaultUri"]!;
builder.Configuration.AddAzureKeyVault(
new Uri(keyVaultUri), new DefaultAzureCredential());
}
// Now all secrets are available transparently via IConfiguration
var jwtKey = builder.Configuration["Jwt:SecretKey"]!;복습: 구성 소스 및 공급자
핵심 내용:
- 구성은 여러 소스에서 병합되며, 나중에 추가된 소스가 먼저 추가된 소스를 재정의합니다
- 우선순위: CLI 인수 > 환경 변수 > appsettings.{env}.json > appsettings.json
- 중첩된 키에는 환경 변수에서
__(이중 밑줄)을 사용합니다 - User Secrets를 사용하면 개발 자격 증명을 소스 제어에서 제외할 수 있습니다
- 사용자 지정 공급자:
IConfigurationSource와IConfigurationProvider를 구현합니다 - 실시간 구성 업데이트에는
reloadOnChange: true와IOptionsMonitor를 사용합니다
자주 묻는 질문
“구성 소스와 공급자” 강의는 무료인가요?
네 — “구성 소스와 공급자” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“구성 소스와 공급자”에서 뭘 배우나요?
JSON 파일, 환경 변수, 명령줄 인수, 사용자 지정 공급자의 구성을 우선순위에 따라 계층화합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C# Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“구성 소스와 공급자” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.