1. 개요
Setting Service 를 구현하기 위해 사용되는 Package를 비교 분석한다.
System.Configuration.ConfigurationManager 와 Microsoft.Extensions.Configuration 의 기능을 비교한다.
<GPT 답변>
1. Historical Context:
System.Configuration.ConfigurationManager:
Part of the older .NET Framework.
Commonly used to read settings from App.config for desktop apps and Web.config for ASP.NET apps.
Built primarily for a world where apps had a single static configuration file that was read on startup.
Microsoft.Extensions.Configuration:
Introduced with ASP.NET Core and .NET Core, but usable outside of ASP.NET.
More flexible and extensible compared to ConfigurationManager.
Designed for modern app scenarios, such as microservices, where configuration might come from multiple sources.
2. Configuration Sources:
System.Configuration.ConfigurationManager:
Reads mainly from App.config or Web.config.
While it's possible to read other config files, it's not as straightforward.
Microsoft.Extensions.Configuration:
Allows for configuration to be composed from multiple sources.
Sources include in-memory collections, JSON files, XML files, environment variables, command-line arguments, and more. Can easily integrate with systems like Azure Key Vault, Kubernetes secrets, etc.
다만, 여러개의 파일 타입을 사용하기 위해서는 각각의 별도의 Package가 필요하다
3. Complex Hierarchies:
System.Configuration.ConfigurationManager:
Configuration settings are typically flat, defined in key-value pairs.
Can use "sections" but they're more cumbersome to set up.
Microsoft.Extensions.Configuration:
Naturally supports complex hierarchical configurations, especially with JSON and XML sources.
Hierarchical data can be accessed using a colon : separator (e.g., Parent:Child:Grandchild).
4. Reloading:
System.Configuration.ConfigurationManager:
Doesn't support reloading of configuration out-of-the-box. Once the configuration is loaded, it remains static for the lifetime of the app domain.
Microsoft.Extensions.Configuration:
Supports reloading. Some providers, like the JSON provider, can watch for file changes and reload configuration on-the-fly.
5. Dependency Injection:
System.Configuration.ConfigurationManager:
Wasn't designed with Dependency Injection (DI) in mind.
Microsoft.Extensions.Configuration:
Built to work seamlessly with the Dependency Injection system in ASP.NET Core.
Allows configuration to be easily injected into services and controllers.
6. Platform Availability:
System.Configuration.ConfigurationManager:
Mainly for the .NET Framework, though there's a NuGet package that enables its use in .NET Core.
Microsoft.Extensions.Configuration:
Designed for .NET Core, but can be used in .NET Framework projects as well.
결론
두 가지 모두 구성 관리를 위한 툴이지만 Microsoft.Extensions.Configuration은 보다 현대적이고 유연하며 확장성이 뛰어나 클라우드 네이티브 애플리케이션을 비롯한 다양한 시나리오에 적합합니다. 반면 System.Configuration.ConfigurationManager는 최신 접근 방식으로의 마이그레이션이 불가능하거나 필요하지 않은 기존 .NET Framework 애플리케이션을 유지 관리하는 경우 선택할 수 있습니다.
2. ConfigurationBuilder 구현
ConfigurationBuilder를 활용하기 위해서 몇가지 패키지를 설치한다.
Microsoft.Extensions.Configuration : ConfigurationBuilder 를 지원한다.
Microsoft.Extensions.Options.ConfigurationExtensions : Injection 을 위한 기능을 제공한다.
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("configuration.json", optional: true, reloadOnChange: true)
.Build();
// 파일 업데이트를 위해 로드한 파일의 경로를 속성으로 업데이트한다.
config.GetSection("AppSettings")["FilePath"] = configPath;
// Dependency Injection 을 IOption<AppSettings>을 singleton으로 등록한다.
services.Configure<AppSettings>(config.GetSection("AppSettings"));
// IoC에서 Instance를 받아온다.
var settings = Ioc.Default.GetRequiredService<IOptions<AppSettings>>();
DI를 통해 주입된 instance는 singleton 이여서 어디에서든지 속성값을 바꾸면 연동되어 업데이트 된다.
Injection
DI 를 통해 등록한 instance를 주입한다.
public class SettingViewModel : ViewModelBase
{
private readonly ILogger<SettingViewModel> logger;
private readonly AppSettings setting;
public SettingViewModel(IOptions<AppSettings> setting, ILogger<SettingViewModel> logger)
{
this.logger = logger;
this.setting = setting.Value;
}
}
Configuration 주요 함수 사용
// Configuration에서 얻은 property 를 대응되는 instance에 bind하여 값을 입력한다.
var bindSetting = new AppSettings();
config.Bind(bindSetting);
// Configuration 로드한 값을 얻는다
var getSetting = config.Get<AppSettings>()
Configuration 파일 업데이트
Setting 값을 변경하고 이를 configuration 파일에 저장 업데이트 하는 방법이다.
처음 로드한 config 파일의 경로에 파일을 다시 업데이트 한다.
저장하기에 앞서 configuration 파일에 다른 section 이 존재할 수 있으므로 JObject Linq 를 이용하여 AppSettings section 만 업데이트 하도록 한다.
var settings = Ioc.Default.GetRequiredService<IOptions<AppSettings>>();
var configFilePath = settings.Value.FilePath;
var jsonConfig = JObject.Parse(File.ReadAllText(configFilePath));
jsonConfig["AppSettings"] = JObject.Parse(JsonConvert.SerializeObject(settings.Value, Formatting.Indented));
File.WriteAllText(configFilePath, jsonConfig.ToString(Formatting.Indented));