본문 바로가기
.NET

[.NET] 라우팅(Routing) / Routing in Action

by 가든가든 2023. 3. 8.
728x90

 

Routing

.NET 에서의 Routing은 HTTP 요청의 URL 경로를 처리하는 기능입니다. Routing을 사용하면 클라이언트의 요청 URL을 기반으로 애플리케이션에서 적절한 처리를 수행할 수 있습니다.

라우팅은 다음과 같은 요소들로 이루어져 있습니다.

라우팅 테이블

ASP.NET에서는 라우팅 테이블(Routing Table)이라고 하는 것을 사용하여 URL과 매핑할 액션 메서드 및 컨트롤러를 지정합니다. 이 테이블은 애플리케이션 시작 시 생성되며, 모든 라우팅 규칙이 저장됩니다. 라우팅 테이블은 매우 유연하며, URL 패턴과 매핑할 액션 메서드 또는 컨트롤러를 구성할 수 있습니다.

라우팅 규칙

라우팅 규칙(Routing Rule)은 URL 패턴과 매핑할 액션 메서드 또는 컨트롤러를 정의합니다. URL 패턴은 라우팅 테이블에서 요청된 URL과 일치하는 패턴입니다. 예를 들어, /Home/Index는 Home 컨트롤러의 Index 액션 메서드와 일치합니다.

라우팅 매개 변수

라우팅 규칙에서는 매개 변수를 사용하여 동적 URL을 처리할 수 있습니다. 매개 변수는 URL 패턴의 일부로 지정되며, 괄호({})로 묶인 변수 이름과 일치하는 값을 URL에서 추출합니다. 예를 들어, /Product/Details/{id} id 매개 변수가 포함된 Product 컨트롤러의 Details 액션 메서드와 일치합니다.

라우팅 제한 조건

라우팅 제한 조건(Routing Constraints)은 라우팅 규칙의 일부로 지정되며, 요청된 URL이 일치해야 하는 추가 제한 조건을 정의합니다. 예를 들어, 매개 변수가 숫자여야 한다는 제한 조건을 지정할 수 있습니다.


라우팅 구성

Routing은 .NET Core에서 매우 중요한 요소 중 하나입니다. .NET Core에서는 웹 요청을 처리할 때 Middleware Pipeline을 사용하는데, Middleware Pipeline에서 라우팅 미들웨어가 URL 경로를 처리하고 요청을 적절한 핸들러로 라우팅합니다.

Routing은 두 가지 기본적인 방법으로 구성됩니다. 첫 번째는 Convention-based routing이고, 두 번째는 Attribute-based routing입니다.

Convention-based routing

Convention-based routing은 URL 경로에 따라 애플리케이션의 핸들러를 선택합니다.

예를 들어, /home 라우팅 경로에 대한 핸들러는 HomeController에서의 Index() 메서드와 연결될 수 있습니다. 이러한 연결은 Convention을 기반으로 하며, 개발자는 Convention을 설정하여 URL 경로와 핸들러를 연결할 수 있습니다.

다음은 Convention-based routing을 사용하여 "Index" 액션 메소드에 대한 경로를 "/Home"으로 변경하는 예제 코드입니다.

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

그리고 이에 대응되는 Convention-based routing 설정은 다음과 같습니다.

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optionl }
    );
}

위의 설정에서는 URL 경로가 "{controller}/{action}/{id}" 형식을 따르는 것을 기본값으로 사용하고 있습니다. 여기서 {controller}는 컨트롤러 이름을, {action}은 액션 메소드 이름을 나타냅니다.

따라서 위의 예제 코드에서 HomeController 클래스의 Index 메소드는 URL 경로 "/Home"과 일치하며, Convention-based routing 설정을 통해 해당 경로로 매핑됩니다.

Attribute-based routing

Attribute-based routing은 애플리케이션의 핸들러에 직접 속성을 추가하여 URL 경로와 연결합니다.

예를 들어, [Route("/books")] 속성은 BooksController에서의 Index() 메서드와 /books 경로를 연결합니다.

 

.NET 6에서는 Convention-based routingAttribute-based routing이 모두 개선되었습니다. 새로운 기능으로는 경로 매개 변수 및 쿼리 문자열 매개 변수 처리가 개선되었으며, 더욱 유연한 라우팅 규칙 설정이 가능해졌습니다.

다음은 .NET 6에서 Attribute-based routing을 사용하는 예시입니다.

[ApiController]
[Route("[controller]")]
public class BooksController : ControllerBase
{
    [HttpGet]
    public IActionResult GetAllBooks()
    {
        // ...
    }

    [HttpGet("{id}")]
    public IActionResult GetBookById(int id)
    {
        // ...
    }

    [HttpPost]
    public IActionResult AddBook(Book book)
    {
        // ...
    }
}

이 예시에서는 BooksController 클래스에 [Route("[controller]")] 속성이 지정되어 있으므로 /books 경로와 연결됩니다. GetAllBooks() 메서드는 [HttpGet] 속성을 지정하여 HTTP GET 요청과 연결되며, GetBookById(int id) 메서드는 [HttpGet("{id}")] 속성을 지정하여 /books/{id} 경로와 연결됩니다.

728x90