본문 바로가기
ASP.NET Core

ASP.NET MVC vs ASP.NET Core] Routing 차이

by Fastlane 2023. 2. 9.
728x90
반응형

Routing은 browser request를 특정 controller action 또는 Razor Page handler로 매핑한다.

  • ASP.NET MVC

라우팅에 2가지 방법이 있다. 

1. route table : request를 controller action으로 match하는 route collection

앱이 시작될 때 구성된다. Application_Start()함수에서 등록한다. route table은 RouteCollection에 의해 관리된다. 

public class MvcApplication : System.Web.HttpApplication
{
    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 = "" },
            constraints: new { id = "\\d+" }
        );
    }

    protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);
    }
}

2. attribute routing

[Route] attribute를 사용하여 개별 action method가 자신의 route를 정의할 수 있다. MVC5는 controller level의 [Route], [RoutePrefix], [RouteArea] attribute를 사용할 수 있다. 

public class ProductsController
{
    [Route("products")]
    public ActionResult Index()
    {
        return View();
    }

    [Route("products/{id}")]
    public ActionResult Details(int id)
    {
        return View();
    }
}

특성 라우팅을 설정하려면 기본 경로 테이블 구성에 한 줄을 추가해야 합니다.

routes.MapMvcAttributeRoutes();

[RouteArea] attribute로 route 제약조건을 설정할 수 있다. area를 사용하려면 한 줄을 추가해야 한다. 

AreaRegistration.RegisterAllAreas();
728x90
  • ASP.NET Core

request url을 action 또는 다른 endpoint로 매치하는 routing middleware에 의해 처리된다. Endpoint는 실행가능한 request처리 code단위이며, 앱 시작시 구성된다.  

 

app.UseRouting();

기본 라우팅

var app = builder.Build();
app.MapGet("/", () => "Hello World!");
//HTTP Get 요청이 root url로 전송되면 request delegate가 실행되고 Hello World!가 HTTP Response로 전달된다. 
//Get이 아니거나, root url 요청이 아니면 HTTP 404 error를 반환한다. 
app.Run();

Routing은 UseRouting, UseEndPoints에 의해 등록되는 middleware쌍을 사용한다. 

  • UseRouting : routing matching을 추가한다. 이 middleware는 app에 정의된 endpoints를 찾아서 최상의 match를 선택한다. 
  • UseEndpoints : endpoint실행을 추가한다. 선택된 endpoint와 관련된 delegate를 실행한다. 

앱은 일반적으로 UseRouting, UseEndpoints를 호출하지 않는다. 하지만 앱이 UseRouting, UseEndpoints를 호출하여 실행순서를 변경할 수 있다. 

 

EndpointRouteBuilderExtensions class에서 제공하는 확장함수 외에 다음과 같은 추가함수를 사용할 수 있다. 

  • Razor Pages의 MapRazorPages
  • controllers의 MapControllers : ControllerEndpointRouteBuilderExtensions class의 확장함수
  • SignalR을 위한 MapHub<THub>
  • gRPC를 위한 MapGrpcService<TService>

Controller action routing

  • controller, view와 함께 사용되는 Conventional routing
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

다음의 편의를 위한 함수로 대체할 수 있다. 

app.MapDefaultControllerRoute();

여러개의 Conventional routing을 설정할 수도 있다. 

app.MapControllerRoute(name: "blog",
                pattern: "blog/{*article}",
                defaults: new { controller = "Blog", action = "Article" });
app.MapControllerRoute(name: "default",
               pattern: "{controller=Home}/{action=Index}/{id?}");
  • REST API와 함께 사용되는 Attribute routing
//지정된 route없이 controller action에 endpoints를 추가한다. 
app.MapControllers();

Route attribute 또는 HTTP method attribute를 사용해서 경로를 지정할 수 있다. 

class level에서는 Route attribute를 사용한다. 상속해서 사용할 수도 있다. 

    [Route("api/[controller]")]
    [ApiController]
    public class PlatformsController : ControllerBase
    {
    
    }
    [ApiController]
    public class PlatformsController : ControllerBase
    {
        [HttpGet("api/products/{id}")]
        public async ActionResult<Product> Details(int id)
        {
         // ...
        }

    }
728x90
반응형

댓글