login register Sysop! about ME  
qrcode
    최초 작성일 :    2003년 08월 14일
  최종 수정일 :    2003년 08월 14일
  작성자 :    taeyo
  편집자 :    Taeyo (김 태영)
  읽음수 :    112,395

강좌 목록으로 돌아가기

필자의 잡담~

강좌가 조금 많이 늦어진 점 대단히 죄송하게 생각합니다. 외국에 나오니 예상과는 달리 시간을 내기가 쉽지 않아서요.. ㅠ_ㅠ.... 이제 3주 후면 한국으로 돌아갑니다. ^^ 짠짠~~

대상 : ASP.NET을 이용하여 스스로 일반 게시판이 작성가능하거나,
         Taeyo's ASP.NET v1.0 서적을 통해서 게시판 만들기를 이미 공부하신 분

자.. 이제 저번 강좌에서 배운 내용을 토대로 하여, 글을 입력하는 데에 사용할 프로시저와 입력 폼 페이지를 한번 구성해 보도록 하겠습니다. ^^

그 전에, 저번 강좌에서 가장 중요한 부분이었던, 글 입력 프로시저의 로직을 한번 살펴보도록 하죠

1. 입력되는 글이 질문 글인 경우

: 현재 데이터베이스에 존재하는 thread 값중 가장 큰 값에 +1000 을 한 값으로 Thread 값을 준다.
  depth는 무조건 0으로 준다.

  예) INSERT INTO ThreadBoard (thread, depth, writer, pwd, title, mode, content) 
       Values (3000, 0, 'admin', 'pwd', '세번 째 글입니다', 1, '본문 내용입니다')

2. 입력되는 글이 답변 글인 경우

: 자신의 부모글의 thread 값보다 -1이 작고, 이전 질문 글의 thread 값 사이에 위치한 모든 글의
   thread 값을 -1 한다. 그리고 난 다음, 현재 입력되는 글의 thread 값을 부모글의 thread 값 -1 로
   지정한다. depth는 부모글의 depth 값에 +1한 값으로 준다.

  예) UPDATE ThreadBoard 
       SET thread = thread - 1
       Where thread < 부모 글의 thread 값 and thread > 이전 질문 글의 thread 값

       INSERT INTO ThreadBoard (thread, depth, writer, pwd, title, mode, content) 
       Values (부모 글의 thread 값-1, 0, 'admin', 'pwd', '세번 째 글입니다', 1, '본문 내용입니다')

그렇습니다. 위의 박스와 같은 내용을 담아서 프로시저를 만들어야 할 것입니다.

일단, 프로시저는 한번만 만들어두면... 이후로는 다시 번거롭게 로직을 따지고, 생각할 필요없이 이 쿼리를 재사용 할 수 있다는 장점이 있죠(프로시저를 만들었을 당시의 자신의 실력을 믿기만 한다면 말임다 -_-+) 물론, 그 외에도 프로시저는 보안적인 측면과, 성능적인 측면에서도 상당히 효과적이라는 장점을 가지고 있습니다. 해서, 가급적이면 쿼리를 프로시저로 작성해 두는 것이 바람직하다고 볼 수 있습니다. 아~ 물론, 일부 측면에서는 이를 달가워하지 않는 분들도 있는데요. 그것은 너무 무절제하게 프로시저를 남발하게 될 경우에 생기는 성능적인 문제를 걱정하시기 때문일 거라 생각되네요.. 언제나 그렇습니다. 남용은 좋지 않은 것입니다(이 시점에서 고등학교때 친구였던 남용이에게 무척 미안하네요. ㅠㅠ). 절제!!!  언제나 그게 중요한 것 같습니다.. 

자. 그럼 위에서 보여드린 로직대로, 입력을 위한 프로시저를 각각의 경우에 맞게 2 개를 만들어 보도록 하겠습니다. 단순 글 입력의 경우와 답변 글 입력의 경우에 사용할 프로시저를 말이지요 ^^ (오호~~~ 여기서 그 두개를 모두 만든다??? 진짜??? 글쎄요~~ 두고볼 일이겠죠??? 텨~~ =3=3= 3)

