센로그
10. Configuration 본문
◆ Configuration
말 그대로 구성을 설정하는 부분이다.
코드 내부에다 그때그때 설정값을 적어놓는 게 아니라, 외부로 값을 빼서 설정을 관리하는 것을 의미한다.
- 여러곳에서 참조할 설정값들을 일괄 관리할 수 있다. (변경도 편함)
다양한 방법으로 Configuration을 관리할 수 있다.
(순서대로 Configuration 적용)
- JSON file provider (appsettings.json)
- JSON file provider (appsettings.{ENV}.json) //현재 개발환경
- UserSecretes //Development인 경우에만
- Env Variable (환경변수)
- 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를 이용하는 방법이 있다.
과정:
- 모델링 클래스(POCO) 하나를 만들어 준다. (public getter/setter)
- builder에 Configure 등록한다
- 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<>
- List
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 |