다양한 환경에서 작업하기

등록일시: 2017-08-21 08:00,  수정일시: 2017-10-23 13:14
조회수: 6,543
이 문서는 ASP.NET Core 기술을 널리 알리고자 하는 개인적인 취지로 제공되는 번역문서입니다. 이 문서에 대한 모든 저작권은 마이크로소프트에 있으며 요청이 있을 경우 언제라도 게시가 중단될 수 있습니다. 번역 내용에 오역이 존재할 수 있고 주석은 번역자 개인의 의견일 뿐이며 마이크로소프트는 이에 관한 어떠한 보장도 하지 않습니다. 번역이 완료된 이후에도 대상 제품 및 기술이 개선되거나 변경됨에 따라 원문의 내용도 변경되거나 보완되었을 수 있으므로 주의하시기 바랍니다.
본문에서는 환경 변수를 이용해서 다양한 환경에서 응용 프로그램의 동작을 적절하게 제어할 수 있는 ASP.NET Core의 개선된 기능을 살펴봅니다.

ASP.NET Core는 Development, Staging, 그리고 Production 같은 다양한 환경에서 응용 프로그램의 동작을 적절하게 제어할 수 있는 개선된 기능을 제공합니다. 환경 변수를 이용해서 응용 프로그램이 실행되고 있는 환경을 감지해서 응용 프로그램을 적합하게 구성할 수 있습니다.

예제 코드 살펴보기 및 다운로드

Development, Staging, Production

ASP.NET Core는 응용 프로그램이 실행중인 환경을 구분하기 위해서 ASPNETCORE_ENVIRONMENT라는 미리 지정된 환경 변수를 참조합니다. 이 변수는 어떤 값으로도 설정할 수 있지만 대부분 관례에 따라 세 가지 값, 즉 Development, StagingProduction 중 한 가지 값을 설정합니다. ASP.NET Core와 함께 제공되는 예제나 템플릿을 살펴보면 이미 이 값들이 사용되고 있음을 확인할 수 있습니다.

프로그래밍적인 방식으로 응용 프로그램 내에서 현재 환경 설정을 감지할 수도 있고, Environment 태그 헬퍼를 사용해서 응용 프로그램의 현재 환경을 기반으로 에 특정 섹션을 포함시킬 수도 있습니다.

노트

Windows 및 macOS는 지정된 환경 이름의 대소문자를 구분하지 않습니다. 다시 말해서, 변수를 Developmentdevelopment, 또는 DEVELOPMENT 중 어떤 것으로 설정하더라도 그 결과는 동일합니다. 반면 Linux는 기본적으로 대소문자를 구분하는 OS입니다. 따라서 환경 변수, 파일명, 그리고 설정 등에 있어서 항상 대소문자를 구분한다는 전제 하에 작업을 수행해야 합니다.

Development

이 환경은 응용 프로그램을 개발할 때 사용하는 환경입니다. 일반적으로 응용 프로그램이 운영 환경에서 실행될 때는 사용하지 않는 개발자 예외 페이지 같은 기능을 활용하기 위한 목적으로 사용됩니다.

만약 Visual Studio를 사용하고 있다면, 프로젝트의 디버그 프로필에서 환경을 구성할 수 있습니다. 디버그 프로필에서는 응용 프로그램을 시작할 때 사용할 서버와 설정할 모든 환경 변수를 지정합니다. 한 프로젝트에는 각각 환경 변수를 다르게 구성한 별개의 디버그 프로필이 다수 존재할 수 있습니다. 이 프로필들은 웹 응용 프로그램 프로젝트의 속성 (Properties) 메뉴에 존재하는 디버그 (Debug) 탭을 통해서 관리됩니다. 프로젝트 속성에서 설정한 값은 launchSettings.json 파일에 저장되며, 이 파일을 직접 편집해서 프로필을 구성할 수도 있습니다.

다음은 IIS Express 프로필을 보여줍니다:

Project Properties Setting Environment variables

다음은 Development 환경을 위한 프로필과 Staging 환경을 위한 프로필을 포함하고 있는 launchSettings.json 파일을 보여줍니다:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:40088/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "IIS Express (Staging)": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Staging"
      }
    }
  }
}

참고로 프로젝트 프로필의 변경 사항은 프로필에 사용된 웹 서버가 재시작될 때까지 반영되지 않을 수도 있습니다 (특히, Kestrel은 재시작해야만 변경된 환경을 감지할 수 있습니다).

경고

