login register Sysop! about ME  
qrcode
    최초 작성일 :    2016년 08월 31일
  최종 수정일 :    2016년 08월 31일
  작성자 :    Jake
  편집자 :    Jake (류 지형)
  읽음수 :    16,768

강좌 목록으로 돌아가기

필자의 잡담~

이번 컬럼은 ASP.NET Core 기본 강좌 중 Fundamentals 영역의 글로 다중 환경에서 작업하는 방법에 대한 글입니다.

모든 컬럼은 http://docs.asp.net의 내용을 참고하여 번역한 것입니다. Windows 뿐만 아니라 Linxu, OS X에서도 동작하는 완전한 크로스 플랫폼 서버기술인 ASP.NET Core! 기대해 주세요.

본 번역문서는 개인적인 취지로 번역되어 제공되는 문서로, 원문을 비롯한 모든 저작권은 마이크로소프트사에 있습니다. 마이크로소프트사의 요청이 있을 경우, 언제라도 게시가 중단될 수 있습니다. 본 번역문서에는 오역이 포함되어 있을 수 있으며 주석도 번역자 개인의 견해일뿐입니다. 마이크로소프트사는 본 문서의 번역된 내용에 대해 일체의 보장을 하지 않습니다. 번역이 완료된 뒤에도 제품이 업그레이드 되거나 기능이 변경됨에 따라 원문도 변경되거나 보완되었을 수 있으므로 참고하시기 바랍니다.

원문: https://docs.asp.net/en/latest/fundamentals/environments.html

다중 환경에서 작업하기

ASP.NET Core는 개발, 스테이징, 운영서버등이 존재하는 다중 환경에서 애플리케이션의 행동을 환경에 맞게 조정하기 위해 개선된 방안을 소개하고 있다. 환경 변수(environment variables)에 정보를 기록한 후, 앱이 환경 변수를 참조하여 스스로 환경에 맞는 앱을 구성할 수 있도록 한 것이 그 개념이다.

Sections:

예제 다운로드

Development, Staging, Production

ASP.NET Core는 특정 환경 변수, ASPNETCORE_ENVIRONMENT 를 참조하여 애플리케이션이 현재 운영되고 있는 환경을 알아낸다. 환경 변수를 통해 운영환경을 애플리케이션에게 설명해 준다고 할 수 있다. 이 변수는 여러분이 원하는 값을 설정할 수 있지만 컨벤션에 의해 Development, Staging, Production 라는 세 가지 값을 사용한다. 이 값들은 ASP.NET Core와 함께 제공되는 예제와 템플릿 등에 사용되므로 쉽게 찾아볼 수 있다.

애플리케이션에서는 프로그램적으로 현재 환경 설정을 탐지할 수 있다. 게다가 Envrionment 태그 헬퍼 를 사용하면 현재 애플리케이션 환경에만 사용할 컨텐츠를 에 포함시킬 수도 있다.

노트 : 환경 변수의 값으로 사용되는 환경 이름은 대소문자를 가리지 않는다. 변수를 어떻게 설정하든 - Development or development or DEVELOPMENT - 결과는 같다.

Development

Development는 애플리케이션을 개발할 때 사용되는 환경이 되어야 한다. 비주얼 스튜디오를 사용할 때, 이 설정은 프로젝트의 디버그 프로파일에 명시된다. 아래 그림과 같이 이 설정은 개발 머신의 IIS Express를 위한 것이다.

images/aspcorefund-project-properties-debug.png

프로젝트의 기본 설정을 수정하면 그 내용은 Properties 폴더의 launchSettings.json 파일에 저장된다. 이 파일은 비주얼 스튜디오가 애플리케이션을 구동하도록 설정되는 것과 관련하여, 어떤 환경 변수가 사용되어야 하는지를 포함한 모든 프로파일 설정을 갖고 있다. (디버그 프로파일은 Servers 라는 문서에서 보다 자세한 내용을 다룬다). 예를 들어, IIS Express 가 다른 프로파일을 사용하도록 프로파일을 추가하고자 하는데, Staging 이라는 값을 ASPNETCORE_ENVIRONMENT 환경 변수로 사용하고 싶다면 아래의 예제 파일 launchSettings.json 과 같이 설정한다.

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"
      }
    }
  }
}

