Skip to content

AppSettings 접근

구성 설정 파일(디폴트 파일 neodeex.config.json)에 "appSettings" 섹션을 추가하여 어플리케이션 설정을 기록할 수 있습니다. 과거 .NET Framework에서 app.config 혹은 web.config에서 <appSettins> 섹션을 사용하는 것과 유사합니다.

1
2
3
4
5
6
7
8
9
{
    // 어플리케이션 커스텀 설정
    "appSettings": {
        "setting1": "value1",
        "setting2": "value2",
        "setting3": true,
        "setting4": 32 
    }
}

"appSettings" 구성 설정에 접근하기 위해서는 FoxConfigurationManager 클래스의 정적 속성인 AppSettings 속성을 사용하면 됩니다.

1
2
3
string setting1 = FoxConfigurationManager.AppSettings["setting1"];
string setting2 = FoxConfigurationManager.AppSettings["setting2"];
bool setting3 = FoxConfigurationManager.AppSettings.GetValue<bool>("setting3");

FoxConfigurationAppSettings 클래스

AppSettings 속성은 FoxConfigurationAppSettings 클래스의 인스턴스로서 "appSettings" 섹션에 대한 다양한 기능을 제공합니다.

this 인덱서

FoxConfigurationAppSettings 클래스의 인덱서(this)는 단순한 키를 사용하여 "appSettings" 섹션의 설정을 문자열로 반환합니다. 키로 사용되는 값은 대/소문자를 구별하지 않습니다.

1
2
3
string setting1 = FoxConfigurationManager.AppSettings["setting1"];
string setting2 = FoxConfigurationManager.AppSettings["SETTING2"];   // 대소문자를 구별하지 않음
string setting3 = FoxConfigurationManager.AppSettings["Setting3"];   // 대소문자를 구별하지 않음

인덱서가 설정 값을 문자열로 반환한다는 점에 주의해야 합니다. 위 코드에서 setting3 변수의 값은 "True" 입니다. 구성 설정의 JSON 타입은 boolean 이지만 이 타입이 .Net 문자열로 변환되어 반환되면서 AppSettings["settings"] 식이 "True"를 반환하게 됩니다.

이와 같은 작동 방식은 Fox Configuration이 내부적으로 사용하는 Microsoft.Extensions.Configuration 구현의 작동 방식 입니다.

구성 설정에 존재하지 않는 키에 대해 인덱서를 호출하는 경우, null 이 반환됩니다. 이는 이후 설명할 GetValue<T> 메서드나 Get<T> 메서드에 대해서도 동일합니다.

GetValue<T> 메서드

FoxConfigurationSettings 클래스는 "appSettings" 섹션의 설정이 JSON 타입 값을 구할 수 있도록 GetValue<T> 메서드가 제공됩니다. 이 메서드를 통해 설정의 타입 값을 구할 수 있습니다.

bool setting3 = FoxConfigurationManager.AppSettings.GetValue<bool>("Setting3");
int setting4 = FoxConfigurationManager.AppSettings.GetValue<int>("setting4");

위 코드는 "appSettings:setting3"의 값으로 bool 타입 true를 반환하며, "appSettings:setting4"의 값으로 int 타입 32를 반환합니다.

키 경로 (key path)

FoxConfigurationAppSettings 클래스는 하위 객체를 갖는 복잡한 설정에 접근할 수 있도록 키 경로 사용이 가능합니다. 예를 들어 다음과 같은 설정이 있을 때,

{
  "appSettings": {
    // 하위 객체를 갖는 설정
    "complex": {
      "subkey1": "value3",
      "subkey2": false
    },
    "array": [ "str1", "str2", "str3" ]
  }
}

"subkey1"에 접근하기 위해서는 "complex:subkey1"을 키 값으로 사용하면 됩니다. 키 경로는 인덱서(this)와 GetValue<T> 메서드에 모두 적용할 수 있습니다.

string subkey1 = FoxConfigurationManager.AppSettings["complex:subkey1"];
bool subkey2 = FoxConfigurationManager.AppSettings.GetValue<bool>("complex:subkey2");

