본문 바로가기
프로그래밍/C#

상황별로 appsettings.json 선택적으로 읽기

by bantomak 2024. 4. 8.
반응형

ASP .NET 코어 앱에서 appsettings.json 읽기

Configuration 클래스는 ASP .NET 코어 앱에서 빌드되고 실행될 때, 앱에 관한 설정값을 제공하는 서비스 역할을 한다.

 

 

이 서비스 자체는 프레임워크 서비스이기 때문에 별도로 서비스 컨테이너에 등록하는 과정 없이 바로 의존성 주입(dependancy injection)을 이용해서 사용이 가능하다. Startup.cs에서 사용하기 위해서 의존성 주입한 예제이다.

 

.NET 설정 파일 우선순위

우선순위에 맞춰서 덮어쓰기를 진행한다. 순위가 높은 항목의 내용으로 덮어쓰기 된다.

  1. Command-line arguments 
  2. Non-prefixed environment variables
  3. User secrets
  4. appsettings.{environment}.json
  5. appsettings.json

 

appsettings.json 파일 구조

json 문서의 일반적인 구조를 따른다. 설정의 section과 적용될 값 쌍으로 정의하면 된다.

예를 들면 아래와 같다.

 

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database= IdentityDB3;Trusted_Connection=True;MultipleActiveResultSets=true",
    "RemoteConnection": "Data Source = 192.168.0.2,11433;Database=RemoteDB4;User ID=sa;Password=Pwd12345*;MultipleActiveResultSets=true",
    "RemoteExistingDBConnection": "Data Source = 192.168.0.2,11433;Initial Catalog = Sample;User ID=sa;Password=Pwd12345*;MultipleActiveResultSets=true"

  }
}

 

appsettings.json 설정값 사용

코드 내부에서 appsettings.json의 값을 사용하기 위해서는 섹션과 값이름을 지정하면 되는데, 값의 자료형에 따라 아래와 같은 방법을 사용한다.

 

1. 객체

Configuration.GetSection("{섹션이름}").GetValue<"{값의 자료형}">("{값이름}"); 또는
Configuration.GetSection("{섹션이름}").GetValue({값의 자료형}, "{값이름}");

json은 객체를 직렬화하는 가장 간편한 방식이다. 따라서 appsettings.json 문서에 각 설정값을 객체로 저장할 수도 있다. 직렬화된 객체를 코드에서 사용하기 위해서는 json을 역직렬화하여 객체로 반환받아야 하는데, 이경우는 위의 메서드를 사용할 수 있다.

 

2. 문자열

Configuration["{섹션이름}:{값이름}"]; 또는
Configuration.GetSection("{섹션이름}")["{값이름}"];

값이 단순한 문자열일 경우, 위와 같이 Dictionary 객체의 자료 검색하는 방법을 사용한다.

 

3. 축약형

Configuraiotn.GetConnectionString("{값이름}");

appsettings.json에 자주 저장되는 데이터베이스 연결 문자열을 쉽게 사용할 수 있는 축약형 메서드이다.

이 메서드는 아래의 호출의 축약형이기 때문에, appsettings.json 파일에 연결 문자열을 지정할 때는, 반드시 "ConnectionStrings" 섹션의 값으로 정의해야 한다.

Configuration.GetSection("ConnectionStrings")["{값이름}"];

 

실제 사용 예제

var defaultConnection = Configuration.GetSection("ConnectionStrings:DefaultConnection").Value;

 

상황에 맞추서 appsettings.json 사용

해당 제공자는 appsettings.json 파일에 정의된 설정값들을 앱에 제공한다.

이 파일은 프로젝트가 빌드된 후에, 출력 폴더에 함께 복사된다.

  • appsettings.json
  • appsettings.QA.json
  • appsettings.DEV.json

또한 appsettings.{environment}.json 구조로 여러 개 생성이 가능하다. 그러면 해당 설정 파일을 어떻게 상황에 맞게 선택해서 읽도록 만들 수 있을 것인가?

 

방법 1 : 환경변수 DOTNET_ENVIRONMENT 설정

Environment.SetEnvironmentVariable("DOTNET_ENVIRONMENT", "QA");

SetEnvironmentVariable() 메서드를 이용해서 직접 환경변수를 등록한다.

 

방법 2 : launchsetting.json 파일 수정을 통한 프로필(profiles)에서 설정

 

  • IIS Express
  • GameServer

이런 식으로 프로필을 추가해서 프로필 별로 제어한다.

 

 

"environmentVariables": {
  "ASPNETCORE_ENVIRONMENT": "Development"
}

를 통해서 appsettings.json을 읽을지 선택한다.

 

프로필 UI에서 직접 환경변수 설정으로 제어할 수도 있다.

함께 읽으면 좋은 글

 

Working with Multiple Environments 다중 환경에서 작업하기 — ASP.NET documentation

(이 괄호 블럭은 읽고 지워주세요. 제목을 한글로 개발, 스테이징, 운영 이라고 하고 싶었으나 의미보다는 환경변수에 설정하는 값으로 문맥에서 사용되기도 하기에 영문을 유지하는게 낫다고

jakeydocs.readthedocs.io

참고 사이트

 

[.NET Core] appsettings.json 파일을 각 개발환경에 맞게 사용하기

들어가며 프로젝트를 진행하다 보면, 다양한 개발 환경이 존재 합니다. 개발환경, 개발QA환경, 정식QA환경, 핫픽스환경 등등등.. 몸담고 있는 회사에서 정한 규칙대로 여러가지 환경이 존재하는

holjjack.tistory.com

 

Configuration - appsettings.json

Configuration 클래스는 Asp.net core 앱이 빌드되고 실행될 때, 앱에 관한 설정값을 제공하는 서비스 역...

blog.naver.com

댓글