먼저, 단순 입력 즉, 질문 입력의 경우 사용할 프로시저입니다. 여러분 중에는 실력이 탁월하셔서 훨씬 더 성능좋은 프로시저를 생각해 내실 수 있는 분들도 있을 겁니다. 그러한 분들은 스스로 한번 작성해 보시는 것도 멋질 것 같아요~~~. 일단, 제가 작성한 프로시저는 다음과 같습니다.

CREATE PROC dbo.UP_INSERT_BOARDNEW
    @Writer    Varchar(20),
    @Pwd       Varchar(20),
    @Email     Varchar(100),
    @Title       Varchar(100),
    @Mode     Bit,
    @Ip         Varchar(15),
    @Content    Text
AS
    SET NOCOUNT ON
    DECLARE@NewThreadint
    SELECT @NewThread = ISNULL(MAX(Thread),0) + 1000 FROM ThreadBoard

    INSERT INTO ThreadBoard
        (thread, depth, writer, pwd, email, title, mode, ip, content)
    Values
        (@NewThread, 0, @Writer, @Pwd, @Email, @Title, @Mode, @Ip, @Content)

GO

단순 입력을 위한 프로시저의 이름은 UP_INSERT_BOARDNEW 이구요. 이 프로시저는 코드에서 보이다시피 이름, 비밀번호, 메일주소등을 위한 6개의 매개변수를 갖습니다. 그리고, 그 값을 이용해서 ThreadBoard 테이블에 데이터들을 INSERT 하는 것이지요 ^^

주목할 만한 부분은 새로운 글의 Thread 값을 얻어오기 위해서 프로시저 내부에서 다음과 같은 쿼리를 수행하는 부분입니다.

SELECT @NewThread = ISNULL(MAX(Thread),0) + 1000 FROM ThreadBoard

이는 현재 ThreadBoard 테이블 내에 존재하는 글 중에 가장 높은 글의 값에 + 1000 을 한 값을 얻어오는 명령입니다. 우리의 계층형 로직에 따르면, 가장 높은 글이 언제나 질문 글일 것이기에(답변 글들의 Thread 값은 질문 글의  Thread 값보다 언제나 작습니다), 새로운 질문은 가장 최근에 입력된 질문 글보다 + 1000 이 높은 글이어야 하기 때문입니다.

(2003년 10월 초 첨가 : 현재 위의 로직은 2003년 10월에 ISNULL() 함수를 추가적으로 덧붙인 것임을 밝힙니다. 게시판에 첫번째 글이 입력될 경우에는 기존 로직으로는 약간의 문제가 있었기에, 나그네님의 제보로.. ISNULL() 함수를 덧붙여 사용하는 것으로 변경했습니다. 참고해 주세요 ^^)

해서, 이렇게 얻어낸  Thread 값을 사용하여 새로운 글을 INSERT 할 경우에 사용하고 있는 것입니다. ^^ 의외로 간단하지 않습니까?????  ^^ 그렇습니다. 매우 간단합니다...  그렇다면, 이렇게 프로시저를 만들어 보도록 하세요 ^^ 만드는 방법은 간단합니다. ^^ [쿼리 분석기]를 열고, 여러분이 이 강좌를 위해 만들어둔 데이터베이스에다가 이 CREATE PROC 명령을 수행하면 되는 것이지요 ^^ (저의 경우는 데이터베이스 명이 TEST 입니다)

쩝... 그림이 좀 깨지네요... 과다하게 Resize를 하다보니... ㅠ_ㅠ.. 하지만, 쿼리 자체는 위에서 보여드린 것과 동일하니, 어렵지 않게 작성하실 수 있을 것이라 믿어 의심치 않아 봅니다. 자, 이제 프로시저는 만들었으니, 실제로 이 프로시저가 제대로 동작하는 지를 알아보기 위해서 실제 글 입력 페이지를 만들어 보는 것이 좋겠죠? 좋습니다. 그럼 시작해 보겠습니다.

