본문 바로가기
기타

[ASP.NET Core/Devroup] URL 요청에 대한 메서드 매핑에 관해서

by 항붕쿤 2023. 3. 25.

/User url에 대한 요청으로 Index메서드가 아니라 Create 메서드로 매핑하기 위해 Program.cs 파일을 수정했는데

app.MapControllerRoute(
    name: "User",
    pattern: "User",
    defaults: new { controller = "User", action = "Create" }
);

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Post}/{action=Index}/{id?}");

로 코딩하면 정상적으로 작동하지만

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Post}/{action=Index}/{id?}");

app.MapControllerRoute(
    name: "User",
    pattern: "User",
    defaults: new { controller = "User", action = "Create" }
);

로 코딩하면 /User에 대한 요청으로 User컨트롤러의 Index메서드로 매핑된다.
두 코드에서 다른점은 순서인데 왜 순서때문에 서로 다른 결과가 나온 것일까?

일반적으로 Asp.net core의 라우팅은 순서대로 매핑을 시도한다. 따라서 먼저 등록된 라우트부터 매핑을 시도하고, 해당하는 라우트가 없으면 다음 라우트를 시도하게 되는 것이다.

Program.cs 파일에서 name 매개변수는 라우트의 고유 이름을 지정하는 데 사용된다. default는 Asp.net core에서 제공하는 기본적인 라우트 이름이다. 일반적으로 name 매개변수를 지정하지 않으면 default 라우트가 사용된다.
즉, Asp.net core에서 default 라우트는 특별한 의미를 갖는다. 요청 URL이 라우트 템플릿과 일치하지 않는 경우, default 라우트가 요청을 처리하게 되는 것이다.

따라서 /User url에 접속하게 되면 default 라우터가 사용되며 뒤의 라우트는 무시된다.

그래서 app.MapControllerRoute를 등록할 때는 먼저 User 컨트롤러에 대한 라우트를 등록한 후에, 그 다음에 기본 라우트를 등록하는 것이 좋다. 이렇게 하면 /User에 대한 요청이 먼저 등록된 User 컨트롤러 라우트에 매핑되어 Create 액션 메서드가 실행된다.