ASP.NET Core와 응용 프로그램 Startup 클래스

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

Startup 클래스는 응용 프로그램으로 들어오는 모든 요청을 처리하는 요청 파이프라인을 구성합니다.

Startup 클래스

ASP.NET Core 응용 프로그램에는 Startup 클래스가 반드시 존재해야 합니다. 관례상, Startup 클래스는 "Startup"이라는 이름을 사용합니다. 그러나 프로그램의 Main 메서드에서 WebHostBuilderExtensions 클래스의 UseStartup<TStartup> 메서드를 호출할 때 Startup 클래스의 이름을 다르게 지정할 수도 있습니다.

각각의 환경마다 별도의 Startup 클래스를 정의할 수 있으며, 그 경우 런타임에 적절한 클래스가 선택됩니다. WebHost 구성이나 옵션에서 startupAssembly를 지정하면, 호스팅이 지정한 시작 어셈블리를 로드하고 Startup 또는 Startup[Environment] 형식을 찾습니다. 더 자세한 정보는 StartupLoader 클래스의 FindStartupType 메서드와 다양한 환경에서 작업하기 문서를 참고하시기 바랍니다. 이 중, UseStartup<TStartup> 메서드를 호출하는 방식이 권장되는 접근 방식입니다.

Startup 클래스의 생성자는 의존성 주입을 통해서 제공되는 의존성을 전달받을 수 있습니다. 그리고 이렇게 전달되는 의존성을 이용해서, 예를 들어서 IHostingEnvironment를 이용해서 구성 원본을 설정하고, ILoggerFactory를 이용해서 로깅 공급자를 설정할 수 있습니다.

Startup 클래스에는 반드시 Configure 메서드가 존재해야 하며, 필요에 따라 ConfigureServices 메서드가 존재할 수도 있는데, 이 두 메서드 모두 응용 프로그램이 구동될 때 자동으로 호출됩니다. 또한 Startup 클래스에는 이 메서드들의 환경별 버전이 포함되어 있을 수도 있습니다.

응용 프로그램이 구동되는 동안 발생하는 예외를 처리하는 방법은 여기를 참고하시기 바랍니다.

Configure 메서드

Configure 메서드는 ASP.NET Core 응용 프로그램이 HTTP 요청에 응답하는 방식을 지정합니다. 요청 파이프라인은 의존성 주입으로 제공된 IApplicationBuilder 인스턴스에 미들웨어 구성 요소들을 추가함으로써 구성됩니다.

다음 예제는 기본 웹 사이트 템플릿에서 가져온 것으로, 몇 가지 확장 메서드를 이용해서 브라우저 링크, 오류 페이지, 정적 페이지, ASP.NET MVC 및 Identity를 지원하는 파이프라인을 구성하고 있습니다:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
        app.UseBrowserLink();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseStaticFiles();

    app.UseIdentity();

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

각각의 Use 확장 메서드는 요청 파이프라인에 미들웨어 구성 요소를 추가합니다. 예를 들어서, UseMvc 확장 메서드는 요청 파이프라인에 라우팅 미들웨어를 추가하고 MVC를 기본 처리기로 구성합니다.

IApplicationBuilder를 사용하는 자세한 방법은 미들웨어 문서를 참고하시기 바랍니다.

또한 Configure 메서드의 시그니처에 IHostingEnvironmentILoggerFactory 같은 서비스를 지정할 수도 있으며, 해당 서비스를 사용할 수 있는 경우 지정한 서비스가 주입됩니다.

ConfigureServices 메서드

ConfigureServices 메서드는 선택 사항이지만, 사용할 경우, 런타임에 의해 Configure 메서드보다 먼저 호출됩니다 (일부 기능은 요청 파이프라인에 연결되기 전에 추가됩니다). 구성 옵션은 이 메서드에서 설정됩니다.

각 기능들의 실질적인 설정은 IServiceCollectionAdd[Service] 확장 메서드를 통해서 수행됩니다. 기본 웹 사이트 템플릿에서 가져온 다음 예제는 응용 프로그램에서 Entity Framework, Identity 및 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>();
}

이 메서드에서 서비스 컨테이너에 서비스를 추가하면 응용 프로그램에서 의존성 주입을 통해서 해당 서비스를 사용할 수 있습니다.

Startup 클래스에서 사용 가능한 서비스

ASP.NET Core의 의존성 주입은 응용 프로그램이 구동되는 중에도 응용 프로그램의 서비스를 제공합니다. Startup 클래스의 생성자 또는 Configure 메서드나 ConfigureServices 메서드의 매개 변수로 적절한 인터페이스를 지정해서 서비스를 요청할 수 있습니다.

다음은 Startup 클래스의 각 메서드를 호출되는 순서대로 정리한 것으로, 이하와 같은 서비스들을 매개 변수로 요청할 수 있습니다:

  • 생성자: IHostingEnvironment, ILoggerFactory

  • ConfigureServices 메서드: IServiceCollection

  • Configure 메서드: IApplicationBuilder, IHostingEnvironment, ILoggerFactory, IApplicationLifetime

추가 자료