뭐... 사실 글 입력용 폼 페이지 디자인이야 여러분이 맘에 드는 스타일로 하시면 됩니다. 각각의 입력 컨트롤에 대한 유효성 검사(validate)도 여러분이 원하시는 대로 설정하시면 되구요.... 그런 부분까지 저와 동일하게 하실 필요는 없을 것입니다만... 그래도, 저의 미적 감각을 사랑하시는 분들이 있기에...(퍽!!! 퍽###) 일단, 제가 만들어 본 입력 폼의 실행 모습과 HTML 코드를 보여드리도록 하겠습니다. 만일, 스스로 폼을 작성하시려는 분들은 제가 보여드리는 HTML 중에서 입력 컨트롤들의 이름만 제대로 맞춰주시면 될 것 같네요 ^^

정말로 심플하죠? 그렇습니다. 단순함의 미학이 느껴지는 디자인이 아닐수없습니다.(=ㅠ=);
그럼 이제 소스를 살펴보도록 하겠습니다.

<%@ Page language="c#" Codebehind="Insert.aspx.cs" AutoEventWireup="false"
        Inherits="AspNetTest.ThreadBoard.Insert" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
    <HEAD>
        <title>Insert</title>
        <LINK href="css/main.css" type="text/css" rel="stylesheet">
    </HEAD>
    <body MS_POSITIONING="FlowLayout">
    <form id="Insert" method="post" runat="server">
        <table width="520" border="0" cellspacing="0" cellpadding="0">
            <tr>
                <td bgcolor="#336699"></td>
            </tr>
            <tr>
                <td bgcolor="#668fcd"></td>
            </tr>
        </table>
        <table width="520" border="0" cellspacing="2" cellpadding="0">
            <tr class="txt01">
                <td height="25">&nbsp;&nbsp;글 작성하기</td>
            </tr>
        </table>
        <table width="520" border="0" cellspacing="0" cellpadding="0">
            <tr class="txt01"><td bgcolor="#f0f0f0"></td></tr>
            <tr class="txt01"><td bgcolor="#a6a6a6"></td></tr>
            <tr class="txt01"><td height="2" bgcolor="#dadada"></td></tr>
        </table>
        <table width="520" cellpadding="5" cellspacing="0" border="0">
            <tr class="txt01">
            <td width="120">이름</td>
            <td width="400">
                <asp:TextBox Runat="server" CssClass="input" ID="name" Width="100px">
                </asp:TextBox>
                <asp:RequiredFieldValidator id="RequiredFieldValidator1" runat="server"
                    ErrorMessage="이름" Display="None" ControlToValidate="name">
                </asp:RequiredFieldValidator></td>
            </tr>
            <tr height="1">
                <td colspan="2" background="images/dotline.gif"></td>
            </tr>
            <tr class="txt01">
                <td>비밀번호</td>
                <td>
                    <asp:TextBox Runat="server" CssClass="input" ID="pwd"
                         Width="100px" TextMode="Password"></asp:TextBox>
                    <asp:RequiredFieldValidator id="RequiredFieldValidator2" runat="server"
                         ErrorMessage="비밀번호" Display="None" ControlToValidate="pwd">
                    </asp:RequiredFieldValidator></td>
            </tr>
            <tr height="1">
                <td colspan="2" background="images/dotline.gif"></td>
            </tr>
            <tr class="txt01">
                <td>메일</td>
                <td>
                    <asp:TextBox Runat="server" CssClass="input" ID="mail" Width="300px">
                    </asp:TextBox>
                    <asp:RegularExpressionValidator id="RegularExpressionValidator1"
                        ErrorMessage="메일주소" Display="None" ControlToValidate="mail"
                        ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"
                        runat="server" ></asp:RegularExpressionValidator></td>
            </tr>
            <tr height="1">
                <td colspan="2" background="images/dotline.gif"></td>
            </tr>
            <tr class="txt01">
                <td>제목</td>
                <td>
                    <asp:TextBox Runat="server" CssClass="input" ID="title" Width="300px">
                    </asp:TextBox>
                    <asp:RequiredFieldValidator id="RequiredFieldValidator3" runat="server"
                        ErrorMessage="제목" Display="None" ControlToValidate="title">
                    </asp:RequiredFieldValidator></td>
            </tr>
            <tr height="1">
                <td colspan="2" background="images/dotline.gif"></td>
            </tr>
            <tr class="txt01">
                <td colspan="2">내용
                    <asp:RequiredFieldValidator id="RequiredFieldValidator4" runat="server"
                        ErrorMessage="본문 내용" Display="None" ControlToValidate="content">
                    </asp:RequiredFieldValidator></td>
            </tr>
            <tr>
                <td colspan="2">
                    <asp:TextBox Runat="server" CssClass="input" ID="content" Rows="7"
                        TextMode="MultiLine" Wrap="True" Columns="80"></asp:TextBox></td>
            </tr>
            <tr height="1">
                <td colspan="2" background="images/dotline.gif"></td>
            </tr>
            <tr class="txt01">
                <td>HTML 사용여부</td>
                <td>
                    <asp:CheckBox ID="UseHTML" Runat="server" CssClass="Options">
                    </asp:CheckBox>
                    <label for="UseHTML" class="txt01">사용합니다</label></td>
            </tr>
            <tr height="1">
                <td colspan="2" background="images/dotline.gif"></td>
            </tr>
            <tr>
                <td colspan="2" align="right">
                    <asp:ImageButton ID="PostButton" ImageUrl="images/b_save.gif"
                        runat="server" AlternateText="저장하기"></asp:ImageButton>
                    <a href="list.aspx"><img src="images/b_list.gif" border="0"></a>
                    <a href="javascript:document.Insert.reset();">
                        <img src="images/b_reset.gif" border="0"></a>
                </td>
            </tr>
        </table>
        <asp:ValidationSummary id="ValidationSummary1" ShowMessageBox="True"
            runat="server" ShowSummary="False" HeaderText="다음 항목들을 제대로 기입해
            주세요<br>"></asp:ValidationSummary>
    </form>
    </body>
</HTML>

그리고, 다음 코드는 현재의 폼에서 사용하는 css 파일인 main.css의 코드입니다. 너무 간단해서 사실 보여드릴 필요도 없었습니다만 말입니다.

.txt01
{
    font-family : Verdana, 돋움;
    font-size : 11px;
    color : slategray;
}

.input
{
    font-family : Verdana, 돋움;
    font-size : 11px;
    color : slategray;
    border : 1px solid gray;
}

그리고, 다음 이미지들은 소스에서 이미지 버튼으로 사용하고 있는 버튼 이미지들입니다. 혹시 필요하신 분은 각각 다운로드 받으셔서 사용하도록 하세요 ^^

자. 그럼 이제는 폼의 컨트롤 중 SAVE 버튼인 PostButton란 아이디의 이미지 버튼이 Click 될 경우의 처리를 해 보도록 하겠습니다. 이 버튼이 클릭된다는 것은 사용자가 폼에 모든 데이터를 기입한 후, 데이터를 저장하고자 한다는 것을 의미하니까요. 개발자인 우리는 서버측 코드 비하인드 페이지에다가 사용자의 입력 값들을 데이터베이스에 저장하는 작업을 수행하면 될 것입니다. 여러분이 VS.NET을 사용한다면, [디자인] 모드에서 해당 이미지 버튼을 더블클릭하면 자동으로 코드 비하인드에 다음과 같은 코드가 생길 겁니다. 만일, VS.NET을 사용하지 않는다면, 직접 수동으로 그러한 작업을 해주셔야 하겠죠? (그 부분은 여러분의 능력에 맡깁니다)

private void PostButton_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{

}

이 구역에 사용자의 입력값들을 데이터베이스에 저장하는 코드를 넣으면 되겠죠??? 물론, 우리가 기존에 만들어 놓은 "단순 입력용 프로시저"를 사용해서 말입니다. 설마~~ 폼 만드느라 정신이 팔려서 이 강좌의 앞에서 만들어 본 UP_INSERT_BOARDNEW 프로시저를 잊으신 것은 아니겠지요??  -_-+++

자.... 그렇게 해서 구성된 코드 비하인드 페이지의 소스입니다. 기본 코드 비하인드 페이지에서 추가해야 하거나, 변경해야 하는 부분은 파란색으로 처리해 보았어요

//##########################################################//
//######################## Insert.aspx.cs ########################//
//##########################################################//

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace AspNetTest.ThreadBoard
{
    /// <summary>
    /// Insert에 대한 요약 설명입니다.
    /// </summary>
    public class Insert : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.TextBox name;
        protected System.Web.UI.WebControls.TextBox pwd;
        protected System.Web.UI.WebControls.TextBox mail;
        protected System.Web.UI.WebControls.TextBox title;
        protected System.Web.UI.WebControls.TextBox content;
        protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator1;
        protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator2;
        protected System.Web.UI.WebControls.RegularExpressionValidator RegularExpressionValidator1;
        protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator3;
        protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator4;
        protected System.Web.UI.WebControls.ValidationSummary ValidationSummary1;
        protected System.Web.UI.WebControls.ImageButton PostButton;
        protected System.Web.UI.WebControls.CheckBox UseHTML;

        protected SqlConnection Con;
        protected SqlCommand Cmd;

        private void Page_Load(object sender, System.EventArgs e)
        {
            // 여기에 사용자 코드를 배치하여 페이지를 초기화합니다.
        }

        Web Form Designer generated code

    private void PostButton_Click(object sender, System.Web.UI.ImageClickEventArgs e)
    {            
            Con = new SqlConnection();
            Con.ConnectionString = "server=(local);database=TEST;user id=sa;";

            Cmd = new SqlCommand("UP_INSERT_BOARDNEW", Con);
            Cmd.CommandType = CommandType.StoredProcedure;

            Cmd.Parameters.Add("@Writer", SqlDbType.VarChar, 20);
            Cmd.Parameters.Add("@Pwd", SqlDbType.VarChar, 20);
            Cmd.Parameters.Add("@Email", SqlDbType.VarChar, 100);
            Cmd.Parameters.Add("@Title", SqlDbType.VarChar, 100);
            Cmd.Parameters.Add("@Mode", SqlDbType.Bit);
            Cmd.Parameters.Add("@Ip", SqlDbType.VarChar, 15);
            Cmd.Parameters.Add("@Content", SqlDbType.Text);

            Cmd.Parameters["@Writer"].Value = name.Text;
            Cmd.Parameters["@Pwd"].Value = pwd.Text;
            Cmd.Parameters["@Email"].Value = mail.Text;
            Cmd.Parameters["@Title"].Value = title.Text;
            Cmd.Parameters["@Mode"].Value = (UseHTML.Checked == true ? 1 : 0);
            Cmd.Parameters["@Ip"].Value = Request.UserHostAddress;
            Cmd.Parameters["@Content"].Value = content.Text;

            Con.Open();
            Cmd.ExecuteNonQuery();
            Con.Close();

            Cmd = null;
            Con = null;

            string script = "<script>alert('저장되었습니다');</script>";
            Page.RegisterClientScriptBlock("done", script);
        }
    }
}

