반응형

이 포스트는 월간 마이크로소프트웨어에 기고한 원고를 재편집한 포스트입니다. 그러므로, 본의 아니게 반말로 진행되고 있습니다. 원래 싸가지가 없어서 그런 것이 아니니 무한 용서를... ^^;;
또한, .NET Framework 3.5 SP1이 적용되기 이전의 소스이므로, 현재의 개발 환경과 다를 수 있습니다. 마소에 제출한 블로그 소스는 블로그 소스 다운로드에서 다운로드하실 수있습니다.

Default.aspx 페이지의 수정

필자는 지난 호에서 블로그의 첫 화면인 “Default.aspx”에 가장 최근에 등록한 3개의 포스트의 목록을 보여주는 코드를 설명했었다. 지난 호에서 설명한 그 코드를 약간 수정하여 포스트의 제목을 클릭할 때에, 선택한 포스트의 내용을 조회할 수 있는 화면으로 이동하도록 하기 위해서, “Default.aspx”에 정의된 ListView 컨트롤의 구문을 <코드 1>과 같이 변경한다.

<asp:ListView ID="LvwRecentPostList" runat="server" ItemPlaceholderID="phRecentPostList">
    <LayoutTemplate>
        <asp:PlaceHolder ID="phRecentPostList" runat="server"></asp:PlaceHolder>
    </LayoutTemplate>
    <ItemTemplate>
        <h1><a href="/post/<%#Eval("PostID")%>.aspx" target="_self">
        <%#Eval("PostName")%></a></h1>
        <h5>작성일 : <%#Eval("CreateDate")%> | 
        조회수 : <%#Eval("ViewCount")%> | 댓글수 : <%#Eval("CommentCount")%></h5><br />
        <%#ChangePostContent(Eval("PostContent").ToString())%>
        <div style="height:15px;width:100%"><hr /></div>
    </ItemTemplate>
    <EmptyDataTemplate>
        <div style="width:100%">
            <center><h3>등록된 포스트가 없습니다.</h3></center>
        </div>        
    </EmptyDataTemplate>
</asp:ListView>
<리스트 1> ListView 컨트롤의 소스 코드

ListView 컨트롤의 ItemTemplate 템플릿 안에 정의된 포스트의 제목을 클릭할 경우, 웹 페이지는 “/Post/포스트ID.aspx" 페이지로 이동하게 된다. 그렇다면, 각각의 포스트가 만들어질때마다 개별 aspx 페이지를 만들어야 하는가? 그건 그렇지 않다. 이렇게 ”포스트ID.aspx"의 경로와 같이 직관적으로 사용자에게 보이기 위해 각 포스트는 고유링크(퍼마링크, Permalink)를 가지고 있으며, 사용자에게 표시되는 URL 또한 이러한 식으로 표현되지만, 실제로는 ”PostView.aspx?postid=포스트ID"와 같이 PostView.aspx 페이지에 쿼리스트링값으로 postid값을 전달하는 방식을 취한다. 이것을 Url ReWriting이라고 하며, 이 부분에 대해서는 <필자메모>에서 좀 더 자세하게 설명하였다.
<리스트 1>과 같이 코드를 수정한 후의 “Default.aspx” 화면은 <화면 1>과 같이 변경된다.


<화면 1> 수정된 Default.aspx 화면

----------------------------------------------------------------------------------------------------------------
<필자메모>

일반적으로 잘 알려져 있는 블로그의 포스트를 조회 시에 표시되는 URL은 <화면 2>과 같다.


<화면 2> 각 블로그의 URL 정보

블로그는 각 포스트마다 고유링크(퍼마링크, Permalink)를 가지게 된다. 게시판 또는 사이트의 경우는 "게시판URL.aspx?boardID=1&categoryID=1"과 같은 식인 쿼리스트링 값이 그대로 URL에 노출되지만, 블로그의 경우는 <화면 2>에서 보는 것과 같이 포스트마다 고유한 링크를 가진 것처럼 사용자에게 인식되도록 한다. 그러한 퍼마링크는 <화면 2>와 같이 글 고유의 ID값을 가질 수도 있고, 또는 제목을 그대로(MSDN 및 기타 해외 블로그 등) 퍼마링크로 사용할 수도 있다. 필자가 설명하고 있는 VS 2008을 이용한 블로그 프로그래밍도 이러한 퍼마링크를 이용하기 위해서 UrlReWriter.net에서 제공하는 어셈블리를 이용해서 URL을 Rewriting하는 방식을 사용하고 있으며, 필자가 구현하는 블로그에서는 “/Post/포스트ID.aspx"의 형태로 표현되게 된다. URL Rewriting을 사용하기 위해서는, 먼저 http://urlrewriter.net에서 제공하는 소스를 다운로드 받은 후, 웹 사이트의 참조 추가 메뉴를 이용하여 소스에 포함된 Intelligencia.UrlRewriter.dll 어셈블리를 참조한다. 그 후에 Web.Config 파일을 <리스트 2>와 같이 추가한 어셈블리를 사용할 수 있도록 코드를 추가한다.

<?xml version="1.0"?>
<configuration>
    <configSections>
        ...
        <section name="rewriter" requirePermission="false" 
                 type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler
                 , Intelligencia.UrlRewriter" />
    </configSections>
    <appSettings/>
    <connectionStrings>
        <add name="BlogDataBaseConnectionString" providerName="System.Data.SqlClient"
             connectionString="Data Source=neostyx\neostyx;Initial Catalog=BlogDataBase;User ID=sa;Password=1"
          />
    </connectionStrings>
    <system.web>
        ...
        <httpModules>
            <add name="ScriptModule" type="System.Web.Handlers.ScriptModule
                 , System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
            <add name="UrlRoutingModule" type="System.Web.Mvc.UrlRoutingModule
                 , System.Web.Extensions, Version=3.6.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        </httpModules>
    </system.web>
    <rewriter>
        <rewrite url="/Post/(.+).aspx" to="/PostView.aspx?postid=$1" />
        <rewrite url="/Category/(.+).aspx" to="/Category.aspx?categoryid=$1" />
    </rewriter>
    ...
</configuration>
<리스트 2>Web.Config 파일에 추가된 URL Rewriting 코드

Web.Config 파일의 <rewriter>섹션에 있는 <rewrite>요소에 정의된 것처럼 “/Post/포스트ID.aspx"로 요청되는 URL은 이 어셈블리를 통해서 ”PostView.aspx" 페이지에 쿼리스트링값으로써 포스트ID값을 전달해주고 있다. 그러므로 “PostView.aspx" 페이지의 코드 비하인드에서 Request.QueryString으로써 포스트ID값을 전달받을 수 있는 것이다. 다음 호에서 설명할 트랙백이나 태그, 그리고 검색의 경우도 이 URLRewriter를 사용하여 URL Rewriting 기능을 구현할 것이다.
또한, 필자는 보다 원활한 블로그 구성을 위해서 IIS(인터넷 정보 서비스)에서 8080포트를 가지는 별도의 웹 사이트를 구성하였다. 이 글을 보시는 독자분들도 보다 나은 프로그래밍을 위해 별도의 웹 사이트를 구성하여 개발 및 테스트를 하기를 권장한다.
----------------------------------------------------------------------------------------------------------------


Creative Commons License
저작물크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
반응형

+ Recent posts