노트 : 프로젝트 프로파일 또는 launchSettings.json 파일에서 변경된 내용은 웹 서버가 재시작되기 전까지 반영되지 않을 수 있다. (특히 Kestrel 서버는 반드시 재시작되어야만 환경의 변화를 감지할 수 있다).

필요에 따라 여러 개의 구동 프로파일(launch profile)을 만들어 애플리케이션에서 다양한 구성을 할 수 있다. 다른 환경 변수들을 필요로 하는 프로파일을 작성하는 것도 포함된다.

경고 : launchSettings.json 파일에 저장되는 환경 변수들은 사실 안전하지 않다. 그리고, 프로젝트 소스 코드 저장소의 일부가 될 것이다. 신원정보 또는 보안정보를 절대로 이 파일에 저장해서는 안된다. 그런 데이터를 저장하려는 장소가 필요하다면 Safe storage of app secrets during development 문서에 설명된 Secret Manager 도구를 사용하도록 한다.

Staging

컨벤션에 따르면 Staging 환경은 운영에 가기 바로전 최종 테스트를 진행하는 사전 운영환경이다. 이 환경은 운영 환경의 물리적 특성을 동일하게 갖추는 것이 이상적이다. 그래서, 운영 환경에서 혹여나 발생할 만한 이슈를 Staging 환경에서 미리 포착하여 사용자에게 어떤 영향도 미치지 않고 해결할 수 있다.

Production

Production 환경은 애플리케이션이 라이브 상태가 된 후 최종 사용자에 의해 사용될 때, 애플리케이션이 동작하는 환경이다. 이 환경은 보안, 성능, 견고함을 최대로 구성해야 한다. 개발 환경과 달리 운영 환경이 가져야 할 일반적인 설정은 다음과 같다.

  • 캐싱 사용하기
  • 모든 클라이언트 단 리소스를 같이 묶고(bundle), 최소화(minify)한다. CDN을 통해 클라이언트 단 파일을 서비스하는 것도 잠재적인 옵션이다
  • 오류를 진단하기 위해 사용하는 오류 페이지를 사용하지 않는다
  • 사용자 친화적인 오류 페이지를 사용한다
  • 로깅, 모니터링을 활성화한다. (예, Application Insights)

이 리스트는 단지 예제일뿐 운영을 위한 완벽한 리스트가 아니다. 애플리케이션에서 환경 관련한 확인이 필요하다면 여기 저기에서 비일관적으로 하는 것을 피하고 Startup 클래스와 같이 한 곳의 제한된 곳에서 확인하도록 하자.

실행 시점에 환경 결정하기

IHostingEnvironment 서비스는 운영 환경과 관련된 핵심적인 추상화를 제공한다. 이 서비스는 ASP.NET 호스팅 단에서 제공되는데 Dependency Injection 을 사용해 startup 로직에서 주입될 수도 있다. 비주얼 스튜디오의 ASP.NET Core 웹 사이트 템플릿이 이 접근법을 사용하는데, 특정 환경에 대한 구성 파일이 있다면 이 파일을 로드하고 오류 처리를 환경에 따라 다르게 하도록 구성한다. IHostingEnvironment 가 주입되던 그렇지 않던 환경에 따라 이런 식으로 처리할 수 있는데 IHostingEnvironment 인스턴스의 EnvironmentName 속성 또는 IsEnvironment 메서드를 사용해서 가능하다.

노트 : 애플리케이션이 특정 환경에서 동작하는지 확인할 필요가 있다면 env.IsEnvironment("environmentname") 을 사용하자. 이 문장은 env.EnvironmentName == "Development" 문장과 달리 대소문자를 구분하지 않는다.

예를 들어, 특정 환경에서의 오류 처리를 설정하려면 다음의 코드를 Configure 메서드에서 사용할 수 있다.

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