주로 파란색 코드를 중점적으로 보시면 되겠는데요, 일단, 네임스페이스 편입구역에 System.Data.SqlClient 네임스페이스를 using 키워드를 사용하여 작성하고 있는 것을 보실 수 있을 겁니다. 현재의 페이지에서는 SQL 서버 데이터베이스로 데이터를 저장할 것이기에, 그와 관련된 ADO.NET 개체들이 필요하며, 해서, 그 개체들을 사용하기 위해 이렇게 System.Data.SqlClient 네임스페이스를 임포트 한 것이랍니다.

이제, 실제 버튼 클릭 이벤트 부의 코드를 살펴보도록 하겠습니다.

그 내부의 코드를 보면 가장 먼저 SqlConnection 개체를 사용하여, 데이터베이스와의 연결을 시도하는 것을 보실 수 있을 것입니다. 저의 경우, 데이터베이스 연결 문자열에 계정 비밀번호가 생략되어져 있는데요. 여러분의 경우는 그 부분을 적절하게 다음과 같이 작성해 주시면 될 것입니다.

Con.ConnectionString = "server=(local);database= TEST;userid=sa;password=xxxxxxxx";

다 아시는 이야기이겠습니다만, .NET부터는 데이터베이스 연결 문자열이 기존 ODCB 연결 문자열이나, OLE DB 연결 문자열과는 달리 키워드들이 단순하면서도 명료하게 구성되어져 있습니다. 예전에 OLE DB의 경우에는 데이터베이스 서버를 지정하는 키워드가 Data Source 였던 반면, 현재는 간단하게 server 를 사용하면 되는 것이지요. 마찬가지로, 기존 OLE DB에서는 데이터베이스를 지정하기 위해서 Initial Catalog라는 복잡한 키워드를 사용했었지만, 이제는 database 라는 간단한 키워드를 사용하면 되는 것입니다. 이 얼마나 바람직한 시추에이쇼~~온 입니까!!  고로씁니다~~~

