센로그

4. Routing 본문

게임/ASP.NET Core

4. Routing

seeyoun 2024. 4. 15. 22:29

◆ Routing

HTTP request가 들어오면 이를 담당 handler에게로 라우팅해줘야 한다. (ASP.NET Core에서는, 담당 액션에게로)
 
이때 라우팅 방법은 크게 두 가지로 나뉜다.

  • 코드를 통한 라우팅
    • 라우팅 패턴 설정 (MVC에서 주로 사용)
    • 어트리뷰트 라우팅 (WebAPI에서 주로 사용)
  • 폴더 구조 자체를 통한 라우팅

 
폴더 구조 라우팅은 직관적이니 패스하고, 여기서는 코드를 통한 라우팅을 공부해볼 것이다.
 


라우팅 패턴

다음은 program.cs에서 라우팅을 하던 코드임

//라우팅 패턴 설정
app.MapControllerRoute(
    name: "default",
    // '컨트롤러 이름, 액션 이름, 아이디' 형태로 라우팅 패턴에 맞게끔 코드를 연동시켜줌. (기본 관례)
    pattern: "{controller=Home}/{action=Index}/{id?}");
  • name: 해당 라우팅 패턴의 이름. (다수의 라우팅 패턴을 설정할 수 있다!!)
  • pattern: 라우팅 패턴의 기본 관례(Convention)는 위와같이 Controller/Action/Id 형식임.

 
HTTP 요청이 라우팅되려면, (미들웨어 파이프라인에 의해) 라우팅 미들웨어까지 요청이 전달되어야 함.

  • 보통 라우팅하는 미들웨어는 파이프라인의 최하단에 두곤 함
    • 요청 타입이 맞는지, 데이터 타입이 맞는지 등에 관한 미들웨어를 통과한 요청만 최종적으로 라우팅하러 가는 것임.
  • 따라서 해당 부분까지 도달하지 않고 중간에 에러가 난다면, 라우팅이 적용이 안될 수도 있음! 참고

 
암튼 파이프라인 끝까지 도달했으면, 라우팅 패턴을 보며 규칙을 찾을 것임.
MVC에서는 기본적으로 MapControllerRoute()에 의해 라우팅 규칙을 결정함.

  • 이때 여러 종류의 라우팅 패턴을 설정할 수도 있음

 
 
이해를 위해 간단한 라우팅 패턴 예제를 볼 것이다.
 
다음과 같은 라우팅 패턴이 있다고 하자.

app.MapControllerRoute(
    name: "test",
    pattern: "hungry/{controller}/{action}/{id?}");
  • 위 코드에서 "hungry"의 경우, 요청할 때 항상 입력해야 하는 literal value, 즉 고정 문자열임. (대괄호 안에 있지 X)
  • 위 코드에서 {controller}, {action} 같이 중괄호로 감싸진 것들은 route parameter라고 함. 라우팅을 하기 위한 인자.
    • 라우트 파라미터는 어떤 이름으로든 설정할 수 있음.
      단, 'controller'와 'action'은 무조건 지정되어야 함. (매칭 또는 기본값으로 지정)
    • {controller=Home}/{action=Index} 이런식으로 '='을 사용하는 경우, optional route parameter 라고 함.
      • 없으면 알아서 기본값으로 설정을 해주겠다는 뜻.
    • {id?} 처럼 '?'가 붙은 경우에도 optional route parameter임.
      • 있어도 되고 없어도 된다는 뜻.

 


라우팅 패턴을 여러 개 만든 경우에는 어떻게 동작할까?

  • 라우팅 패턴이 정의된 순서대로 비교해보하다가, 매칭되는 게 있는 경우 거기로 라우팅됨
  • 더 구체적인 라우팅 패턴으로 매칭됨.

 
ex)

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
    
app.MapControllerRoute(
    name: "test",
    pattern: "hungry/{controller=Home}/{action=Privacy}/{id?}");
  • https://localhost:7080/hungry 를 입력하면,
    두 라우팅 패턴 중에서 hungry가 있는 패턴인 test패턴으로 매핑되어 Privacy 페이지로 감.
  • 사실 default 패턴을 먼저 체크할텐데, 이 경우 입력한 hungry가 controller에 들어갈 것.
    그러나 hungryController는 없으므로 통과하고 아래로 내려간 것임.

 


