센로그

10. Configuration 본문

게임/ASP.NET Core

10. Configuration

seeyoun 2024. 4. 15. 23:16

◆ Configuration

말 그대로 구성을 설정하는 부분이다.

코드 내부에다 그때그때 설정값을 적어놓는 게 아니라, 외부로 값을 빼서 설정을 관리하는 것을 의미한다.

  • 여러곳에서 참조할 설정값들을 일괄 관리할 수 있다. (변경도 편함)

 

다양한 방법으로 Configuration을 관리할 수 있다.

(순서대로 Configuration 적용)

  1. JSON file provider (appsettings.json)
  2. JSON file provider (appsettings.{ENV}.json)   //현재 개발환경
  3. UserSecretes    //Development인 경우에만
  4. Env Variable (환경변수)
  5. CommandLine

 

이 순서는 중요한데, 만약 겹치는 값이 있다면, 후순에 있는 값으로 덮어쓰도록 하기 때문이다.

  • 설정된 app id 값을 가져오고 싶은데, appsettings.json에도 app id가 있고, 환경변수에도 app id가 존재한다면
    최종적으로는 환경변수의 app id를 사용한다는 것이다.

 


Configuration - appsettings.json

가장 기본적인 방법인 appsettings.json부터 보자.

기본 프로젝트에 포함된 파일임.

기본 코드는 다음과 같다.

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

 

 

테스트를 해보자!!

appsettings.json에 설정을 저장해놓고, 외부에서 어떻게 추출해서 사용하는지를 알아볼것이다.

 

1. 다음과 같이 appsettings.json에 간단한 테스트 코드를 추가했다.

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Test": {
    "Id": "grace7040",
    "Password" :  1234
  }
}

 

 

2. 만약 컨트롤러에서 appsettings.json의 설정값을 불러오고 싶다면 다음과 같이 사용하면 된다.

using Microsoft.Extensions.Configuration; 
public readonly IConfiguration _configuration;

public HomeController(IConfiguration configuration)	//DI
{
    _configuration = configuration;
}

public IActionResult Test()
{
    var test1 = _configuration["Test:Id"];
    var test2 = _configuration["Test:Password"];

    var test3 = _configuration["Logging:LogLevel:Default"];
    var test3_ = _configuration.GetSection("Logging")["LogLevel:Default"];

    return Ok();
}
  • test3과 test3_은 같은 값을 받아옴.

 


UserSecrets (secret.json)

비밀번호처럼 좀 Secret한 데이터를 JSON에 그냥 막 넣어놓기는 좀 그렇다.

이런 애들을 관리할 방법은 어떤 게 있을까?

  • 환경변수 사용
  • UserSecrets 사용 (Development)

 

그중 UserSecrets는 개발하는 동안에 사용할 수 있는 방법이다.

솔루션 탐색기에서, 프로젝트 이름에 우클릭하면 '사용자 암호 관리' 라는 란이 있다.

누르면 secrets.json이 열림. 여기다 적어주면 됨.

로컬 환경에서 테스트할 때 유용하게 사용할 수 있다.

 

추출해서 갖고오는 법은 바로 위 예제와 동일하다.

 


POCO

위 예제들에서는 설정값을 추출해서 갖고올 때 configuration[Logging:LogLevel:Default].. 이런식으로 문자열로 지저분하게 갖고왓엇음.

다른 방법은 없을까?

 

별도의 모델링 클래스와 DI를 이용하는 방법이 있다.

 

과정:

  1. 모델링 클래스(POCO) 하나를 만들어 준다. (public getter/setter)
  2. builder에 Configure 등록한다
  3. IOptions<>로 DI 걸어준다

 

1. 모델링 클래스 하나를 만들어준다.

public class TestObject
{
    public string Id { get; set; }
    public string Password { get; set; }
}
  • 프로퍼티 타입 string 말고 List나 Dictionary도 가능함
    • List
      • IReadOnlyList<>, IReadOnlyCollection<>, ICollection<>, IEnumerable<>
    • Dictionary
      • IDictionary<>, IReadOnlyDictionary<>

 

 

2. builder에 Configure 등록해준다.

Program.cs에서 만들었던 builder에다 Configure 등록을 해준다.

builder.Services.Configure<TestObject>(
        builder.Configuration.GetSection("Test"));
  • Configuration을 실행하면서, Test섹션을 TestObject와 연결해주겠다는 뜻.
    • 아까 appsettings.json에 만들었던 그 Test섹션임.

 

3. IOptions<>로 DI를 걸어준다.

public class HomeController : Controller
{
    public IOptions<TestObject> _options { get; }

    public HomeController(IOptions<TestObject> options)
    {
        _options = options;
    }

    public IActionResult Test()
    {
        var myId = _options.Value.Id;
        var myPassword = _options.Value.Password;

        return Ok();
    }
}
  • 컨트롤러에서 IOptions<> 형태로 DI를 해준다.
  • 그러면 .Value를 통해 내부 데이터에 접근가능하다.

 

처음에 쫌 귀찮긴 하지만, 쓸 때는 대괄호 쓰고 난리치는 것보다 깔끔하긴 하다.ㅇㅇ

 

 

참고) IOptions<>를 통해 DI를 하면 Reload 적용은 안된다.(앱 실행 중에 appsettings 값 바꾸기)

Reload가 필요하다면 IOptionsSnapshot<>을 사용하면 된다~

 


ASPNETCORE_ENVIRONMENT 

개발 단계(환경)에 따라 설정이 달라질 수도 있다.

개발 단계인지, 실제 배포 단계인지에 따라 로깅을 다르게 한다거나 그런 것.

 

ASP.NET Core에서 현재 환경이 어떤지 알아내는 방법은 간단하다.

  • ASPNETCORE_ENVIRONMENT 라는 환경 변수를 이용하는 것이다.

 

이건 Properties/launchSettings.json에 있다.

 

 

개발 단계(환경)를 나타내는 몇가지 상태가 내장되어있다.

  • Development : 개발 단계
  • Staging : 스테이징 단계
  • Production : 제품 단계

 

이런 내장된 환경들의 경우, 관련된 헬퍼 함수들이 존재해서 편하다.

IWebHostEnvironment.IsDevelopment() 이런 걸 쓸 수 있다는 뜻.

  • app.Environment.IsDevelopment() 

 

환경 이름을 통해 구분하고싶을 때는

  • app.Environment.IsEnvironment("환경이름")

을 사용하면 된다.

 


커스텀 환경 추가

위 세가지 내장 환경이 아닌, 커스텀 환경을 추가하고 싶다면!

 

1. 디버그 속성에 들어가서 프로필 추가해주면 된다.

 

 

  • Staging이라는 이름의 환경을 하나 더 만들었다.

 

2. 그러면 알아서 launchSettings.json에다가 추가됨.

  • 실행 환경 목록에도 새로 추가된 걸 볼 수 있다!

 

'게임 > ASP.NET Core' 카테고리의 다른 글

12. Authentication  (0) 2024.04.15
11. Filter  (0) 2024.04.15
9. Dependency Injection (DI)  (0) 2024.04.15
8. WebAPI (+Routing Attributes)  (0) 2024.04.15
7. TagHelper  (0) 2024.04.15
Comments