ASP.NET Core에서 응용 프로그램 시작Application startup in ASP.NET Core

작성자: Steve Smith, Tom DykstraLuke LathamBy Steve Smith, Tom Dykstra, and Luke Latham

Startup 클래스는 서비스와 응용 프로그램의 요청 파이프라인을 구성합니다.The Startup class configures services and the app's request pipeline.

Startup 클래스The Startup class

ASP.NET Core 앱은 규칙에 따라 Startup으로 이름이 지정된 Startup 클래스를 사용합니다.ASP.NET Core apps use a Startup class, which is named Startup by convention. Startup 클래스:The Startup class:

  • 선택적으로 ConfigureServices 메서드를 포함하여 앱의 서비스를 구성할 수 있습니다.Can optionally include a ConfigureServices method to configure the app's services.
  • Configure 메서드를 포함하여 앱의 요청 처리 파이프라인을 만들어야 합니다.Must include a Configure method to create the app's request processing pipeline.

ConfigureServicesConfigure는 앱 시작 시 런타임에 의해 호출됩니다.ConfigureServices and Configure are called by the runtime when the app starts:

public class Startup
{
    // Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        ...
    }

    // Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app)
    {
        ...
    }
}

WebHostBuilderExtensions UseStartup<TStartup> 메서드로 Startup 클래스를 지정합니다.Specify the Startup class with the WebHostBuilderExtensions UseStartup<TStartup> method:

public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
}

Startup 클래스 생성자는 호스트에 의해 정의된 종속성을 허용합니다.The Startup class constructor accepts dependencies defined by the host. Startup 클래스에 대한 종속성 주입의 일반적인 용도는 다음을 삽입하는 것입니다.A common use of dependency injection into the Startup class is to inject:

public class Startup
{
    public Startup(IHostingEnvironment env, IConfiguration config)
    {
        HostingEnvironment = env;
        Configuration = config;
    }

    public IHostingEnvironment HostingEnvironment { get; }
    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        if (HostingEnvironment.IsDevelopment())
        {
            // Development configuration
        }
        else
        {
            // Staging/Production configuration
        }

        // Configuration is available during startup. Examples:
        // Configuration["key"]
        // Configuration["subsection:suboption1"]
    }
}

IHostingEnvironment 삽입의 대안은 규칙 기반 접근 방식을 사용하는 것입니다.An alternative to injecting IHostingEnvironment is to use a conventions-based approach. 앱은 다양한 환경(예: StartupDevelopment)에 대한 별도의 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 클래스 및 StartupDevelopment 클래스 모두를 포함하는 경우 StartupDevelopment 클래스가 사용됩니다.If the app is run in the Development environment and includes both a Startup class and a StartupDevelopment class, the StartupDevelopment class is used. 자세한 내용은 여러 환경 사용을 참조하세요.For more information, see Working with multiple environments.

WebHostBuilder에 대한 자세한 내용은 호스팅 항목을 참조하세요.To learn more about WebHostBuilder, see the Hosting topic. 시작하는 동안 오류를 처리하는 방법은 시작 예외 처리를 참조하세요.For information on handling errors during startup, see Startup exception handling.

ConfigureServices 메서드The ConfigureServices method

ConfigureServices 메서드는The ConfigureServices method is:

  • 선택 사항입니다.Optional.
  • Configure 메서드 전에 웹 호스트에 의해 호출되어 앱의 서비스를 구성합니다.Called by the web host before the Configure method to configure the app's services.
  • 여기서 구성 옵션은 규칙에 의해 설정됩니다.Where configuration options are set by convention.

서비스 컨테이너에 서비스를 추가하면 앱 내 및 Configure 메서드에서 사용할 수 있습니다.Adding services to the service container makes them available within the app and in the Configure method. 서비스는 종속성 주입을 통해 또는 IApplicationBuilder.ApplicationServices에서 확인됩니다.The services are resolved via dependency injection or from IApplicationBuilder.ApplicationServices.

웹 호스트는 Startup 메서드가 호출되기 전에 일부 서비스를 구성할 수 있습니다.The web host may configure some services before Startup methods are called. 세부 정보는 호스팅 항목에서 제공됩니다.Details are available in the Hosting topic.

대부분의 설치가 필요한 기능의 경우 IServiceCollectionAdd[Service] 확장 메서드가 있습니다.For features that require substantial setup, there are Add[Service] extension methods on IServiceCollection. 일반적인 웹앱은 Entity Framework, ID 및 MVC에 대한 서비스를 등록합니다.A typical web app registers services for Entity Framework, Identity, and MVC:

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc();

    // Add application services.
    services.AddTransient<IEmailSender, AuthMessageSender>();
    services.AddTransient<ISmsSender, AuthMessageSender>();
}