어트리뷰트 라우팅

말그대로 C# 어트리뷰트를 통해 라우팅하는 거임
 

  • 기본적으로 MVC에서는 MapControllerRoute()의 패턴을 이용한 방식으로 라우팅을 하지만,
    경우에 따라 Attribute Routing을 사용해서 덮어쓸 수도 있음. 
  • Web API에서는 이 방식을 주로 사용함!!

 
만약 컨트롤러의 Privacy 액션 함수 위에 다음과 같은 라우팅 애트리뷰트를 넣는다면!?

[Route("cute")]
public IActionResult Privacy()
{
    ViewData["Message"] = "Data From Privacy";
    return View();
}
  • 미들웨어에서 정의한 라우팅 규칙과 상관없이,
    https://localhost:7080/cute를 입력하는 경우 항상 Privacy 액션이 실행됨.

 
 
더 자세한 내용은 WebAPI에서 다룰 것임


Constraint 

라우팅 패턴을 만들 때 각종 제약 사항을 추가할 수 있음.

  • 예를들어 route parameter 중 id의 경우 정수 타입만 ㅇㅋ하겠다! 라고 설정할 수 있음.

 
ex) Constraint를 구성 예시
다음은 id라는 route parameter에 constraint를 부여하는 예시이다.

  • {id: int}  //정수만 ㅇㅋ
  • {id: min(18)}  //18이상 정수만 ㅇㅋ
  • {id: length(5)}  //5글자 string만 ㅇㅋ

 


Anonymous Object

default값과 constraint는 anonymous object를 통해서 MapControllerRoute의 인자로 넣어줌으로써 설정해줄 수도 있음.
 
다음 두 패턴은 같은 패턴임.

app.MapControllerRoute(
    name: "default1",
    pattern: "{controller=Home}/{action=Index}/{id : int}");

 

app.MapControllerRoute(
    name: "default2",
    pattern: "{id}",
    defaults: new { controller = "Home", action = "Index" },
    constraints: new { id = new IntRouteConstraint() });
  • anonymous object 사용

 


Match-All

라우트 파라미터 앞에 *를 붙이면 어떤 문자열이든 다 매칭시켜줄 수 있음. ('/' 포함).
조커 카드 같은거임.
 
사용되는 경우에는, 맨 마지막 순서에 사용되곤 함.

app.MapControllerRoute(
    name: "joker",
    pattern: "{*joker}",
    defaults: new { controller = "Home", action = "Index" });
  • 어떤 문자열을 입력했든 간에, HomeController의 Index 액션에 매칭된다.

 


Redirection

액션에 도달한 요청을 redirection, 즉 다른 URL로 토스! 하고 싶으면 어떻게 해야할까?
 
리다이렉션을 하는 몇가지 방법이 있음

  1. Redirect(url)
    • url을 통해 리다이렉션
      • url을 직접 입력하거나, url을 만들어서 해당 url로 토스할 수도 있음. 
    • url 만드는 법
      • Url.Action  //특정 액션(또는 액션 및 컨트롤러)으로 연결
        public IActionResult Index()
        {
            string url = Url.Action("Privacy", "Home");
            return Redirect(url);
        }​
        • Index로 들어온 경우, HomeController의 Privacy로 연결.
      • Url.RouteUrl  //특정 라우팅 패턴으로 연결
        아래 test라는 라우팅 패턴이 존재할 때
        app.MapControllerRoute(
            name: "test",
            pattern: "hungry/{controller=Home}/{action=Error}/{testVal}");​

        다음과 같이 RouteUrl을 사용해 리다이렉션 가능
        public IActionResult Index()
        {
            string url = Url.RouteUrl("test", new { testVal = 123 });
            return Redirect(url);
        }
         
        • 이 경우 url은 다음과 같음. 
  2. RedirectToAction()
    • 특정 액션으로 연결 
    • RedirectToAction("Privacy")
  3. RedirectToRoute()
    • 특정 라우팅 패턴으로 연결

 

'게임 > ASP.NET Core' 카테고리의 다른 글

6. View  (0) 2024.04.15
5. Model Binding (+Validation)  (0) 2024.04.15
3. MVC 철학  (0) 2024.04.15
2. Middleware 기초  (0) 2024.04.15
1. MVC 프로젝트 소개 (Program.cs)  (0) 2024.04.15
Comments