DotNET Console Generic Host - Configuration (appsetting.json)

2022. 9. 7. 00:00DOTNET/Generic Host

반응형

Console app 에서 json 파일을 이용하여 Configuration 을 구성하자

일반적으로 aspnet core 같은 경우 appsetting.json , appsetting.{environment}.json 형태로 이루어져있다.

그리고 이곳에 개발에 필요한 값들을 정리해서 사용한다. 

 

일단 필요한 package 부터 설치해보자

dotnet add package Microsoft.Extensions.Configuration.Binder
dotnet add package Microsoft.Extensions.Configuration.Json
dotnet add package Microsoft.Extensions.Configuration.EnvironmentVariables

Microsoft.Extensions.Configuration.Binder

: 데이터에 개체를 바인딩하는 기능


Microsoft.Extensions.Configuration.Json

: JSON 구성 공급자 구현


Microsoft.Extensions.Configuration.EnvironmentVariables

: 환경 변수 구성 공급자 구현

 

Program.cs 로 이동하여 다음 라인을 확인해보자.

CreateDefaultBuilder 는 configuration 관련 하여 다음 작업을 기본으로 설정한다. 

  • appsettings.json.
  • appsettings.{Environment}.json.
  • Secret Manager: 앱이 Development 환경에서 실행되는 경우
  • 환경 변수.
  • 명령줄 인수. (Command-line arguments)

이제 Project 에 appsettings.json 파일을 추가해 보자.

해당 파일에서 마우스 우클릭 후 속성을 다음과 같이 변경하자

 

appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "User":{
  	"Name":"Yogingang",
    "Age":18
  }
}

이제 worker.cs 에서 appsettings.json 의 값을 가져와 보자

Worker.cs

....
public Worker(
        ILogger<Worker> logger,
        IHostApplicationLifetime appLifetime,
        IHelloworld helloworld,
        IConfiguration configuration)
    {
        _logger = logger;
        _helloworld = helloworld;
        _configuration = configuration;
        appLifetime.ApplicationStarted.Register(OnStarted);
        appLifetime.ApplicationStopping.Register(OnStopping);
        appLifetime.ApplicationStopped.Register(OnStopped);
    }

...

IConfiguration 을 Constructor 에서 Injection 한 후 사용해 보자

private void OnStarted()
{
    ...
    var name = _configuration.GetSection("User").GetValue<string>("Name");
    var age = _configuration.GetSection("User").GetValue<int>("Age");
    _logger.LogInformation($"2.2. Name = {name} , Age = {age} ");
    ...
}
private void OnStopped()
    {
        _logger.LogInformation("5. OnStopped has been called.");
        var name = _configuration.GetSection("User").GetValue<string>("Name");
        var age = _configuration.GetSection("User").GetValue<int>("Age");
        _logger.LogInformation($"5.1. Name = {name} , Age = {age} ");
    }

 

실행시 다음과 같은 내용이 표시된다.

그리고 ctrl + c 를 누르기 전에 \bin\Debug\net6.0\appsettings.json 파일을 임의로 열어서 Age 를 19 로 변경한 후 ctrl + c 를 누르자

변경이 적용되는 것을 알 수 있다. 

 

그런데 이것을 적용하기 싫을 수 있다.

service 를 재 실행해야 appsettings.json 을 다시 읽어오게 하고 싶을수도 있다.

configuration 을 재 설정 해보자.

 

Program.cs 로 이동하여 다음을 설정하자

...
.ConfigureAppConfiguration((hostingContext, configuration) =>
{
    configuration.Sources.Clear();

    IHostEnvironment env = hostingContext.HostingEnvironment;

    configuration
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: false)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true, false);
})
.Build();
...

reloadOnChange 를 false 로 설정하면 변경사항이 바로 적용되지 않는다. 

이와 같이 configuration 을 재 설정하는 것도 가능하다.

 

Generic Host 를 사용하게 되면 aspnet core 에서 사용했던 많은 부분을 재 사용할 수 있게 된다. 

 

 

관련영상

https://youtu.be/pnsteQVbmXM

 

 

반응형