데이터베이스와 연결할 준비가 되었다면, 이제는 실행할 명령을 준비해야 하겠죠? 해서, 소스에서는 우리가 미리 준비해 놓은 저장 프로시저를 사용하는 SqlCommand 개체를 하나 만들어서 명령 설정을 하고 있는 것을 볼 수 있습니다. 다음처럼 말이죠

Cmd = new SqlCommand("UP_INSERT_BOARDNEW", Con);
Cmd.CommandType = CommandType.StoredProcedure;

그 다음에 이어지는 작업은 저장 프로시저의 매개변수들에 맞게.. 가급적 순차적으로 각각의 인자들을 넣어주시는 것입니다. ^^

모든 인자를 다 지정하였다면, 그 다음에 해야할 작업은 EXECUTE 작업이지요.. ^^ 사실, 현재의 코드에서는 Exception을 처리하는 작업은 제외되어져 있는데요. 실제 여러분의 코드에서는 그러한 처리를 추가적으로 해 주시는 것이 좋습니다. try/catch 구문을 사용해서 말이죠 ^^;(배포하는 소스에서는 그러한 처리까지 된 버전으로 드리도록 하겠습니다)

데이터베이스로 INSERT 작업을 수행하고 나면, 코드는 다음의 작업을 마지막으로 하여 정리됩니다.