시작 시 사용할 수 있는 서비스Services available in Startup

웹 호스트는 Startup 클래스 생성자에 사용할 수 있는 몇 가지 서비스를 제공합니다.The web host provides some services that are available to the Startup class constructor. 앱은 ConfigureServices를 통해 추가 서비스를 추가합니다.The app adds additional services via ConfigureServices. 그러면 호스트와 앱 서비스 모두는 Configure 및 응용 프로그램 전체에서 사용할 수 있습니다.Both the host and app services are then available in Configure and throughout the application.

Configure 메서드The Configure method

Configure 메서드는 앱이 HTTP 요청에 응답하는 방식을 지정하는 데 사용됩니다.The Configure method is used to specify how the app responds to HTTP requests. 요청 파이프라인은 미들웨어 구성 요소를 IApplicationBuilder 인스턴스에 추가하여 구성됩니다.The request pipeline is configured by adding middleware components to an IApplicationBuilder instance. IApplicationBuilderConfigure 메서드에 사용할 수 있지만 서비스 컨테이너에 등록되지 않습니다.IApplicationBuilder is available to the Configure method, but it isn't registered in the service container. 호스팅은 IApplicationBuilder를 만들고 Configure에 직접 전달합니다(참조 원본).Hosting creates an IApplicationBuilder and passes it directly to Configure (reference source).

ASP.NET Core 템플릿은 개발자 예외 페이지, BrowserLink, 오류 페이지, 정적 파일 및 ASP.NET MVC에 대한 지원으로 파이프라인을 구성합니다.The ASP.NET Core templates configure the pipeline with support for a developer exception page, BrowserLink, error pages, static files, and ASP.NET MVC:

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

    app.UseStaticFiles();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller}/{action=Index}/{id?}");
    });
}

Use 확장 메서드는 요청 파이프라인에 미들웨어 구성 요소를 추가합니다.Each Use extension method adds a middleware component to the request pipeline. 예를 들어 UseMvc 확장 메서드는 라우팅 미들웨어를 요청 파이프라인에 추가하고 기본 처리기로 MVC를 구성합니다.For instance, the UseMvc extension method adds the routing middleware to the request pipeline and configures MVC as the default handler.

IHostingEnvironmentILoggerFactory와 같은 추가 서비스는 메서드 서명에서 지정될 수도 있습니다.Additional services, such as IHostingEnvironment and ILoggerFactory, may also be specified in the method signature. 지정되면 사용 가능한 경우 추가 서비스가 삽입됩니다.When specified, additional services are injected if they're available.

IApplicationBuilder를 사용하는 방법에 대한 자세한 내용은 미들웨어를 참조하세요.For more information on how to use IApplicationBuilder, see Middleware.

편리한 메서드Convenience methods

ConfigureServicesConfigure 편의 메서드는 Startup 클래스 지정 대신 사용될 수 있습니다.ConfigureServices and Configure convenience methods can be used instead of specifying a Startup class. ConfigureServices에 대한 여러 호출은 다른 것에 추가됩니다.Multiple calls to ConfigureServices append to one another. Configure에 대한 여러 호출은 마지막 메서드 호출을 사용합니다.Multiple calls to Configure use the last method call.

public class Program
{
    public static IHostingEnvironment HostingEnvironment { get; set; }
    public static IConfiguration Configuration { get; set; }

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

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                HostingEnvironment = hostingContext.HostingEnvironment;
                Configuration = config.Build();
            })
            .ConfigureServices(services =>
            {
                services.AddMvc();
            })
            .Configure(app =>
            {
                if (HostingEnvironment.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    app.UseExceptionHandler("/Error");
                }

                // Configuration is available during startup. Examples:
                // Configuration["key"]
                // Configuration["subsection:suboption1"]

                app.UseMvcWithDefaultRoute();
                app.UseStaticFiles();
            })
            .Build();
}

시작 필터Startup filters

IStartupFilter를 사용하여 앱의 구성 미들웨어 파이프라인의 시작 또는 끝에 미들웨어를 구성합니다.Use IStartupFilter to configure middleware at the beginning or end of an app's Configure middleware pipeline. IStartupFilter는 미들웨어가 앱의 요청 처리 파이프라인의 시작 또는 끝에 라이브러리에 의해 추가되는 미들웨어 전이나 후에 실행되도록 하는데 유용합니다.IStartupFilter is useful to ensure that a middleware runs before or after middleware added by libraries at the start or end of the app's request processing pipeline.