launchSettings.json 파일에 저장되는 환경 변수는 어떠한 방식으로도 보호되지 않으며, 만약 소스 코드 리파지터리를 사용하고 있다면 프로젝트의 소스 코드와 함께 리파지터리에 저장됩니다. 따라서 이 파일에는 자격 증명이나 기타 보안에 민감한 데이터를 저장하면 안됩니다. 만약 그런 데이터를 저장해야만 한다면 개발 중 민감한 응용 프로그램 정보 안전하게 저장하기 문서에서 설명하는 Secret Manager 도구를 사용하는 것이 좋습니다.

Staging

일반적으로 Staging 환경은 운영 환경에 배포하기 전, 마지막 테스트에 활용되는 사전 운영 (Pre-Production) 환경입니다. 이 환경의 물리적 특성은 운영 환경의 그것을 그대로 반영하므로, 이상적인 경우 운영 환경에서 발생할 수 있는 모든 문제점을 스테이징 환경에서 먼저 확인함으로써 사용자에게 영향을 주지 않고도 문제점을 해결할 수 있습니다.

Production

Production 환경은 응용 프로그램이 실제로 실행되고 최종 사용자에 의해서 사용되는 환경입니다. 이 환경은 보안과 성능, 그리고 응용 프로그램의 견고성이 극대화되도록 구성되어야 합니다. 다음은 일반적으로 개발 환경과 운영 환경 사이에 차이점이 존재하는 몇 가지 설정입니다:

  • 캐싱 사용하기

  • 모든 클라이언트 측 리소스가 번들 및 축소되고 있는지, 그리고 최대한 CDN을 통해서 서비스되고 있는지 확인하기

  • 진단용 ErrorPages 중지하기

  • 친숙한 오류 페이지 사용하기

  • 운영에 적합한 로깅 및 모니터링 사용하기 (예, Application Insights)

이 목록은 단지 한 가지 사례일 뿐입니다. 그리고 응용 프로그램의 너무 많은 부분에서 환경 검사를 반복적으로 수행하지 않는 것이 좋습니다. 그 대신, 가급적 Startup 클래스에서 환경 검사를 수행하는 방식을 권장합니다.

환경 설정하기

환경을 설정하는 방법은 운영 체제에 따라서 다릅니다.

Windows

응용 프로그램이 dotnet run 명령을 통해서 시작되는 경우, 현재 세션에 대해 ASPNETCORE_ENVIRONMENT를 설정하려면 다음 명령들을 사용합니다.

명령줄

set ASPNETCORE_ENVIRONMENT=Development

PowerShell

$Env:ASPNETCORE_ENVIRONMENT = "Development"

그러나 이 명령들은 오직 현재 창에만 적용됩니다. 따라서 창이 닫히면 ASPNETCORE_ENVIRONMENT 설정은 기본 설정 또는 머신 값으로 되돌아갑니다. Windows에서 이 값을 전역으로 설정하려면 제어판 (Control Panel) > 시스템 및 보안 (System and Security) > 시스템 (System) > 고급 시스템 설정 (Advanced system settings)을 열고 ASPNETCORE_ENVIRONMENT 환경 변수 값을 추가하거나 편집합니다.

System Advanced Properties

ASPNET Core Environment Variable

macOS

macOS의 경우, 응용 프로그램을 실행할 때 인라인으로 현재 환경을 설정할 수 있습니다.

ASPNETCORE_ENVIRONMENT=Development dotnet run

또는 응용 프로그램을 실행하기 전에 미리 export를 이용해서 설정할 수도 있습니다.

export ASPNETCORE_ENVIRONMENT=Development

머신 수준의 환경 변수는 .bashrc 또는 .bash_profile 파일에 설정됩니다. 텍스트 편집기로 파일을 편집하여 다음 명령문을 추가합니다.

export ASPNETCORE_ENVIRONMENT=Development

Linux

Linux 배포판의 경우, 세션 기반의 변수를 설정하려면 명령줄에서 export 명령을, 머신 수준의 환경 변수를 설정하려면 bash_profile 파일을 사용합니다.

런타임에 환경 확인하기

IHostingEnvironment 서비스는 환경과 관련된 작업을 수행하기 위해 필요한 핵심적인 추상화를 제공합니다. 이 서비스는 ASP.NET 호스팅 계층에서 제공되며, 의존성 주입을 통해서 구동 로직에 주입할 수 있습니다. Visual Studio의 ASP.NET Core 웹 사이트 템플릿에서는 이 방식을 활용해서 현재 환경에 해당하는 구성 파일을 로드하고 (구성 파일이 존재할 경우), 응용 프로그램의 오류 처리 설정을 사용자 지정합니다. 두 가지 경우 모두, 적절한 방법으로 전달된 IHostingEnvironment 인스턴스에서 EnvironmentName 속성이나 IsEnvironment 메서드를 호출해서 현재 지정된 환경을 확인하는 방식으로 동작합니다.

