ASP.NET Core에서 여러 환경 사용Use multiple environments in ASP.NET Core

작성자: Rick AndersonBy Rick Anderson

ASP.NET Core는 환경 변수를 사용하여 런타임 환경에 따라 앱 동작을 구성합니다.ASP.NET Core configures app behavior based on the runtime environment using an environment variable.

예제 코드 살펴보기 및 다운로드(다운로드 방법)View or download sample code (how to download)

환경Environments

ASP.NET Core는 앱 시작 시 환경 변수 ASPNETCORE_ENVIRONMENT를 읽고 IHostingEnvironment.EnvironmentName에 값을 저장합니다.ASP.NET Core reads the environment variable ASPNETCORE_ENVIRONMENT at app startup and stores the value in IHostingEnvironment.EnvironmentName. ASPNETCORE_ENVIRONMENT는 임의의 값으로 설정할 수 있지만 개발, 준비프로덕션3개 값은 프레임워크에서 지원됩니다.You can set ASPNETCORE_ENVIRONMENT to any value, but three values are supported by the framework: Development, Staging, and Production. ASPNETCORE_ENVIRONMENT가 설정되지 않은 경우 기본값은 Production입니다.If ASPNETCORE_ENVIRONMENT isn't set, it defaults to Production.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    if (env.IsProduction() || env.IsStaging() || env.IsEnvironment("Staging_2"))
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();
    app.UseMvc();
}

위의 코드:The preceding code:

환경 태그 도우미IHostingEnvironment.EnvironmentName의 값을 사용하여 요소에 표시를 포함하거나 제외합니다.The Environment Tag Helper uses the value of IHostingEnvironment.EnvironmentName to include or exclude markup in the element:

@page
@inject Microsoft.AspNetCore.Hosting.IHostingEnvironment hostingEnv
@model AboutModel
@{
    ViewData["Title"] = "About";
}
<h2>@ViewData["Title"]</h2>
<h3>@Model.Message</h3>

<p> ASPNETCORE_ENVIRONMENT = @hostingEnv.EnvironmentName</p>

Windows와 macOS에서 환경 변수 및 값은 대/소문자를 구분하지 않습니다.On Windows and macOS, environment variables and values aren't case sensitive. Linux 환경 변수 및 값은 기본적으로 대/소문자를 구분합니다.Linux environment variables and values are case sensitive by default.

개발Development

개발 환경은 프로덕션에서 노출해서는 안 되는 기능을 활성화할 수 있습니다.The development environment can enable features that shouldn't be exposed in production. 예를 들어 ASP.NET Core 템플릿은 개발 환경에서 개발자 예외 페이지를 활성화합니다.For example, the ASP.NET Core templates enable the developer exception page in the development environment.

로컬 컴퓨터 개발을 위한 환경은 프로젝트의 Properties\launchSettings.json 파일에서 설정할 수 있습니다.The environment for local machine development can be set in the Properties\launchSettings.json file of the project. launchSettings.json의 환경 값은 시스템 환경에서 설정된 값을 재정의합니다.Environment values set in launchSettings.json override values set in the system environment.

다음 JSON에는 launchSettings.json 파일의 세 가지 프로필이 표시되어 있습니다.The following JSON shows three profiles from a launchSettings.json file:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:54339/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_My_Environment": "1",
        "ASPNETCORE_DETAILEDERRORS": "1",
        "ASPNETCORE_ENVIRONMENT": "Staging"
      }
    },
    "EnvironmentsSample": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Staging"
      },
      "applicationUrl": "http://localhost:54340/"
    },
    "Kestrel Staging": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_My_Environment": "1",
        "ASPNETCORE_DETAILEDERRORS": "1",
        "ASPNETCORE_ENVIRONMENT": "Staging"
      },
      "applicationUrl": "http://localhost:51997/"
    }
  }
}

참고

launchSettings.jsonapplicationUrl 속성은 서버 URL의 목록을 지정할 수 있습니다.The applicationUrl property in launchSettings.json can specify a list of server URLs. 목록의 URL 사이에 세미콜론을 사용합니다.Use a semicolon between the URLs in the list:

"EnvironmentsSample": {
   "commandName": "Project",
   "launchBrowser": true,
   "applicationUrl": "https://localhost:5001;http://localhost:5000",
   "environmentVariables": {
     "ASPNETCORE_ENVIRONMENT": "Development"
   }
}

dotnet run을 사용하여 앱을 시작하면 "commandName": "Project"를 포함한 첫 번째 프로필이 사용됩니다.When the app is launched with dotnet run, the first profile with "commandName": "Project" is used. commandName의 값은 시작할 웹 서버를 지정합니다.The value of commandName specifies the web server to launch. commandName은 다음 중 하나일 수 있습니다.commandName can be any one of the following:

  • IIS ExpressIIS Express
  • IISIIS
  • 프로젝트(Kestrel을 시작)Project (which launches Kestrel)

앱이 dotnet run으로 시작하는 경우:When an app is launched with dotnet run:

  • 가능한 경우 launchSettings.json을 읽습니다.launchSettings.json is read if available. launchSettings.jsonenvironmentVariables 설정은 환경 변수를 재정의합니다.environmentVariables settings in launchSettings.json override environment variables.
  • 호스팅 환경이 표시됩니다.The hosting environment is displayed.

다음 출력은 dotnet run으로 시작되는 앱을 보여 줍니다.The following output shows an app started with dotnet run:

PS C:\Websites\EnvironmentsSample> dotnet run
Using launch settings from C:\Websites\EnvironmentsSample\Properties\launchSettings.json...
Hosting environment: Staging
Content root path: C:\Websites\EnvironmentsSample
Now listening on: http://localhost:54340
Application started. Press Ctrl+C to shut down.

Visual Studio 프로젝트 속성 Debug 탭은 launchSettings.json 파일을 편집할 수 있는 GUI를 제공합니다.The Visual Studio project properties Debug tab provides a GUI to edit the launchSettings.json file:

프로젝트 속성 설정 환경 변수

웹 서버가 다시 시작되기 전에는 프로젝트 프로필의 변경 내용이 적용되지 않을 수 있습니다.Changes made to project profiles may not take effect until the web server is restarted. 해당 환경에 대한 변경 내용을 감지하려면 Kestrel을 다시 시작해야 합니다.Kestrel must be restarted before it can detect changes made to its environment.

경고

launchSettings.json은 암호를 저장하지 않아야 합니다.launchSettings.json shouldn't store secrets. 암호 관리자 도구를 사용하여 로컬 개발에 대한 암호를 저장할 수 있습니다.The Secret Manager tool can be used to store secrets for local development.

Visual Studio Code를 사용하는 경우 환경 변수는 .vscode/launch.json 파일에서 설정할 수 있습니다.When using Visual Studio Code, environment variables can be set in the .vscode/launch.json file. 다음 예제에서는 환경을 Development로 설정합니다.The following example sets the environment to Development:

{
   "version": "0.2.0",
   "configurations": [
        {
            "name": ".NET Core Launch (web)",

            ... additional VS Code configuration settings ...

            "env": {
                "ASPNETCORE_ENVIRONMENT": "Development"
            }
        }
    ]
}

Properties/launchSettings.json과 같은 방식으로 dotnet run을 사용하여 앱을 시작할 때 프로젝트의 .vscode/launch.json 파일은 읽히지 않습니다.A .vscode/launch.json file in the project isn't read when starting the app with dotnet run in the same way as Properties/launchSettings.json. launchSettings.json 파일이 없는 개발 환경에서 앱을 시작할 때는 dotnet run 명령에 대한 환경 변수 또는 명령줄 인수로 환경을 설정합니다.When launching an app in development that doesn't have a launchSettings.json file, either set the environment with an environment variable or a command-line argument to the dotnet run command.

프로덕션Production

