다음을 통해 공유


앱 구성

이 콘텐츠는 .NET Docs 또는 오프라인으로 읽을 수 있는 다운로드 가능한 무료 PDF로 제공되는 Blazor for ASP NET Web Forms Developers for Azure eBook에서 발췌한 것입니다.

Blazor-for-ASP-NET-Web-Forms-Developers eBook cover thumbnail.

Web Forms에서 앱 구성을 로드하는 기본적인 방법은 서버에서 또는 web.config가 참조하는 구성 파일에서 web.config 파일에 항목을 포함하는 것입니다. 정적 ConfigurationManager 개체를 사용하여 앱 설정, 데이터 리포지토리 연결 문자열 및 앱에 추가되는 기타 확장된 구성 공급자와 상호 작용할 수 있습니다. 다음 코드에 표시된 것처럼 앱 구성에 대한 상호 작용을 확인하는 것이 일반적입니다.

var configurationValue = ConfigurationManager.AppSettings["ConfigurationSettingName"];
var connectionString = ConfigurationManager.ConnectionStrings["MyDatabaseConnectionName"].ConnectionString;

앱이 Windows IIS 서버에서 호스트되는 경우 ASP.NET Core 및 서버 쪽 Blazor에는 web.config 파일이 있을 수 있습니다. 그러나 ConfigurationManager는 이 구성과 상호 작용하지 않으며 다른 소스에서 더 구조적인 앱 구성을 받을 수 있습니다. 구성이 수집되는 방법 및 web.config 파일의 구성 정보에 액세스하는 방법을 살펴보겠습니다.

구성 원본

ASP.NET Core는 앱에 사용할 수 있는 많은 구성 소스가 있음을 인식합니다. 프레임워크는 기본적으로 해당 기능을 가장 잘 활용하려고 시도합니다. ASP.NET Core는 이와 같이 다양한 소스에서 구성을 읽고 집계합니다. 동일한 구성 키의 나중에 로드된 값은 이전 값보다 우선 적용됩니다.

ASP.NET Core는 클라우드를 인식하며 운영자와 개발자가 앱을 쉽게 구성할 수 있도록 디자인되었습니다. ASP.NET Core는 환경을 인식하며 Production 또는 Development 환경에서 실행되고 있는지 이해합니다. 환경 표시기는 ASPNETCORE_ENVIRONMENT 시스템 환경 변수에 설정됩니다. 구성된 값이 없는 경우 앱은 기본적으로 Production 환경에서 실행 중으로 설정됩니다.

앱은 환경 이름에 따라 여러 소스에서 구성을 트리거하고 추가할 수 있습니다. 기본적으로 구성은 다음 리소스에서 나열된 순서대로 로드됩니다.

  1. appsettings.json 파일(있는 경우)
  2. appsettings.{ENVIRONMENT_NAME}.json 파일(있는 경우)
  3. 디스크의 사용자 비밀 파일(있는 경우)
  4. 환경 변수
  5. 명령줄 인수

appsettings.json 형식 및 액세스

appsettings.json 파일은 다음 JSON처럼 구조화된 값이 포함된 계층 구조일 수 있습니다.

{
  "section0": {
    "key0": "value",
    "key1": "value"
  },
  "section1": {
    "key0": "value",
    "key1": "value"
  }
}

이전 JSON이 제공된 경우 구성 시스템은 자식 값을 평면화하고 정규화된 계층 구조 경로를 참조합니다. 콜론(:) 문자는 계층 구조에서 각 속성을 구분합니다. 예를 들어 구성 키 section1:key0section1 개체 리터럴의 key0 값에 액세스합니다.

사용자 비밀

사용자 비밀은 다음과 같습니다.

  • 앱 개발 폴더 외부 개발자 워크스테이션에 있는 JSON 파일에 저장되는 구성 값입니다.
  • Development 환경에서 실행되는 경우에만 로드됩니다.
  • 특정 앱과 연결됩니다.
  • .NET CLI의 user-secrets 명령을 사용하여 관리됩니다.

user-secrets 명령을 실행하여 비밀 스토리지를 사용하도록 앱을 구성합니다.

dotnet user-secrets init

이전 명령은 프로젝트 파일에 UserSecretsId 요소를 추가합니다. 요소에는 비밀을 앱과 연결하는 데 사용되는 GUID가 포함됩니다. 그런 다음, set 명령을 사용하여 비밀을 정의할 수 있습니다. 예시:

dotnet user-secrets set "Parent:ApiKey" "12345"

이전 명령은 12345 값을 사용하여 개발자 워크스테이션에서 Parent:ApiKey 구성 키를 사용할 수 있도록 설정합니다.

사용자 비밀을 만들고 저장하고 관리하는 방법에 관한 자세한 내용은 ASP.NET Core에서 개발 중인 앱 비밀의 안전한 스토리지 문서를 참조하세요.

환경 변수

앱 구성에 로드되는 다음 값 세트는 시스템의 환경 변수입니다. 이제 모든 시스템 환경 변수 설정은 구성 API를 통해 액세스할 수 있습니다. 앱 내부에서 읽을 때 계층 구조 값은 평면화되고 콜론 문자로 구분됩니다. 그러나 일부 운영 체제에서는 콜론 문자 환경 변수 이름을 사용할 수 없습니다. ASP.NET Core는 이중 밑줄(__)이 있는 값에 액세스할 때 해당 값을 콜론으로 변환하여 이 제한을 해결합니다. 위 사용자 비밀 섹션의 Parent:ApiKey 값은 환경 변수 Parent__ApiKey를 사용하여 재정의할 수 있습니다.