노트

특정 환경에서 응용 프로그램이 실행 중인지 확인해야 할 경우, 단순히 env.EnvironmentName == "Development"와 같이 문자열을 비교하는 대신, 안전하게 대소문자를 구분하지 않는 env.IsEnvironment("environmentname") 메서드를 사용하십시오

예를 들어서, Configure 메서드에 다음과 같은 코드를 작성하면 환경별 오류 처리를 구성할 수 있습니다:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
        app.UseBrowserLink();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

이 코드에서는 응용 프로그램이 Development 환경에서 실행 중인 경우에만 Visual Studio의 "BrowserLink" 기능, 개발 환경 전용 오류 페이지 (일반적으로 이 기능은 운영 환경에서는 실행하지 않습니다) 및 데이터베이스 전용 오류 페이지를 (이 기능은 마이그레이션을 적용할 수 있는 기능을 제공하므로 개발 환경에서만 사용해야 합니다) 사용하는 데 필요한 런타임 지원이 활성화됩니다.

런타임에 클라이언트에 전송할 현재 환경에 적합한 콘텐츠를 결정해야 할 수도 있습니다. 가령, 일반적으로 개발 환경에서는 디버깅이 쉽도록 축소되지 않은 스크립트와 스타일 시트를 제공합니다. 반면 운영 및 테스트 환경에서는 CDN을 이용해서 축소된 버전을 제공하는 경우가 대부분입니다. 이 작업은 Environment 태그 헬퍼로 처리할 수 있습니다. Environment 태그 헬퍼는 현재 환경이 names 어트리뷰트에 지정한 환경 중 하나와 일치하는 경우에만 그 내용을 렌더링합니다.

<environment names="Development">
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</environment>
<environment names="Staging,Production">
    <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.6/css/bootstrap.min.css"
          asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
          asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
    <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
</environment>

응용 프로그램에서 태그 헬퍼를 활용하려면 태그 헬퍼 소개 문서를 참고하시기 바랍니다.

Startup 규약

ASP.NET Core는 현재 환경을 기반으로 응용 프로그램의 구동을 구성하는 규약 기반의 접근 방식을 지원합니다. 또한 응용 프로그램이 실행 중인 환경에 따라서 응용 프로그램이 동작하는 방식을 프로그래밍적인 방식으로 제어할 수 있으며, 자신만의 규약을 만들고 관리할 수 있습니다.

ASP.NET Core 응용 프로그램이 시작될 때, 응용 프로그램을 부트스트랩 하고 구성 설정을 로드하는 등의 작업에 Startup 클래스가 사용됩니다. (ASP.NET Core와 응용 프로그램 Startup 클래스 문서 참고). 그런데 만약 Startup{EnvironmentName}라는 클래스가 존재하고 (예, StartupDevelopment), ASPNETCORE_ENVIRONMENT 환경 변수의 값이 이 이름과 일치하면 해당 클래스가 Startup 클래스 대신 사용됩니다. 따라서 이 기능을 활용하면 우선 개발 환경을 위해서 Startup 클래스를 구성하고, 응용 프로그램이 운영 환경에서 실행될 때 사용될 별도의 StartupProduction 클래스를 구성할 수 있습니다. 물론 그 반대도 가능합니다.

노트

WebHostBuilder.UseStartup<TStartup>() 메서드를 호출하면 구성 섹션이 재정의됩니다.

또한 현재 환경을 기반으로 하는 개별적인 Startup 클래스를 사용하는 대신, Startup 클래스 내부에서 자체적으로 응용 프로그램의 구성 방법을 제어할 수도 있습니다. Configure() 메서드와 ConfigureServices() 메서드 역시 Startup 클래스 자체와 비슷한 방식으로 Configure{EnvironmentName}()Configure{EnvironmentName}Services() 형태의 환경 전용 버전 메서드를 지원합니다. 다시 말해서, ConfigureDevelopment()라는 메서드를 정의할 경우, 개발 환경에서는 Configure() 메서드 대신 이 메서드가 호출됩니다. 또한 동일한 환경에서 비슷하게 ConfigureServices() 메서드 대신 ConfigureDevelopmentServices() 메서드가 호출됩니다.

요약

ASP.NET Core는 개발자가 다양한 환경에서 응용 프로그램이 동작하는 방식을 손쉽게 제어할 수 있도록 다양한 기능과 규약을 제공합니다. 응용 프로그램을 개발 환경에서 스테이징 환경으로, 그리고 다시 운영 환경으로 게시할 때, 환경에 맞도록 환경 변수를 적절히 설정하면 디버깅, 테스트 또는 운영 용도로 응용 프로그램을 최적화시킬 수 있습니다.

추가 자료