logo
border border
              
border border
border border
  Post Subject :: #87. VS 2008을 이용한 블로그 프로그래밍 - Part8     [ASP.NET]
border border
border border
     
이 포스트는 월간 마이크로소프트웨어에 기고한 원고를 재편집한 포스트입니다. 그러므로, 본의 아니게 반말로 진행되고 있습니다. 원래 싸가지가 없어서 그런 것이 아니니 무한 용서를... ^^;;
또한, .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 대한민국 라이센스에 따라 이용하실 수 있습니다.
border border
border border
  이전 포스트 :: #86. VS 2008을 이용한 블로그 프로그래밍 - Part7
  다음 포스트 :: #88. VS 2008을 이용한 블로그 프로그래밍 - Part9
border border
border border
  
# Commented By :: 꼬기얌얌얌 At 3/6/2009 11:52:22 AM [D]
안녕하세요 강좌는 잘보구 열심히 따라하구 있습니다..^^
근데 처음에 테이블 만들때 쿼리문좀 올려주시면 안될까요?
그림만 보구 따라할려구 하니 조금 벅차서요...ㅠㅠ
# Commented By :: 최지훈 At 3/9/2009 9:12:07 AM [M] [D]
넵...

USE [BlogDataBase]
GO

/****** Object: Table [dbo].[BLOG_ARCHIVES] Script Date: 03/09/2009 09:09:52 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[BLOG_ARCHIVES](
[archivesdate] [varchar](7) NOT NULL,
[archivescount] [int] NOT NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

USE [BlogDataBase]
GO

/****** Object: Table [dbo].[BLOG_CATEGORIES] Script Date: 03/09/2009 09:09:52 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[BLOG_CATEGORIES](
[categoryid] [int] IDENTITY(1,1) NOT NULL,
[categoryname] [nvarchar](50) NOT NULL,
[sortkey] [smallint] NOT NULL,
[createdate] [datetime] NOT NULL,
[deletedate] [datetime] NULL,
CONSTRAINT [PK_BLOG_CATEGORIES] PRIMARY KEY CLUSTERED
(
[categoryid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

USE [BlogDataBase]
GO

/****** Object: Table [dbo].[BLOG_COMMENTS] Script Date: 03/09/2009 09:09:52 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[BLOG_COMMENTS](
[commentid] [int] IDENTITY(1,1) NOT NULL,
[postid] [nvarchar](100) NOT NULL,
[name] [nvarchar](100) NOT NULL,
[password] [varchar](50) NOT NULL,
[homepage] [varchar](100) NULL,
[comment] [ntext] NOT NULL,
[createdate] [datetime] NOT NULL,
CONSTRAINT [PK_BLOG_COMMENTS] PRIMARY KEY CLUSTERED
(
[commentid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

USE [BlogDataBase]
GO

/****** Object: Table [dbo].[BLOG_COUNTS] Script Date: 03/09/2009 09:09:52 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[BLOG_COUNTS](
[IP] [varchar](30) NOT NULL,
[VisitDate] [datetime] NOT NULL,
CONSTRAINT [PK_BLOG_COUNTS] PRIMARY KEY CLUSTERED
(
[IP] ASC,
[VisitDate] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

USE [BlogDataBase]
GO

/****** Object: Table [dbo].[BLOG_LINKS] Script Date: 03/09/2009 09:09:52 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[BLOG_LINKS](
[linkid] [int] IDENTITY(1,1) NOT NULL,
[linkname] [nvarchar](50) NOT NULL,
[linkurl] [varchar](100) NOT NULL,
[sortkey] [smallint] NOT NULL,
[createdate] [datetime] NOT NULL,
[deletedate] [datetime] NULL,
CONSTRAINT [PK_BLOG_LINKS] PRIMARY KEY CLUSTERED
(
[linkid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

USE [BlogDataBase]
GO

/****** Object: Table [dbo].[BLOG_NOTICES] Script Date: 03/09/2009 09:09:52 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[BLOG_NOTICES](
[noticeid] [int] NOT NULL,
[noticename] [nvarchar](100) NOT NULL,
[noticecontent] [ntext] NOT NULL,
[createdate] [datetime] NOT NULL,
[deletedate] [datetime] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

USE [BlogDataBase]
GO

/****** Object: Table [dbo].[BLOG_POSTS] Script Date: 03/09/2009 09:09:52 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[BLOG_POSTS](
[postid] [nvarchar](100) NOT NULL,
[categoryid] [int] NOT NULL,
[postname] [nvarchar](100) NOT NULL,
[postcontent] [ntext] NOT NULL,
[createdate] [datetime] NOT NULL,
[deletedate] [datetime] NULL,
[viewcount] [int] NOT NULL,
[commentcount] [int] NOT NULL,
[tag] [nvarchar](300) NOT NULL,
CONSTRAINT [PK_BLOG_POSTS] PRIMARY KEY CLUSTERED
(
[postid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

USE [BlogDataBase]
GO

/****** Object: Table [dbo].[BLOG_TAGS] Script Date: 03/09/2009 09:09:52 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[BLOG_TAGS](
[tagname] [nvarchar](50) NOT NULL,
[tagcount] [int] NOT NULL
) ON [PRIMARY]

GO

USE [BlogDataBase]
GO

/****** Object: Table [dbo].[BLOG_USERINFO] Script Date: 03/09/2009 09:09:52 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[BLOG_USERINFO](
[AdminID] [varchar](50) NOT NULL,
[AdminPWD] [varchar](30) NOT NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[BLOG_CATEGORIES] WITH CHECK ADD CONSTRAINT [FK_BLOG_CATEGORIES_BLOG_CATEGORIES] FOREIGN KEY([categoryid])
REFERENCES [dbo].[BLOG_CATEGORIES] ([categoryid])
GO

ALTER TABLE [dbo].[BLOG_CATEGORIES] CHECK CONSTRAINT [FK_BLOG_CATEGORIES_BLOG_CATEGORIES]
GO

ALTER TABLE [dbo].[BLOG_COMMENTS] WITH CHECK ADD CONSTRAINT [FK_BLOG_COMMENTS_BLOG_POSTS] FOREIGN KEY([postid])
REFERENCES [dbo].[BLOG_POSTS] ([postid])
GO

ALTER TABLE [dbo].[BLOG_COMMENTS] CHECK CONSTRAINT [FK_BLOG_COMMENTS_BLOG_POSTS]
GO

ALTER TABLE [dbo].[BLOG_POSTS] WITH CHECK ADD CONSTRAINT [FK_BLOG_POSTS_BLOG_CATEGORIES] FOREIGN KEY([categoryid])
REFERENCES [dbo].[BLOG_CATEGORIES] ([categoryid])
GO

ALTER TABLE [dbo].[BLOG_POSTS] CHECK CONSTRAINT [FK_BLOG_POSTS_BLOG_CATEGORIES]
GO
# Commented By :: 꼬기얌얌얌 At 3/12/2009 11:08:38 AM [D]
유후 감사합니당...^^
# Commented By :: Woos At 6/9/2009 8:45:23 PM [D]
안녕하세요. 강좌를 잘보고 있습니다.^^
지금까지 별문제 없이 진행을 했는데요..
URL Rewriting에서 자꾸 오류가 나네요..
참조추가도 다하고 web.config파일도 수정을 다했습니다.
서버 2008에서는 동작을 하지 않나요??
# Commented By :: 초보 At 8/7/2010 10:54:53 AM [D]
저도 URL Rewriting 이 안되네요. win7 x64, iis7.5, vs2008인데요.
URL Rewriting이 안되고 404 에러가 나네여.
# Commented By :: 최지훈 At 8/16/2010 5:54:46 PM [M] [D]
IIS 버전이 업그레이드되면서 해당 기능이 제대로 동작하지 않는 듯합니다.
이 부분은 MVC 프레임워크의 URL 라우팅 기능을 이용하시면 제대루 동작합니다.
관련 포스트를 작성해야 하는데..게으른지라...
  NAME ::   PASSWORD ::
  MAIL ::   HOMEPAGE ::
  COMMENT ::
border border
border border
COPYLEFT NX Blogs.   opml

LogIn ]  [ Join NX Blog's ]
border border
border border
mvp
border border
border border
  border
   Personal Thought
   ASP.NET
   ASP.NET AJAX
   ASP.NET MVC Framework
   Dev Story(Etc.)
   Reading the Articles
   About Microsoft / MSDN
   Certification Talk
   Useful Dev Tools
border border
border border
  border
   2010 년 09 월 (1)
   2010 년 06 월 (1)
   2010 년 05 월 (1)
   2010 년 04 월 (1)
   2010 년 03 월 (1)
   2010 년 02 월 (5)
   2010 년 01 월 (1)
   2009 년 04 월 (2)
   2009 년 03 월 (3)
   2009 년 02 월 (6)
   2009 년 01 월 (1)
   2008 년 10 월 (1)
   2008 년 06 월 (8)
   2008 년 05 월 (10)
   2008 년 04 월 (13)
   2008 년 03 월 (9)
   2008 년 02 월 (17)
   2008 년 01 월 (5)
   2007 년 12 월 (8)
   2007 년 11 월 (15)
   2007 년 10 월 (36)
   2007 년 09 월 (33)
   2007 년 08 월 (17)
   2007 년 07 월 (23)
   2007 년 06 월 (4)
   2007 년 05 월 (16)
   2007 년 04 월 (26)
   2007 년 03 월 (14)
   2007 년 02 월 (25)
   2007 년 01 월 (41)
   2006 년 12 월 (38)
   2006 년 11 월 (0)
   2006 년 10 월 (0)
   2006 년 09 월 (1)
   2006 년 08 월 (9)
   2006 년 07 월 (1)
border border
border border
  border
   #128. 無題
    By 최지훈 At 9/3/2010
   127. [예약구매] 실전. jQ...
    By 최지훈 At 6/13/2010
   #126. 무제
    By 최지훈 At 5/23/2010
   #125. 요즘 근황?
    By 최지훈 At 4/15/2010
   #124. ASP.NET 4 책을...
    By 최지훈 At 3/12/2010
   #97. ASP.NET 4 New...
    By 최지훈 At 2/12/2010
   #96. ASP.NET 4 New...
    By 최지훈 At 2/10/2010
   #95. ASP.NET 4 New...
    By 최지훈 At 2/9/2010
   #94. ASP.NET 4 New...
    By 최지훈 At 2/2/2010
   #93. ASP.NET 4 New...
    By 최지훈 At 2/1/2010
border border
border border
  border
   배는숨겨야지 에서 나도 모르게 빵...
    By ㅋㅋ At 8/17/2010
   Sorry. I don't hav...
    By 최지훈 At 8/16/2010
   내 생애 번역서는 이걸루 끝이다....
    By 최지훈 At 8/16/2010
   네..^^;; 저도 감사합니다.
    By 최지훈 At 8/16/2010
   IIS 버전이 업그레이드되면서 해...
    By 최지훈 At 8/16/2010
   나중에 비슷한 차로 태워는 줄께~...
    By 최지훈 At 8/16/2010
   나도 사주세요 저 차
    By ㅋㅋ At 8/12/2010
   저도 URL Rewriting 이...
    By 초보 At 8/7/2010
   감사드립니다^^
    By 이한철 At 7/28/2010
   오우~ 형 ㅊㅋㅊㅋ해~ 결국 했구...
    By 산티아고 At 7/26/2010
border border