OWIN 및 Katana 시작하기

등록일시: 2015-07-20 08:00,  수정일시: 2016-09-02 08:48
조회수: 7,191
이 문서는 OWINKatana 프로젝트를 널리 알리고자 하는 개인적인 취지로 제공되는 번역문서입니다. 이 문서에 대한 모든 저작권은 마이크로소프트에 있으며 요청이 있을 경우 언제라도 게시가 중단될 수 있습니다. 번역 내용에 오역이 존재할 수 있고 주석은 번역자 개인의 의견일 뿐이며 마이크로소프트는 이에 관한 어떠한 보장도 하지 않습니다. 번역이 완료된 이후에도 대상 제품 및 기술이 개선되거나 변경됨에 따라 원문의 내용도 변경되거나 보완되었을 수 있으므로 주의하시기 바랍니다.
OWIN(Open Web Interface for .NET)은 .NET 웹 서버와 웹 응용 프로그램 간의 추상화를 정의하고, 웹 서버를 응용 프로그램으로부터 분리함으로서 .NET 웹 개발에 사용되는 미들웨어의 작성을 손쉽게 만들어 줄뿐만 아니라, OWIN을 사용하면 웹 응용 프로그램을 Windows 서비스나 다른 프로세스에서 자체-호스트 하는 등, 손쉽게 다른 호스트로 이식할 수 있습니다.

OWIN(Open Web Interface for .NET)은 .NET 웹 서버와 웹 응용 프로그램 간의 추상화를 정의합니다. 그리고 웹 서버를 응용 프로그램으로부터 분리함으로서 .NET 웹 개발에 사용되는 미들웨어의 작성을 손쉽게 만들어 줍니다. 뿐만 아니라, OWIN을 사용하면 웹 응용 프로그램을 Windows 서비스나 다른 프로세스에서 자체-호스트 하는 등, 손쉽게 다른 호스트로 이식할 수 있습니다.

OWIN은 커뮤니티에서 소유하는 명세서로, 실제 구현이 아닙니다. 반면 Katana 프로젝트는 Microsoft가 오픈 소스로 개발한 OWIN 구성 요소들의 모음입니다. OWIN과 Katana에 대한 전반적인 개념은 Katana 프로젝트 기사를 참고하시기 바랍니다. 본문에서는 자세한 설명 없이 바로 코드부터 작성해보려고 합니다.

본 자습서에서는 Visual Studio 2013을 사용하고 있지만 Visual Studio 2012를 사용해도 무방합니다. 다만 Visual Studio 2012를 사용할 경우에는 몇 가지 과정에 차이점이 존재하므로 그럴 때마다 간단하게 설명을 드리도록 하겠습니다.

IIS를 이용한 OWIN 호스트

이번 절에서는 우선 OWIN을 IIS에 호스트 해보겠습니다. 이 방식을 선택하면 OWIN 파이프라인이 제공해주는 유연성, 조합성과 함께 IIS가 제공해주는 성숙한 기능들의 이점을 동시에 얻을 수 있습니다. 그리고 이 경우, OWIN 응용 프로그램은 ASP.NET의 요청 파이프라인에서 실행됩니다.

먼저 새로운 ASP.NET 웹 응용 프로그램(ASP.NET Web Application) 프로젝트를 생성합니다. (Visual Studio 2012에서는 ASP.NET 빈 웹 응용 프로그램(ASP.NET Empty Web Application) 프로젝트 형식을 사용합니다.)

그리고 새 ASP.NET 프로젝트(New ASP.NET Project) 대화 상자에서 Empty 템플릿을 선택합니다.

NuGet 패키지 추가하기

이제 필요한 NuGet 패키지를 추가해야 합니다. 도구(Tools) 메뉴에서 라이브러리 패키지 관리자(Library Package Manager) 또는 NuGet 패키지 관리자를 선택한 다음, 패키지 관리자 콘솔(Package Manager Console)을 선택합니다. 그리고 열린 패키지 관리자 콘솔(Package Manager Console) 창에 다음 명령을 입력합니다:

install-package Microsoft.Owin.Host.SystemWeb –Pre

시작 클래스 추가하기

이번에는 OWIN 시작 클래스를 추가해 보겠습니다. 솔루션 탐색기(Solution Explorer)에서 프로젝트를 마우스 오른쪽 버튼으로 클릭한 다음, 추가(Add)를 선택하고 다시 새 항목(New Item)을 선택합니다. 그리고 새 항목 추가(Add New Item) 대화 상자가 나타나면 Owin 시작 클래스(Owin Startup class)를 선택합니다. 시작 클래스를 구성하는 방법에 대한 보다 자세한 정보들은 OWIN 시작 클래스 감지방식 기사를 참고하시기 바랍니다.

계속해서 다음 코드를 Startup1.Configuration 메서드에 추가합니다:

public void Configuration(IAppBuilder app)
{
    // New code:
    app.Run(context =>
    {
        context.Response.ContentType = "text/plain";
        return context.Response.WriteAsync("Hello, world.");
    });
}