string script = "<script>alert('저장되었습니다');</script>";
Page.RegisterClientScriptBlock("done", script);

이 코드는 alert 창을 띄워서 사용자게에 알림 메시지를 보내는 역할을 하는 클라이언트 스크립트를 aspx 페이지에 작성하게 하는 코드입니다. script 라는 변수에 들어있는 문자열에 대해서 서버는 아무런 처리도 하지 않습니다. 단지, 그 문자열 그대로 브라우저의 결과 HTML에 추가하게 하는 것 뿐이지요. 그러면, 그 다음에 브라우저가 그 문자열을 가지고서 스크립트를 실행시켜 최종 사용자(end user)에게 Alert 메시지를 나타내게 될 것입니다.

바로 이렇게 추가적으로 스크립트와 같은 것을 내려보내기 위해서 사용할 수 있는 메서드가 Page 클래스의 RegisterClientScriptBlock인 것입니다(제 책에 매우 구체적으로 나와있죠!! -_-+) 물론, 이 메서드가 단지 스크립트 코드만을 작성하기 위해서 사용되는 것은 아닙니다. 여러 용도로 사용할 수 있죠 ^^; 그 용도라는 것들에 대해서는 언젠가 많은 용도를 만나게 되는 날, 소개해 드리도록 하겠습니다. ^^

자. 이제 모두 작성이 되었다면, 페이지를 실행하고 글을 입력해 보세요.. 아마도 제대로 데이터를 기입하고 SAVE를 한다면, [저장되었습니다]라는 멋진 메시지를 받아볼 수 있을 것입니다. ^^; 물론, 그 메시지 후에 나타나는 창은 여전히 Insert.aspx 이겠습니다만.... 일단, 이 부분은 이후에 list.aspx 페이지를 완성한 다음에 그 페이지로 자동 이동하게끔 수정을 할 예정입니다. (데이터가 저장되면, list 페이지로 자동 이동하게 한다는 것이지요) 그러므로,

"지금 데이터를 입력하고 SAVE하면 다시 동일한 창이 나와요~~. 이거 버그죠???"
- 버그 아닙니다. 아직 처리가 덜 된것 뿐입니다.

.... 라는 것입니다. -_-+

이것으로써 [단순 입력]을 위한 폼 페이지는 완성이 된 것 같네요...

물론, 이 페이지는 차후 업데이트가 필요합니다. 답변을 달기 위해서도 이 동일한 페이지를 사용해야 할테니까요. 해서, 그러한 업데이트는 차후 답변달기 기능에 대해서 이야기 할때, 같이 진행하도록 하겠습니다.

"잠깐!!!  지금 뭐하자는 액숀이지?? 강좌를 자주 올리지도 않으면서, 또 다음 번에 하겠다는거야? 지금 끝내지 못해??? 또 우리보고 보름 이상을 기다리라는 거야? 네 강좌 보려다가 늙어 죽겠다. 그걸 기다리느니 다음 번 화성이 지구 가까이 오는 날을 기다리거나, 다음 번 헬리혜성이 오는 것을 기다리고 말겠다!!!"