명령줄 인수

앱이 시작될 때 구성도 명령줄 인수로 제공될 수 있습니다. 이중 대시(--) 또는 슬래시(/) 표기법을 사용하여 설정할 구성 값의 이름과 구성할 값을 표시합니다. 구문은 다음 명령과 유사합니다.

dotnet run CommandLineKey1=value1 --CommandLineKey2=value2 /CommandLineKey3=value3
dotnet run --CommandLineKey1 value1 /CommandLineKey2 value2
dotnet run Parent:ApiKey=67890

web.config의 반환

IIS에서 Windows에 앱을 배포한 경우 web.config 파일은 여전히 앱을 관리하도록 IIS를 구성합니다. 기본적으로 IIS는 ANCM(ASP.NET Core 모듈)에 대한 참조를 추가합니다. ANCM은 Kestrel 웹 서버 대신 앱을 호스트하는 네이티브 IIS 모듈입니다. 해당 web.config 섹션은 다음 XML 태그와 유사합니다.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath=".\MyApp.exe"
                  stdoutLogEnabled="false"
                  stdoutLogFile=".\logs\stdout"
                  hostingModel="inprocess" />
    </system.webServer>
  </location>
</configuration>

aspNetCore 요소에 environmentVariables 요소를 중첩하여 앱별 구성을 정의할 수 있습니다. 해당 섹션에 정의된 값은 ASP.NET Core 앱에 환경 변수로 제공됩니다. 환경 변수는 해당 앱 시작 세그먼트 중에 적절하게 로드됩니다.

<aspNetCore processPath="dotnet"
      arguments=".\MyApp.dll"
      stdoutLogEnabled="false"
      stdoutLogFile=".\logs\stdout"
      hostingModel="inprocess">
  <environmentVariables>
    <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
    <environmentVariable name="Parent:ApiKey" value="67890" />
  </environmentVariables>
</aspNetCore>

앱에서 구성 읽기

ASP.NET Core는 IConfiguration 인터페이스를 통해 앱 구성을 제공합니다. Blazor 구성 요소, Blazor 페이지 및 구성에 액세스해야 하는 기타 ASP.NET Core 관리형 클래스에서 이 구성 인터페이스를 요청해야 합니다. ASP.NET Core 프레임워크는 자동으로 해당 인터페이스를 이전에 구성된 확인된 구성으로 채웁니다. Blazor 페이지 또는 구성 요소의 Razor 태그에서 다음과 같이 .razor 파일 위쪽에 @inject 지시문이 있는 IConfiguration 개체를 삽입할 수 있습니다.

@inject IConfiguration Configuration

이 이전 문은 Razor 템플릿의 나머지 부분에서 IConfiguration 개체를 Configuration 변수로 사용할 수 있도록 설정합니다.

인덱서 매개 변수로 검색된 구성 설정 계층 구조를 지정하여 개별 구성 설정을 읽을 수 있습니다.

var mySetting = Configuration["section1:key0"];

이전 예제에서 section1의 구성을 검색하는 GetSection("section1")과 유사한 구문이 있는 특정 위치에서 키 컬렉션을 검색하는 데 GetSection 메서드를 사용하여 전체 구성 섹션을 페치할 수 있습니다.

강력한 형식의 구성

Web Forms에서는 ConfigurationSection 형식 및 연결된 형식에서 상속되는 강력한 형식의 구성 형식을 만들 수 있었습니다. ConfigurationSection을 사용하여 해당 구성 값을 위한 비즈니스 규칙 및 처리를 구성할 수 있었습니다.

ASP.NET Core에서 구성 값을 수신할 클래스 계층 구조를 지정할 수 있습니다. 해당 클래스는 다음과 같습니다.

  • 부모 클래스에서 상속할 필요가 없습니다.
  • 캡처하려는 구성 구조의 속성 및 형식 참조와 일치하는 public 속성을 포함해야 합니다.

이전 appsettings.json 샘플의 경우 다음 클래스를 정의하여 값을 캡처할 수 있습니다.

public class MyConfig
{
    public MyConfigSection section0 { get; set;}

    public MyConfigSection section1 { get; set;}
}

public class MyConfigSection
{
    public string key0 { get; set; }

    public string key1 { get; set; }
}

이 클래스 계층 구조는 다음 줄을 Startup.ConfigureServices 메서드에(또는 services 대신 builder.Services 속성을 사용하여 Program.cs 내 적절한 위치에) 추가하면 채울 수 있습니다.

services.Configure<MyConfig>(Configuration);

앱의 나머지 부분에서는 클래스에 입력 매개 변수를 추가하거나 IOptions<MyConfig> 형식의 Razor 템플릿에 @inject 지시문을 추가하여 강력한 형식의 구성 설정을 수신할 수 있습니다. IOptions<MyConfig>.Value속성은 구성 설정에서 채워진 MyConfig 값을 생성합니다.

@inject IOptions<MyConfig> options
@code {
    var MyConfiguration = options.Value;
    var theSetting = MyConfiguration.section1.key0;
}

옵션 기능에 관한 자세한 내용은 ASP.NET Core의 옵션 패턴 문서를 참조하세요.