이 코드는 Microsoft.Owin.IOwinContext의 인스턴스를 전달 받는 함수로 구현된 극히 간단한 미들웨어를 OWIN 파이프라인에 추가합니다. 그 결과, 서버가 HTTP 요청을 수신하면 OWIN 파이프라인이 이 미들웨어를 호출합니다. 그러면 미들웨어가 응답의 콘텐트 형식을 설정하고 응답 본문을 작성하게 됩니다.

노트: Owin 시작 클래스(Owin Startup class) 템플릿은 Visual Studio 2013에서만 사용할 수 있습니다. Visual Studio 2012를 사용하고 있다면 간단히 Startup1이라는 이름으로 새로운 빈 클래스를 추가하고, 다음의 코드를 붙여 넣으십시오:

using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(OwinApp.Startup1))]

namespace OwinApp
{
    public class Startup1
    {
        public void Configuration(IAppBuilder app)
        {
            app.Run(context =>
            {
                context.Response.ContentType = "text/plain";
                return context.Response.WriteAsync("Hello, world.");
            });
        }
    }
}

응용 프로그램 실행하기

이제 F5 키를 눌러서 디버깅을 시작합니다. 그러면 Visual Studio가 브라우저 창을 열고 http://localhost:port/ 페이지로 이동합니다. 아마 결과 페이지의 모습은 다음과 비슷할 것입니다:

콘솔 응용 프로그램을 이용한 OWIN 자체 호스트

방금 작성한 예제 응용 프로그램을 IIS 호스트 방식에서 사용자 지정 프로세스를 이용한 자체 호스트 방식으로 변환하는 작업은 매우 간단합니다. IIS 호스트 방식에서는 IIS가 HTTP 서버와 그 서버를 호스트 하는 프로세스의 역할을 모두 수행합니다. 반면 자체 호스트 방식에서는 직접 작성한 응용 프로그램이 프로세스를 생성하고 HTTP 서버로는 HttpListener 클래스가 사용됩니다.

다시 Visual Studio로 돌아가서 새로운 콘솔 응용 프로그램 프로젝트를 생성합니다. 그리고 패키지 관리자 콘솔(Package Manager Console) 창에 다음 명령을 입력합니다:

Install-Package Microsoft.Owin.SelfHost -Pre

계속해서 이번에는 콘솔 응용 프로그램 프로젝트에 본 자습서의 이전 절에서 추가했던 Startup1 클래스를 추가합니다. 클래스의 내용을 변경할 필요는 없습니다.

마지막으로 응용 프로그램의 Main 메서드를 다음과 같이 구현합니다.

class Program
{
    static void Main(string[] args)
    {
        using (Microsoft.Owin.Hosting.WebApp.Start<Startup1>("http://localhost:9000"))
        {
            Console.WriteLine("Press [enter] to quit...");
            Console.ReadLine();
        }
    }
}

이제 콘솔 응용 프로그램을 실행하면 서버가 시작되고 http://localhost:9000으로 들어오는 요청을 대기하기 시작합니다. 웹 브라우저로 이 주소에 접근해보면 "Hello world" 페이지를 확인할 수 있을 것입니다.

OWIN Diagnostics 추가하기

Microsoft.Owin.Diagnostics 패키지는 처리되지 않은 예외를 잡고, 상세한 오류 정보를 보여주는 HTML 페이지를 출력하는 미들웨어를 담고 있습니다. 이 오류 페이지 기능은 마치 "죽음의 노란 화면(YSOD, Yellow Screen Of Death)"이라고 불리우는 ASP.NET 오류 페이지와도 매우 비슷합니다. 개발이 진행 중인 동안에는 Katana 오류 페이지 역시 YSOD처럼 유용하지만, 운영 환경에서는 비활성화하는 것이 좋습니다.

프로젝트에 Diagnostics 패키지를 설치하려면, 패키지 관리자 콘솔(Package Manager Console) 창에 다음 명령을 입력합니다:

install-package Microsoft.Owin.Diagnostics –Pre

그런 다음, Startup1.Configuration 메서드의 코드를 다음과 같이 수정합니다:

public void Configuration(IAppBuilder app)
{
    // New code: Add the error page middleware to the pipeline. 
    app.UseErrorPage();

    app.Run(context =>
    {
        // New code: Throw an exception for this URI path.
        if (context.Request.Path.Value == "/fail")
        {
            throw new Exception("Random exception");
        }

        context.Response.ContentType = "text/plain";
        return context.Response.WriteAsync("Hello, world.");
    });
}

이번에는 Visual Studio가 예외를 잡지 않도록 CTRL+F5 키를 눌러서 디버깅 없이 응용 프로그램을 시작합니다. 그러면 응용 프로그램이 지금까지와 별다른 차이점 없이 그대로 실행될 것입니다. 그러나 응용 프로그램이 예외를 던지도록 지정된 http://localhost/fail URL로 이동해보면 상황이 바뀌게 됩니다. 즉, 오류 페이지 미들웨어가 예외를 잡아서 오류에 대한 정보들을 HTML 페이지로 출력해주는 것입니다. 이 페이지에서 탭들을 눌러보면 스택, 쿼리 문자열, 쿠키, 요청 헤더, 그리고 OWIN 환경 변수들을 살펴볼 수 있습니다.

다음 과정

이 기사는 2013년 9월 27일에 최초 작성되었습니다.