Development 환경에서 앱을 실행한다면, 비주얼 스튜디오에서 “BrowserLink” 기능을 사용하기 위해 런타임 지원 필요(runtime support necessary)가 활성화되는데, 이 기능은 개발용 오류 화면과 특별한 데이터베이스 오류 화면도 같이 지원한다. 개발용 오류 화면은 통상적으로 운영 환경에서 사용해서는 안되고, 데이터베이스 특정 오류 화면은 마이그레이션을 적용하는 방법을 제공하기 때문에 개발 환경에서만 사용되어야 한다. 반면, 앱이 개발 환경에서 실행되지 않을 경우에는, 표준 오류 화면을 통해 처리되지 않은 예외를 보여준다.

실행환경에 따라 어떤 컨텐트를 클라이언트에 보내야 할 지 결정해야 할 상황이 있을 수 있다. 예를 들면, 개발 환경에서는 디버깅 편의를 위해서 압축되지 않은 스크립트와 스타일 시트를 사용지만, 운영 환경과 테스트 환경에서는 응답 성능 향상을 위해 압축된 버전을 사용한다. 이 최소화된 버전은 일반적으로 CDN을 통해 받는다. 태그 헬퍼 를 사용하여 이런 작업을 할 수 있는데, Environment 태그 헬퍼를 사용하면 현재 환경이 태그의 name 속성에 기재된 환경과 일치할 때만 해당 컨텐츠를 출력한다.

<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>

여러분의 애플리케이션에서 태그 헬퍼 사용을 고려한다면 Introduction to Tag Helpers 문서를 참조하자.

Startup 컨벤션

ASP.NET Core는 현재 환경에 따라 애플리케이션 구동방식을 구성할 수 있는 컨벤션 기반의 접근법을 지원한다. 여러분은 또한 프로그램적으로 애플리케이션의 행동 방식을 환경에 따라 제어할 수 있기 때문에 자신만의 컨벤션을 만들고 관리할 수도 있다.

ASP.NET Core 애플리케이션이 시작될 때, Startup 클래스가 애플리케이션을 구동하고, 구성 설정등을 불러오는 등의 일을 한다 (learn more about ASP.NET startup). 그러나, Startup{EnvironmentName} 처럼, 환경 이름을 포함한 Startup 클래스를 정의하고 (예, StartupDevelopment), ASPNETCORE_ENVIRONMENT 변수 값이 환경 이름과 일치한다면, 환경 특화된 클래스가 사용될 것이다. 따라서, 개발환경에 사용될 Startup 만을 구성할 수도 있겠지만 운영환경을 고려하여 StartupProduction 클래스를 별도로 가져갈 수도 있다. 혹은 그 반대로, Startup 을 운영환경에 사용하고 개발환경을 위한 StartupDevelopment 를 별도로 정의할 수도 있다.

환경에 기초해 완벽하게 분리된 Startup 클래스를 운영하는 것과 더불어, Startup 클래스 내부에서 애플리케이션을 어떻게 구성할지 조정하는 것도 가능하다. Startup 클래스 자체가 환경에 특화된 별도 클래스를 가질 수 있는 것처럼 Configure()ConfigureService() 메서드도 Configure{EnvironmentName}()Configure{EnvironmentName}Services() 의 형태로 환경 특화된 메서드를 지원한다. 환경이 development로 지정되었을 때, ConfigureDevelopment() 메서드를 정의했다면 이 것이 Configure() 메서드 대신 호출될 것이다. 같은 환경이라면 앞서 방식과 동일하게 ConfigureServices() 메서드 대신 ConfigureDevelopmentServices() 메서드가 호출될 것이다.

정리

ASP.NET Core 는 개발자들이 애플리케이션 배포 환경에 맞추어 관리하려고 할 때 필요한 많은 기능과 컨벤션을 제공한다. 개발환경에서부터 애플리케이션을 스테이징, 운영으로 배포할 때, 환경에 맞추어 설정된 환경 변수들은 애플리케이션을 디버깅, 테스팅 또는 운영 모드로 최적화시키는 역할을 한다.

추가 자료


authored by


 
 
.NET과 Java 동영상 기반의 교육사이트

로딩 중입니다...

서버 프레임워크 지원 : NeoDEEX
based on ASP.NET 3.5
Creative Commons License
{5}
{2} 읽음   :{3} ({4})