어플리케이션 시작하기

By Steve Smith

ASP.NET Core 를 통해 여러분의 어플리케이션에서 처리해야 하는 각각의 요청을 완전하게 제어할 수 있습니다. Startup 클래스는 어플리케이션의 진입점으로서, 환경설정을 지정하고 어플리케이션에서 사용할 서비스에 연결하는 작업을 할 수 있는 클래스 입니다. 즉, 개발자들은 Startup 클래스 내에서 어플리케이션에 전달되는 모든 요청에 대한 처리경로를 설정할 수 있습니다.

Startup 클래스

ASP.NET Core 에서 Startup 클래스는 어플리케이션에 대한 진입점으로서, 모든 어플리케이션에 필수적입니다. 여러 환경에 맞춰 여러가지 시작용 클래스와 메서드를 사용할 수 있지만 (참고 Working with Multiple Environments (류지형님)), 어플리케이션의 진입점으로서는 하나의 Startup 클래스 만 사용할 수 있습니다. ASP.NET 은 (전체 네임스페이스에서) Startup 이라는 이름의 클래스를 포함하는 첫 번째 어셈블리를 찾아봅니다. Hosting:Application 이라는 설정 키로 특정한 어셈블리를 Startup 클래스를 찾아볼 어셈블리로 지정할 수도 있습니다. 그 클래스를 public 으로 정의했는지는 상관없습니다. ASP.NET 은 명명규칙에 합당한 이름이기만 하면 클래스를 읽어들일 수 있습니다. 여러 개의 Startup 클래스가 있다하더라도, 예외를 발생시키지 않습니다. ASP.NET 은 네임스페이스에서 유추하여 하나를 선택할 것입니다. (우선 프로젝트의 루트 네임스페이스와 비교해서 일치하는 것이 있다면 그 클래스를 선택합니다. 일치하는 것이 없다면, 네임스페이스를 알파벳순으로 나열하고 그 중 첫 번째 클래스를 선택합니다.)

Startup 클래스의 생성자에서 의존성 주입 을 사용하여 의존성을 선택적으로 지정할 수 있습니다. 일반적으로 어플리케이션을 설정하는 방식은 Startup 클래스의 생성자에서 정의합니다. (참고 설정) 그 외에 Startup 클래스에서 Configure 메서드를 정의해야 하고, ConfigureServices 메서드를 정의할지는 선택할 수 있습니다. 이 두 가지 메서드는 어플리케이션이 시작될 때 호출됩니다.

Configure 메서드

Configure 메서드를 통해 ASP.NET 어플리케이션이 각각의 HTTP 요청에 대해 어떻게 응답할지 지정할 수 있습니다. 가장 단순하게는, 모든 요청에 대해 동일한 응답을 하도록 설정할 수도 있습니다. 하지만, 대부분의 실제 어플리케이션에서는 이보다 많은 기능이 필요합니다. 더 복잡한 처리경로들에 대한 설정을 미들웨어 에 포함시킨 후, IApplicationBuilder 상의 확장 메서드를 통해 사용하도록 할 수 있습니다.

여러분의 Configure 메서드에서는 매개변수로 전달되는 IApplicationBuilder 서비스를 처리해야 합니다. 추가로 IHostingEnvironmentILoggerFactory 와 같은 서비스도 처리해야 할 수 있습니다. 이런 서비스들을 사용할 수 있는 경우에 서버에서 전달합니다. 기본 웹 사이트 템플릿에서 가져온 다음의 예제에서는, 처리경로에서 `BrowserLink <http://www.asp.net/visual-studio/overview/2013/using-browser-link>`_와 에러 페이지들, 정적 파일들, ASP.NET MVC, Identity 를 사용하도록 하기 위해 몇몇 확장 메서드들을 사용하고 있습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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();

    // Add external authentication middleware below. To configure them please see http://go.microsoft.com/fwlink/?LinkID=532715

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