프로덕션 환경은 보안, 성능 및 앱 견고성을 최대화하도록 구성되어야 합니다.The production environment should be configured to maximize security, performance, and app robustness. 개발과 다른 몇 가지 일반적인 설정은 다음과 같습니다.Some common settings that differ from development include:

  • 캐싱.Caching.
  • 클라이언트 쪽 리소스가 번들로 제공되고, 축소되며, 잠재적으로 CDN에서 처리됩니다.Client-side resources are bundled, minified, and potentially served from a CDN.
  • 진단 오류 페이지를 사용하지 않습니다.Diagnostic error pages disabled.
  • 친숙한 오류 페이지를 사용하도록 설정합니다.Friendly error pages enabled.
  • 프로덕션 로깅 및 모니터링을 사용합니다.Production logging and monitoring enabled. 예: Application Insights.For example, Application Insights.

환경 변수를 설정합니다.Set the environment

테스트를 위해 특정 환경을 설정하는 것이 유용합니다.It's often useful to set a specific environment for testing. 환경을 설정하지 않으면 대부분의 디버깅 기능을 사용하지 않는 Production으로 기본값이 지정됩니다.If the environment isn't set, it defaults to Production, which disables most debugging features. 환경 설정에 대한 메서드는 운영 체제에 따라 다릅니다.The method for setting the environment depends on the operating system.

Azure App ServiceAzure App Service

Azure App Service에서 환경을 설정하려면 다음 단계를 수행합니다.To set the environment in Azure App Service, perform the following steps:

  1. App Services 블레이드에서 앱을 선택합니다.Select the app from the App Services blade.
  2. SETTINGS 그룹에서 응용 프로그램 설정 블레이드를 선택합니다.In the SETTINGS group, select the Application settings blade.
  3. 응용 프로그램 설정 영역에서 새 설정 추가를 선택합니다.In the Application settings area, select Add new setting.
  4. 이름 입력의 경우, ASPNETCORE_ENVIRONMENT를 제공합니다.For Enter a name, provide ASPNETCORE_ENVIRONMENT. 값 입력의 경우 환경을 제공합니다(예: Staging).For Enter a value, provide the environment (for example, Staging).
  5. 배포 슬롯을 교환할 때 환경 설정을 현재 슬롯으로 유지하려면 슬롯 설정 확인란을 선택합니다.Select the Slot Setting check box if you wish the environment setting to remain with the current slot when deployment slots are swapped. 자세한 내용은 Azure 설명서: 어떤 설정이 교환됩니까?를 참조하세요.For more information, see Azure Documentation: Which settings are swapped?.
  6. 블레이드 상단에서 저장을 선택합니다.Select Save at the top of the blade.

Azure App Service는 Azure Portal에서 앱 설정(환경 변수)이 추가, 변경 또는 삭제된 후 앱을 자동으로 다시 시작합니다.Azure App Service automatically restarts the app after an app setting (environment variable) is added, changed, or deleted in the Azure portal.

WindowsWindows

현재 세션에 ASPNETCORE_ENVIRONMENT를 설정하려면 앱이 dotnet run을 사용하여 시작할 때 다음 명령이 사용됩니다.To set the ASPNETCORE_ENVIRONMENT for the current session when the app is started using dotnet run, the following commands are used:

명령 프롬프트Command prompt

set ASPNETCORE_ENVIRONMENT=Development

PowerShellPowerShell

$Env:ASPNETCORE_ENVIRONMENT = "Development"

이러한 명령은 현재 창에만 적용됩니다.These commands only take effect for the current window. 창이 닫히면 ASPNETCORE_ENVIRONMENT 설정이 기본 설정 또는 컴퓨터 값으로 되돌아갑니다.When the window is closed, the ASPNETCORE_ENVIRONMENT setting reverts to the default setting or machine value.