배열에 대해서도 키 경로를 적용할 수 있습니다. 배열의 인덱스 값를 서브 키로 사용하여 배열 요소(element)를 읽을 수 있습니다.

1
2
3
var arrayElement0 = FoxConfigurationManager.AppSettings["array:0"];
var arrayElement1 = FoxConfigurationManager.AppSettings["array:1"];
var arrayElement2 = FoxConfigurationManager.AppSettings["array:2"];

객체 값을 갖는 "complex" 키, 혹은 배열 값을 갖는 "array" 키에 대해 에 대해 인덱서(this)를 사용하는 경우 빈 문자열(empty string)을 반환하며, GetValue<T> 메서드르 사용하는 경우 default(T) 값이 반환됩니다.

"appSettings" 구성 설정 바인딩

FoxConfigurationSettings 클래스는 하위 객체 타입의 값을 .net 타입에 바인딩 하여 반환하는 Get<T> 메서드를 제공합니다. Get<T> 메서드를 사용하여 복잡한 설정 값을 간단하게 읽을 수 있습니다.

앞서 예를 들었던 "complex" 설정은 다음 클래스에 바인딩 할 수 있습니다.

1
2
3
4
5
class ComplexSetting
{
    public string? Subkey1 { get; set; }
    public bool? Subkey2 { get; set; }
}

바인딩 시 주의할 점은 JSON 역직렬화와는 다른 방식으로 JSON 설정을 닷넷 클래스에 바인딩 한다는 점입니다. 예를 들어 속성의 이름과 키 이름은 대소문자를 구별하지 않으며 JsonPropertyName 과 같은 특성이 효과가 없습니다.

ComplexSetting 클래스에 대해 Get<T> 메서드를 사용하여 다음과 같이 설정 값을 읽을 수 있습니다.

1
2
3
4
var complex = FoxConfigurationManager.AppSettings.Get<ComplexSetting>("complex");

Console.WriteLine($"subkey1 = {complex.Subkey1}");
Console.WriteLine($"subkey2 = {complex.Subkey2}");

배열이나 리스트(List<T>) 혹은 여러 단계에 걸쳐 하위 객체를 갖는 경우에도 Get<T> 메서드를 통해 바인딩이 가능합니다. 역직렬화와 비슷한 방식으로 바인딩이 가능하지만 앞서 언급한 것처럼 JSON 역직열화와 동일하지 않습니다.

JSON 배열의 경우 직관적으로 바인딩이 가능합니다. 즉, 배열값을 갖는 구성 설정은 List<T> 타입 혹은 T[] 타입으로 바인딩을 할 수 있습니다.

var array = FoxConfigurationManager.AppSettings.Get<string[]>("array");
var list = FoxConfigurationManager.AppSettings.Get<List<string>>("array");

배열과 유사하게 키/값으로만 이루어진 단순한 JSON 객체는 Dictionary<string, string> 타입으로 바인딩이 가능합니다.

키 값 열거

마지막으로 FoxConfigurationAppSettings 클래스는 키 값에 대한 열거를 제공하는 IEnumerable<string> 인터페이스를 구현합니다. 따라서 다음과 같이 foreach 문을 사용하여 "appSettings" 섹션에 대한 모든 키/값을 표시할 수 있습니다.

1
2
3
4
5
foreach(var key in FoxConfigurationManager.AppSettings)
{
    var value = FoxConfigurationManager.AppSettings[key];
    Console.WriteLine($"{key} = {value}");
}

위 코드는 다음과 같은 결과를 반환합니다. 열거 순서는 설정 순서와 무관하며 단순 키 뿐만 아니라 객체 값을 갖는 키와 그 하위 키들도 모두 열거된다는 점에 주의 하십시요.

setting4 = 32
setting3 = True
setting2 = value2
setting1 = value1
complex =
complex:subkey2 = False
complex:subkey1 = value3
array =
array:0 = str1
array:1 = str2
array:2 = str3