각각의 Use 확장 메서드를 통해 요청 처리경로에 미들웨어 를 추가합니다. 예를 들어, UseMvc 확장 메서드를 통해 라우팅 미들웨어를 요청 처리경로에 추가하고 MVC 를 기본 처리자로 설정합니다.

여러분은 미들웨어 주제에서 미들웨어와 요청 처리경로를 정의하기 위해 IApplicationBuilder 를 사용하는 방법에 대해 알 수 있습니다.

ConfigureServices 메서드

여러분은 Startup 클래스에 어플리케이션에서 사용하는 서비스를 설정하기 위한 ConfigureServices 메서드를 선택적으로 포함시킬 수 있습니다. ConfigureServices 메서드는 Startup 클래스 상의 공개 메서드로서, IServiceCollection 인스턴스를 매개변수로 받고 IServiceProvider 를 선택적으로 반환합니다. ConfigureServicesConfigure 보다 먼저 호출됩니다. 이는 중요한 부분으로서, ASP.NET MVC 같은 몇몇 기능은 ConfigureServices 메서드를 통해 특정 서비스를 추가한 뒤 요청 처리경로에 연결해야 합니다.

Configure 와 마찬가지로, ConfigureServices 내의 우선적인 설정을 필요로 하는 기능들을 IServiceCollection 상의 확장 메서드로 분리하기를 권합니다. 기본 웹 사이트 템플릿에서 가져온 다음 예제에서는 몇몇 Add[Something] 확장 메서드를 통해 Entity 프레임워크와 Identity, MVC 의 서비스를 사용하도록 어플리케이션 설정하고 있습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
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 클래스에서 특정 구현체를 하드코딩하기 보다 메서드의 매개변수를 사용하여 의존성을 지정하였듯이, 미들웨어나 MVC 컨트롤러, 혹은 다른 클래스에 대해서도 의존성을 지정할 수 있습니다.

또한 ConfigureServices 메서드도 어플리케이션에서 사용하고자 하는 설정용 클래스들을 추가해야 하는 곳입니다. 설정에 대해 더 많은 부분을 확인하려면 :doc:’configuration’ 주제를 확인하세요.

Startup 클래스에서 사용할 수 있는 서비스들

ASP.NET Core 에서는 여러분의 어플리케이션이 시작하는 동안 특정 어플리케이션 서비스와 객체를 제공합니다. Startup 클래스의 생성자나 Configure 메서드, ‘’ConfigureServices`` 메서드에 매개변수로서 적절한 인터페이스를 제공하여 이런 서비스들을 요청할 수 있습니다. Startup 클래스의 각 메서드에서 가능한 서비스는 다음과 같습니다.

IApplicationBuilder
어플리케이션의 요청 처리경로를 구축할 때 사용합니다. StartupConfigure 메서드에서만 사용할 수 있습니다. :doc:’request-features’ 에서 더 확인할 수 있습니다.
IHostingEnvironment
현재의 EnvironmentName 과, ContentRootPath, WebRootPath, 웹 루트 파일 제공자를 제공합니다. Startup 생성자와 Configure 메서드에서 사용할 수 있습니다.
ILoggerFactory
로거를 생성하는 방법을 제공합니다. Startup 생성자와 Configure 메서드에서 사용할 수 있습니다. Logging 에서 더 확인할 수 있습니다.
IServiceCollection
현재 컨테이너에 설정된 서비스들의 집합입니다. ConfigureServices 메서드에서만 사용할 수 있습니다. 어플리케이션에서 사용하는 서비스들을 설정하기 위해 사용합니다.

호출되는 순서에 따라 Startup 클래스의 각각의 메서드를 살펴보면, 다음과 같은 서비스들을 매개변수로서 요청합니다.

Startup 생성자 - IHostingEnvironment - ILoggerFactory

ConfigureServices - IServiceCollection

Configure - IApplicationBuilder - IHostingEnvironment - ILoggerFactory

주석

ILoggerFactory 는 생성자에서 설정할 수도 있지만, 일반적으로 Configure 메서드에서 설정합니다. Logging 에서 자세한 내용을 확인하십시오.