ASP.NET MVC 라우팅 개요
이번 자습서에서는ASP.NET MVC 응용 프로그램에서 중요한 특징인ASP.NET 라우팅을 소개합니다. 이 라우팅 모듈은 브라우저 요청을 특정 컨트롤러 액션으로 연결하는 책임을 갖고 있습니다. 이 자습서를 다 마치면 여러분은 표준 라우트 테이블이 어떻게 브라우저 요청을 해당 컨트롤러 액션에 연결하는지 이해하게 될 겁니다.
기본 라우트 테이블 사용하기
여러분이 새ASP.NET MVC 응용 프로그램을 생성하는 경우, 응용 프로그램은 자동으로 ASP.NET 라우팅을 사용하도록 구성되는데요. 이 설정은 두 군데에서 확인할 수 있습니다.
첫 번째로 ASP.NET 라우팅은 Web.config 파일에 활성화 되어 있습니다. Web.config 파일에는 라우팅과 관련하여 네 군데의 섹션(즉, system.web.httpModules , system.web.httpHandlers, system.webserver.modules, system.webserver.handlers) 이 놓여져 있습니다. 이 섹션이 없으면 라우팅이 동작하지 않으므로 삭제하지 않도록 유의해야 합니다.
역자 주 : VS 2010 SP1 을 사용하여 MVC2, MVC3 프로젝트를 생성하여 언급된 네 군데의 섹션을 살펴보았으나 내용을 찾을 수 없었습니다. 이 글이 2008년 8월의 글임을 감안하면 MVC 최초 버전에만 해당하는 내용으로 보입니다. 그러니, 해당 섹션이 없다고 긴장하지 마세요~
더 중요한 두 번째 장소는 Global.asax이며, 이 곳에서 라우트 테이블이 생성됩니다. 아시는 바와 같이 Global.asax 파일은 응용 프로그램 최초 시작과 같은 ASP.NET 응용 프로그램의 라이프 사이클 이벤트를 처리할 수 있는 특별한 파일입니다. 라우트 테이블은 Application Start 이벤트의 일부로 생성됩니다.
목록 1은 ASP.NET MVC 응용 프로그램의 기본 Global.asax 파일을 보여주고 있습니다.
목록 1 - Global.asax.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace MvcApplication1
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // 라우트 이름
"{controller}/{action}/{id}", // 매개변수를 포함한 URL
new { controller = "Home", action = "Index", id = "" } // 매개변수 기본값
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
}
MVC 응용 프로그램이 최초로 시작될 때, Application_Start() 메서드가 호출되고 이 메서드에서는RegisterRoutes() 메서드를 호출합니다. 이렇게 호출된 RegisterRoutes() 메서드는 우리가 관심있게 살펴 볼 라우트 테이블을 생성합니다.
기본 라우트 테이블은 Default라고 이름 지어진 간단한 라우트를 포함하고 있습니다. 이 Default 라우트는 URL에서 도메인 다음에 나오는 첫 번째 부분을 컨트롤러 이름으로 취급합니다. 슬래시(/)로 구분되는 두 번째 부분은 액션으로, 세 번째 부분은 id라는 이름의 매개변수로 매핑합니다.
다음의 URL을 웹 브라우저의 주소창에 입력한다고 가정합시다.
/Home/Index/3
Default 라우트는 이 URL을 다음의 매개변수로 매핑합니다.
controller = Home
action = Index
id = 3
그렇기에, /Home/Index/3 과 같은 URL이 요청되면 다음과 같은 코드가 실행됩니다.
HomeController.Index(3)
Default 라우트는 위에서 살펴 본 세 개의 매개변수에 대해 기본 값을 갖고 있습니다. 사용자가 URL의 일부로 컨트롤러를 명시하지 않으면 Home 컨트롤러가 기본으로 설정됩니다. 마찬가지로 액션을 명시하지 않으면 기본 액션은 Index 가 되고, id를 제공하지 않으면 빈 문자열이 id의 기본 값으로 설정됩니다.
역자 주 : MVC 2 이상의 버전에서 id 매개변수는 Global.asax 파일에서 아래와 같이 설정됩니다.
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
이 설정에 의해서, 라우팅 시 MvcHandler클래스가 id매개변수의 값을 찾을 수 없다면 매개변수 자체를 무시하게 됩니다. MVC 프레임워크의 이런 특성 때문에 액션은 메서드의 시그니쳐를 달리하여 overload할 수 없습니다
어떻게 Default 라우트가 URL을 컨트롤러 액션으로 매핑하는지 몇 가지 예제를 들어 보겠습니다. 아래와 같은 URL이 요청됐다고 가정해 봅시다.
/Home
Default 라우트에 설정된 매개변수 기본 값으로 인해서, 위의 URL입력은 목록 2에 존재하는 Index() 메서드가 호출되도록 할 것입니다.
목록 2 - HomeController.cs
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index(string id)
{
return View();
}
}
}
목록 2에서 HomeController 클래스는 id라는 하나의 매개변수를 받는 Index() 메서드를 갖고 있습니다. /Home이라는 URL은 id 매개변수의 값으로 빈 문자열을 갖는 Index() 메서드가 호출되도록 합니다.
MVC 프레임워크가 컨트롤러 액션을 호출하는 동작 원리에 의거하면 /Home 이라는 URL은 목록 3에 있는 Index() 메서드와도 대응할 수 있습니다.
목록 3 - HomeController.cs (매개변수가 없는 Index 액션)
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
}
목록 3의 Index() 메서드는 매개변수를 받지 않습니다. 그렇기에, /Home 이라는 URL도 Index() 메서드를 호출하지만 /Home/Index/3 과 같은 URL도 id 가 무시된 채 Index() 메서드를 호출합니다.
/Home이라는 URL은 또한 목록 4 의 Index() 메서드와도 대응할 수 있습니다.
목록 4 - HomeController.cs (null을 가질 수 있는 매개변수를 받는 Index 액션)
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index(int? id)
{
return View();
}
}
}
목록 4의 Index() 메서드는 정수형 매개변수 하나를 갖고 있습니다. 이 매개변수는 null을 가질 수 있기 때문에 Index() 메서드가 에러없이 호출될 수 있습니다.
하지만, 목록 5와 같이 Index() 메서드를 정의하면 /Home이라는 URL을 통한 접근은 그림 1과 같은 예외를 발생시킵니다. 이는 URL에서 id 매개변수가 생략될 경우, 해당 매개변수 값으로 null을 전달하겠지만 메서드가 정의하고 있는 매개변수는 null을 받을 수 없기 때문입니다.
목록 5 - HomeController.cs (id 매개변수를 갖는 Index 액션)
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index(int id)
{
return View();
}
}
}

그림 1 : 매개변수 값을 기대하는 액션 호출하기
출처 : http://i1.asp.net/asp.net/images/mvc/05/Images1/mvc_tutorial05_cs_figure01.png
/Home/Index/3은 목록 5의 Index 액션에 대해서는 정상적으로 동작합니다. Index() 메서드가 id 매개변수의 값으로 3과 함께 호출되기 때문입니다.
요약
이번 자습서는ASP.NET 라우팅에 대한 간단한 소개가 목적이었습니다. 새ASP.NET MVC 응용 프로그램과 함께 생성되는 기본 라우트 테이블이 사용자로부터의 URL요청과 컨트롤러 액션을 어떻게 매핑하는지 알아 보았습니다.