라는 수 많은 분들의 원성이 들립니다. ㅠ_ㅠ;

하지만, 아시다시피 지금 답변 달기 기능을 진행하기는 어렵습니다. 그 기능은 글의 본문에 들어가서 [답변하기] 버튼을 눌러야 진행이 가능한 부분이지 않습니까???? 기본적으로 게시판의 구조라는 것이 다음과 같은 플로우를 가지고 있으니까요 -_-;

그러므로, 저도 지금 [답변 입력] 에 관계된 프로시저와 그 로직을 설명드리고 싶어서 죽겠습니다만... 방법이 없어요.. ㅠ_ㅠ

하지만, 일단은 아쉬운 대로... 그 답변로직에 사용할 저장 프로시저는 먼저 보여드리도록 하겠습니다. 한가지 언급하고 싶은 것은 이러한 계층형 로직은 어디까지나 제가 현재 이용하고 있는 방법일 뿐이라는 것입니다. 더 뛰어난 방법이 분명 있을 수 있고, 그 방법을 아는 분이 계실 수도 있다는 것이지요.... 더 좋은 방법을 아시는 분은 멋지게 한번 로직을 쏴 주심도 좋을 것 같습니다....

참고로, 지금 지금 이 강좌에서 사용하는 로직은 MSPress에서 얼마전에 새로 나온 ASP.NET 서적에서 공개하고 있는 방법과 거의 동일하네요(페이징 관련 부분에 한해서 말입니다). 나중에 시간이 되시면 그 책을 한번 살펴보시는 것도 좋을 것 같아요.. Programming ASP.NET (Microsoft press)이라는 서적입니다. 그나저나, 재미있네요... 이 로직이 책(원서)를 통해서 공개적으로 오픈이 되었다는 이야기는 이보다 더 뛰어난 로직이 이미 보편적으로 준비되었다는 의미일 수도 있으니까요 ^^;;; 

엇!! 사설이 길었네요!!  그럼 나갑니다... 답변 입력 용 저장 프로시저 스크립트입니다. ^^(현재는 프로시저 내부에 트랜잭션이 걸려져 있지만, 만일, 이 부분이 차후 COM+를 사용하는 쪽으로 변형된다면, 프로시저 내부의 트랜잭션은 빼는 것이 좋을 것입니다 ^^)

CREATE PROC dbo.UP_INSERT_BOARDREPLY
    @ParentThread       int,
    @PrevThread          int,
    @depth                  int,
    @Writer                 Varchar(20),
    @Pwd                    Varchar(20),
    @Email                  Varchar(100),
    @Title                    Varchar(100),
    @Mode                  Bit,
    @Ip                       Varchar(15),
    @Content              Text
AS
    SET NOCOUNT ON
    BEGIN TRAN

    UPDATE ThreadBoard
    SET thread = thread - 1
    Where thread < @ParentThread and thread > @PrevThread

    IF (@@ERROR <> 0)
    BEGIN
        ROLLBACK TRAN
        RETURN
    END

    INSERT INTO ThreadBoard
        (thread, depth, writer, pwd, email, title, mode, ip, content)
    Values
        (@ParentThread-1, @depth, @Writer, @Pwd, @Email, @Title, @Mode, @Ip, @Content)

    IF (@@ERROR <> 0)
    BEGIN
        ROLLBACK TRAN
        RETURN
    END

    COMMIT TRAN
GO

(스윽~~~)그럼... 여러분이 코드를 보느라 정신이없는 틈을 타서리.. 저는 슬그머니 사라질랍니다.

다음번 강좌는 예상보다 3배는 빨리 가지고 올 것을 약속 드리면서요... 게시판의 list.aspx 페이지를 만드는 강좌를 진행하기위해 저는 다시 준비작업에 들어가도록 하겠습니다.

그럼다음 강좌에서 뵐께요. 좋은 하루 되세요.


authored by


 
 
.NET과 Java 동영상 기반의 교육사이트

로딩 중입니다...

서버 프레임워크 지원 : NeoDEEX
based on ASP.NET 3.5
Creative Commons License
{5}
{2} 읽음   :{3} ({4})