Windows에서 전역적으로 값을 설정하려면 다음 방법 중 하나를 사용합니다.To set the value globally in Windows, use either of the following approaches:

  • 제어판 > 시스템 > 고급 시스템 설정을 열고 ASPNETCORE_ENVIRONMENT 값을 추가하거나 편집합니다.Open the Control Panel > System > Advanced system settings and add or edit the ASPNETCORE_ENVIRONMENT value:

    시스템 고급 속성

    ASPNET Core 환경 변수

  • 관리 명령 프롬프트를 열고 setx 명령을 사용하거나 관리 PowerShell 명령 프롬프트를 열고 [Environment]::SetEnvironmentVariable을 사용합니다.Open an administrative command prompt and use the setx command or open an administrative PowerShell command prompt and use [Environment]::SetEnvironmentVariable:

    명령 프롬프트Command prompt

    setx ASPNETCORE_ENVIRONMENT=Development /M
    

    /M 스위치는 시스템 수준에서 환경 변수를 설정함을 나타냅니다.The /M switch indicates to set the environment variable at the system level. /M 스위치를 사용하지 않으면 환경 변수가 사용자 계정으로 설정됩니다.If the /M switch isn't used, the environment variable is set for the user account.

    PowerShellPowerShell

    [Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development", "Machine")
    

    Machine 옵션 값은 시스템 수준에서 환경 변수를 설정함을 나타냅니다.The Machine option value indicates to set the environment variable at the system level. 옵션 값이 User로 변경되면 환경 변수가 사용자 계정으로 설정됩니다.If the option value is changed to User, the environment variable is set for the user account.

ASPNETCORE_ENVIRONMENT 환경 변수를 전역적으로 설정하면 값이 설정된 후 열리는 모든 명령 창에서 dotnet run에 대해 적용됩니다.When the ASPNETCORE_ENVIRONMENT environment variable is set globally, it takes effect for dotnet run in any command window opened after the value is set.

web.configweb.config

web.config를 사용하여 ASPNETCORE_ENVIRONMENT환경 변수를 설정하려면 ASP.NET Core 모듈 구성 참조환경 변수 설정 섹션을 참조하세요.To set the ASPNETCORE_ENVIRONMENT environment variable with web.config, see the Setting environment variables section of ASP.NET Core 모듈 구성 참조. ASPNETCORE_ENVIRONMENT 환경 변수를 web.config로 설정하면 해당 값이 시스템 수준의 설정을 재정의합니다.When the ASPNETCORE_ENVIRONMENT environment variable is set with web.config, its value overrides a setting at the system level.

IIS 응용 프로그램 풀마다Per IIS Application Pool

격리된 응용 프로그램 풀에서 실행되는(IIS 10.0 이상에서 지원됨) 앱에 대한 ASPNETCORE_ENVIRONMENT 환경 변수를 설정하려면, 환경 변수 <environmentVariables> 항목의 AppCmd.exe 명령 섹션을 참조하세요.To set the ASPNETCORE_ENVIRONMENT environment variable for an app running in an isolated Application Pool (supported on IIS 10.0 or later), see the AppCmd.exe command section of the Environment Variables <environmentVariables> topic. ASPNETCORE_ENVIRONMENT 환경 변수를 앱 풀에 대해 설정하면 해당 값이 시스템 수준의 설정을 재정의합니다.When the ASPNETCORE_ENVIRONMENT environment variable is set for an app pool, its value overrides a setting at the system level.

중요

IIS에서 앱을 호스팅하고 ASPNETCORE_ENVIRONMENT 환경 변수를 추가 또는 변경할 때 다음 방법 중 하나를 사용하여 앱에서 선택한 새 값을 가져옵니다.When hosting an app in IIS and adding or changing the ASPNETCORE_ENVIRONMENT environment variable, use any one of the following approaches to have the new value picked up by apps:

  • 앱의 앱 풀을 다시 시작합니다.Restart an app's app pool.
  • 명령 프롬프트에서 net stop was /y 다음에 net start w3svc를 실행합니다.Execute net stop was /y followed by net start w3svc from a command prompt.
  • 서버를 다시 시작합니다.Restart the server.

macOSmacOS

macOS에 대한 현재 환경 설정은 앱을 실행할 때 인라인으로 수행할 수 있습니다.Setting the current environment for macOS can be performed in-line when running the app:

ASPNETCORE_ENVIRONMENT=Development dotnet run

또는 앱을 실행하기 전에 export를 사용하여 환경을 설정합니다.Alternatively, set the environment with export prior to running the app:

export ASPNETCORE_ENVIRONMENT=Development

컴퓨터 수준 환경 변수는 .bashrc 또는 .bash_profile 파일에서 설정됩니다.Machine-level environment variables are set in the .bashrc or .bash_profile file. 임의의 텍스트 편집기를 사용하여 파일을 편집합니다.Edit the file using any text editor. 다음 명령문을 추가합니다.Add the following statement:

export ASPNETCORE_ENVIRONMENT=Development

LinuxLinux

Linux 배포의 경우 세션 기반 변수 설정에 대한 명령 프롬프트에서 export 명령 또는 컴퓨터 수준 환경 설정에 대한 bash_profile 파일을 사용합니다.For Linux distros, use the export command at a command prompt for session-based variable settings and bash_profile file for machine-level environment settings.

환경별 구성Configuration by environment

ASP.NET Core의 구성환경별 구성 섹션을 참조하세요.See the Configuration by environment section of ASP.NET Core의 구성.

환경에 따른 시작 클래스 및 메서드Environment-based Startup class and methods

시작 클래스 규칙Startup class conventions

ASP.NET Core 앱이 시작되면 시작 클래스가 앱을 부트스트랩합니다.When an ASP.NET Core app starts, the Startup class bootstraps the app. 앱은 다양한 환경(예: StartupDevelopment)에 대한 별도의 Startup 클래스를 정의할 수 있으며 적절한 Startup 클래스는 런타임에 선택됩니다.The app can define separate Startup classes for different environments (for example, StartupDevelopment), and the appropriate Startup class is selected at runtime. 해당 이름 접미사가 현재 환경과 일치하는 클래스에 우선 순위가 부여됩니다.The class whose name suffix matches the current environment is prioritized. 일치하는 Startup{EnvironmentName} 클래스를 찾을 수 없으면 Startup 클래스가 사용됩니다.If a matching Startup{EnvironmentName} class isn't found, the Startup class is used.

환경 기반 Startup 클래스를 구현하려면 사용 중인 각 환경에 대한 Startup{EnvironmentName} 클래스와 폴백 Startup 클래스를 만듭니다.To implement environment-based Startup classes, create a Startup{EnvironmentName} class for each environment in use and a fallback Startup class:

// Startup class to use in the Development environment
public class StartupDevelopment
{
    public void ConfigureServices(IServiceCollection services)
    {
        ...
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        ...
    }
}

// Startup class to use in the Production environment
public class StartupProduction
{
    public void ConfigureServices(IServiceCollection services)
    {
        ...
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        ...
    }
}

// Fallback Startup class
// Selected if the environment doesn't match a Startup{EnvironmentName} class
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        ...
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        ...
    }
}

