참조
https://learn.microsoft.com/en-us/previous-versions/aspnet/cc668201(v=vs.100)
ASP.NET Routing
- URL이 특정 파일에 매핑될 필요 없이, 더 직관적이고 사용자 친화적인 URL을 사용할 수 있도록 함
→ URL이 물리적인 파일 경로에 의존하지 않음
- 실제 URL이 변경되는 게 아니라, 라우팅 시스템이 기존 URL에서 필요한 값을 추출하여 처리함
동작 방식 비교
1) 라우팅을 사용하지 않는 경우
- URL이 웹 사이트의 물리적 파일에 매핑됨
ex) https://server/application/Products.aspx?id=4
→ 실제 서버에 있는 Products.aspx 파일에 매핑됨
2) 라우팅을 사용하는 경우
- URL 패턴을 정의하고, 그 패턴에 따라 값들을 분해하여 처리함
ex) https://server/application/Products/show/beverages
→ Routing Parser는 Products, show, beverages 등의 값을 추출하여 핸들러에 전달함
장점
1) URL 가독성 UP
: URL에 의미 있는 값을 포함시킴 → 사용자가 더 직관적이고 쉽게 이해할 수 있음
2) 일관된 URL 구조 유지
: URL 패턴을 사용하여, URL 생성 로직을 중앙에서 관리함
→ 애플리케이션 전반에 걸쳐 일관된 URL 구조를 유지할 수 있음
3) URL 패턴 변경 용이
: URL 패턴을 변경하면 애플리케이션 전체의 URL이 자동으로 새로운 패턴을 따르게 됨
4) 자동 URL 생성
: 매개변수 값을 메서드에 전달하면, 그에 맞는 URL을 자동으로 생성하는 API를 제공함
※ ASP.NET Routing과 비슷해 보이지만 다른 개념
URL Rewriting
- 기존의 URL을 실제로 변경하여 요청을 처리함
→ Routing에 비해 덜 유연함
- 클라이언트가 요청한 URL을 서버 측에서 변경하고, 변경한 URL에 맞는 페이지를 요청하여 응답함
- API 지원 부족
→ URL 패턴이 변경되면 기존 패턴에 맞춰 작성된 모든 하이퍼링크를 수동으로 수정해야 함
URL Routes
- Routing에서 정의하는 URL 패턴
- Placeholder를 사용하여 URL에서 값을 추출하는 방법을 지정함
→ URL 요청을 파싱하여 동적인 값을 추출할 수 있음
[구성요소]
1) URL 매개변수 (Placeholder)
- 라우팅 시 값을 추출할 수 있는 위치
- 중괄호 {}로 감싸져 있음
2) 구분자
- 구분자를 기준으로 URL을 나누어 값들을 Placeholder에 매핑함
- 슬래시 (/)
- 구분자 외에 다른 상수 값으로도 값을 나눌 수 있음
[예시]
- URL 패턴 : {language}-{country}/{action}
- 요청된 URL : ko-KR/edit
→ language: ko / country : KR / action : edit
정의 방법
# Global.asax 파일의 Application_Start 이벤트 핸들러에서 라우트 추가
protected void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.Add(new Route
(
"Category/{action}/{categoryName}"
, new CategoryRouteHandler()
));
}
# 특정 파라미터가 생략될 경우에도 사용할 수 있도록 기본값 설정
- Route 클래스의 Defaults 속성에 딕셔너리 형태로 기본값을 지정할 수 있음
void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.Add(new Route
(
"Category/{action}/{categoryName}"
new CategoryRouteHandler()
)
{
Defaults = new RouteValueDictionary
{{"categoryName", "food"}, {"action", "show"}}
}
)
}
# 마지막 매개변수가 URL의 나머지 부분과 일치하도록 설정
- 마지막 매개변수에 별표(*)를 표시하여, Catch-All Parameter로 지정할 수 있ㅇ므
- 마지막 매개변수에 대한 값이 없는 URL인 경우 빈 문자열이 들어감
query/{queryname}/{*queryvalues}
라우팅 동작 변경
# 모든 요청에 대해 라우팅 적용
- 기본적으로, 요청이 실제 물리적 파일에 매핑된다면 해당 요청은 라우팅이 처리하지 않고 해당 파일로 직접 전달됨
→ 모든 요청에 대해 라우팅이 적용되도록 하려면 RouteCollection 객체의 RouteExistingFiles 속성을 true로 설정
routes.RouteExistingFiles = true;
# 특정 URL 요청에 대한 라우팅 방지
routes.Add(new Route("{resource}.axd/{*pathInfo}", new StopRoutingHandler()));
URL 생성
public class Global : HttpApplication
{
void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.Add(new Route
(
"Category/{action}/{categoryName}",
new CategoryRouteHandler()
));
}
public static string GenerateUrl(string action, string categoryName)
{
var parameters = new RouteValueDictionary
{
{ "action", action },
{ "categoryName", categoryName }
};
var virtualPathData = RouteTable.Routes.GetVirtualPath(null, parameters);
return virtualPathData?.VirtualPath; // ?. : 객체가 null인지 확인한 후 접근
}
}
'C#' 카테고리의 다른 글
[C#/Dapper] SELECT 쿼리 / 프로시저 실행 (5) | 2024.11.13 |
---|---|
[C#] 값 형식 (Value types) & 참조 형식 (Reference types) (0) | 2024.10.25 |
[C#/dotnet] 서버 컨트롤 (0) | 2024.10.24 |
[C#/dotnet] View State (1) | 2024.10.24 |
[C#/dotnet] 페이지 구조 - 마스터 페이지 & 콘텐츠 페이지 (1) | 2024.10.24 |