2013. 2. 19. 15:00

요즘 많은 사이트가 길어진 주소를 줄이기 위해 단축URL(URL shortening) 이라는 것을 사용합니다.

제 블로그만 해도 위에 보시면 주소가 "http://blog.danggun.net/1554" 이런 식으로 나와 있죠.

 

보통 사람이라면 이 주소를 보고

"이게 뭐가 잘못된 거지?"

라는 생각을 해도 되지만 웹 코딩 좀 해보신 분이 이런 생각을 한다면 기초부터 다시 배우셔야 합니다. -_-a

 

웹프로그래밍에서 주소는 어떤 식으로든 HTML화 되어있는 문서를 지정해야 합니다.

(동적으로 생성되는 것도 포함)

일반적인 루트 주소(http://blog.danggun.net/)나 위와 같은 단축주소도 마찬가지입니다.

 

단지 이것이 최종적으로 눈에 보기기만 안보이는 것뿐이죠 ㅎㅎㅎㅎ

 

단축주소의 경우 단순히 주소길이만 줄이는 효과 외에도 유저를 구분하거나 유저들의 유입경로를 추적하는 용도 등 많은 활용 방법이 있습니다.

그렇다면 이제 구현해볼까요?

 

 

1. 비정규 주소 받아오기 전 처리

위에서도 말했다시피 웹에서는 어떤 식으로든 완성된 HTML 파일이 지정되어야 합니다.

하지만 단축주소는 완성된 HTML 주소가 아니죠.

 

 

일반적으로 저런 주소는 404 에러를 발생시키며 지정된 에러 메시지를 표시하게 됩니다.

 

그렇기 때문에 웹 응용프로그램의 시작점에 우리가 원하는 형태의 주소가 들어올 때 해야 할 동작들을 지정해 주셔야 합니다,.

이러한 동작을 위해서는 Global.asax파일을 조작해야 합니다.

(참고 : [ASP.Net] ASP.Net의 Main은 어디 있을까? (Global.asax파일))

void Application_Start(object sender, EventArgs e)
{
	// 응용 프로그램이 시작될 때 실행되는 코드입니다.
	RouteTable.Routes.MapPageRoute("ID", "{ID}", "~/WebForm1.aspx");
}

 

 

MapPageRoute의 매개변수를 간단하게 설명하자면

첫 번째는 루트의 이름

두 번째는 주소 패턴

세 번째는 패턴 발견시 연결할 주소입니다.

(참고 : MSDN - RouteCollection.MapPageRoute 메서드)

 

이제 실행해봅시다.

 

 

주소 패턴에 적중하는 페이지를 찾게되면 MapPageRoute에 지정된 페이지로 넘어가게 됩니다.

 

 

2. 주소 처리

이제 이렇게 이동된 페이지를 통해 원하는 페이지로 이동시키거나 특정 동작을 하면 됩니다.

그러면 비하인드 코드를 이용하여 최상위 주소 다음에 오는 값이 무엇인지 표시해 봅시다.

 

2-1. 디자인 코드
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebForm1" enableEventValidation="false" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
	<script language="javascript" type="text/javascript">

		function view()
		{
			//주소 입력
			document.getElementById("<%=hfParentUrl.ClientID %>").value = parent.location.href;

			//비하인드 호출
			//__doPostBack('<%=btnGetUrl.ClientID %>', '');
			<%= Page.GetPostBackEventReference(btnGetUrl) %>
		}
	</script>
</head>

<body>
    <form id="form1" runat="server">
    	<asp:label ID="Label1" runat="server" text="Label"></asp:label>		
		<input id="Button1" type="button" value="button" onclick="view();" />
		
		<asp:HiddenField ID="hfParentUrl" runat="server" />
		<asp:Button ID="btnGetUrl" runat="server" Height="0px" Text="Button" 
			Width="0px" Visible='false' onclick="btnGetUrl_Click"   />
    </form>
</body>
</html>

 

2-2. 비하인드 코드
public partial class WebForm1 : System.Web.UI.Page
{
	protected void Page_Load(object sender, EventArgs e)
	{
	}
	protected void btnGetUrl_Click(object sender, EventArgs e)
	{
		string[] sUrl = hfParentUrl.Value.Split('/');
		Label1.Text = sUrl[3];
	}
}

 

 

참암 쉽죠잉?

 

 

마무리

물론 완성된 HTML 주소라는 건 주소 줄에 표시되는 주소를 말하는 게 아닙니다.

내부적으로 웹서버에서나 스크립트로 주소 자체를 숨기는 건 쉽습니다.

 

어떤 방식이든 결국 완성된 HTML 문서가 나와야 한다는 건 변함이 없다는 거죠.