어셈블리 이름을 허용하는 UseStartup(IWebHostBuilder, String) 오버로드를 사용합니다.Use the UseStartup(IWebHostBuilder, String) overload that accepts an assembly name:

public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
var assemblyName = typeof(Startup).GetTypeInfo().Assembly.FullName;

return WebHost.CreateDefaultBuilder(args)
.UseStartup(assemblyName);
}
public static void Main(string[] args)
{
CreateWebHost(args).Run();
}

public static IWebHost CreateWebHost(string[] args)
{
var assemblyName = typeof(Startup).GetTypeInfo().Assembly.FullName;

return WebHost.CreateDefaultBuilder(args)
.UseStartup(assemblyName)
.Build();
}
public class Program
{
public static void Main(string[] args)
{
var assemblyName = typeof(Startup).GetTypeInfo().Assembly.FullName;

var host = new WebHostBuilder()
.UseStartup(assemblyName)
.Build();

host.Run();
}
}

시작 메서드 규칙Startup method conventions

ConfigureConfigureServicesConfigure<EnvironmentName>Configure<EnvironmentName>Services 양식의 환경 특정 버전을 지원합니다.Configure and ConfigureServices support environment-specific versions of the form Configure<EnvironmentName> and Configure<EnvironmentName>Services:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        StartupConfigureServices(services);
    }

    public void ConfigureStagingServices(IServiceCollection services)
    {
        StartupConfigureServices(services);
    }

    private void StartupConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        if (env.IsProduction() || env.IsStaging() || env.IsEnvironment("Staging_2"))
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();
        app.UseMvc();
    }

    public void ConfigureStaging(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (!env.IsStaging())
        {
            throw new Exception("Not staging.");
        }

        app.UseExceptionHandler("/Error");
        app.UseHsts();
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();
        app.UseMvc();
    }
}

추가 자료Additional resources