IStartupFilterAction<IApplicationBuilder>를 받고 반환하는 단일 메서드, Configure를 구성합니다.IStartupFilter implements a single method, Configure, which receives and returns an Action<IApplicationBuilder>. IApplicationBuilder는 앱의 요청 파이프라인을 구성하는 클래스를 정의합니다.An IApplicationBuilder defines a class to configure an app's request pipeline. 자세한 내용은 IApplicationBuilder로 미들웨어 파이프라인 만들기를 참조하세요.For more information, see Creating a middleware pipeline with IApplicationBuilder.

IStartupFilter는 요청 파이프라인에서 하나 이상의 미들웨어를 구현합니다.Each IStartupFilter implements one or more middlewares in the request pipeline. 필터는 서비스 컨테이너에 추가된 순서 대로 호출됩니다.The filters are invoked in the order they were added to the service container. 필터는 다음 필터에 컨트롤을 전달하기 전이나 후에 미들웨어를 추가할 수 있으므로 앱 파이프라인의 시작 또는 끝에 추가합니다.Filters may add middleware before or after passing control to the next filter, thus they append to the beginning or end of the app pipeline.

샘플 앱(다운로드하는 방법)은 IStartupFilter를 사용하여 미들웨어를 등록하는 방법을 보여 줍니다.The sample app (how to download) demonstrates how to register a middleware with IStartupFilter. 샘플 앱은 쿼리 문자열 매개 변수에서 옵션 값을 설정하는 미들웨어를 포함합니다.The sample app includes a middleware that sets an options value from a query string parameter:

public class RequestSetOptionsMiddleware
{
    private readonly RequestDelegate _next;
    private IOptions<AppOptions> _injectedOptions;

    public RequestSetOptionsMiddleware(
        RequestDelegate next, IOptions<AppOptions> injectedOptions)
    {
        _next = next;
        _injectedOptions = injectedOptions;
    }

    public async Task Invoke(HttpContext httpContext)
    {
        Console.WriteLine("RequestSetOptionsMiddleware.Invoke");

        var option = httpContext.Request.Query["option"];

        if (!string.IsNullOrWhiteSpace(option))
        {
            _injectedOptions.Value.Option = WebUtility.HtmlEncode(option);
        }

        await _next(httpContext);
    }
}

RequestSetOptionsMiddlewareRequestSetOptionsStartupFilter 클래스에서 구성됩니다.The RequestSetOptionsMiddleware is configured in the RequestSetOptionsStartupFilter class:

public class RequestSetOptionsStartupFilter : IStartupFilter
{
    public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
    {
        return builder =>
        {
            builder.UseMiddleware<RequestSetOptionsMiddleware>();
            next(builder);
        };
    }
}

IStartupFilterConfigureServices의 서비스 컨테이너에 등록됩니다.The IStartupFilter is registered in the service container in ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IStartupFilter, RequestSetOptionsStartupFilter>();
    services.AddMvc();
}

option에 대한 쿼리 문자열 매개 변수가 제공되는 경우 미들웨어는 MVC 미들웨어가 응답을 렌더링하기 전에 값 할당을 처리합니다.When a query string parameter for option is provided, the middleware processes the value assignment before the MVC middleware renders the response:

렌더링된 인덱스 페이지를 표시하는 브라우저 창

미들웨어 실행 순서는 IStartupFilter 등록 순서로 설정됩니다.Middleware execution order is set by the order of IStartupFilter registrations:

  • 여러 IStartupFilter 구현은 동일한 개체와 상호 작용할 수 있습니다.Multiple IStartupFilter implementations may interact with the same objects. 순서 지정이 중요한 경우 해당 미들웨어가 실행해야 하는 순서와 일치하도록 해당 IStartupFilter 서비스 등록의 순서를 지정합니다.If ordering is important, order their IStartupFilter service registrations to match the order that their middlewares should run.
  • 라이브러리는 IStartupFilter로 등록된 다른 앱 미들웨어 전이나 후에 실행하는 하나 이상의 IStartupFilter 구현으로 미들웨어를 추가할 수 있습니다.Libraries may add middleware with one or more IStartupFilter implementations that run before or after other app middleware registered with IStartupFilter. 라이브러리의 IStartupFilter에 의해 추가되는 미들웨어 전에 IStartupFilter 미들웨어를 호출하려면 라이브러리가 서비스 컨테이너에 추가되기 전에 서비스 등록의 위치를 지정합니다.To invoke an IStartupFilter middleware before a middleware added by a library's IStartupFilter, position the service registration before the library is added to the service container. 나중에 호출하려면 라이브러리가 추가된 후에 서비스 등록의 위치를 지정합니다.To invoke it afterward, position the service registration after the library is added.

추가 리소스Additional resources