login register Sysop! about ME  
qrcode
    최초 작성일 :    2001년 06월 06일
  최종 수정일 :    2001년 07월 20일
  작성자 :    taeyo
  편집자 :    Taeyo(김 태영)
  읽음수 :    117,839

강좌 목록으로 돌아가기

필자의 잡담~

태오 사이트 T 셔츠가 나왔습니다. 정말로 이쁘네요... 앗.. 이런 커피를 흘렸다..... 흠... 어쩌지?? -_-;...

이번 강좌는 글에 대한 커멘트를 다는 내용을 담고 있습니다. 각각의 글에 대한 가벼운 한, 두줄의 글(커멘트)를 달 수 있게 하는 기능을 만들어 보자는 것이지요...  ^^  다음 그림은 커멘트 기능이 추가된 본문의 모습니다..  ^^  이번 강좌에서 우리가 할 것도 바로 이것이지요..

본문내용의 하단에 위의 그림과 같이 커멘트를 추가할 수 있는 기능이랍니다... 맘에 드실랑가 모르겠네요. 물론 그렇게 어려운 것은 아니지요...  그렇겠지요?

이것을 만들기 위해서는 먼저 새롭게 데이터베이스에 테이블을 하나 추가로 만들어야 합니다. 각각의 커멘트가 저장될 테이블이지요.. 이름하야 Comment 테이블... 자.. 그럼 여러분의 데이터베이스에 (MyDataBase)에 새롭게 테이블을 하나 추가해 봅시다...  ^^

그러나, 위의 그림처럼만 테이블을 만들고 "끝" 하면 안됩니다.... 몇가지 제약조건이 더 있거든요... 그러니, 다음 SQL 스크립트를 참조해서 봐주시기 바래요

  CREATE TABLE [dbo].[Comment] (
    [Co_seq] [int] IDENTITY (1, 1) NOT NULL ,
    'Access의 경우는 이 부분이 다음과 같이 바뀌어야 함.. [Co_seq] [int] Counter (1, 1) NOT NULL ,
    [board_idx] [int] NOT NULL ,
    [Co_name] [varchar] (20) NOT NULL ,
    [Co_date] [smalldatetime] NOT NULL ,
    [Co_Content] [varchar] (500) NULL
  ) ON [PRIMARY]
  GO

  'Co_date 컬럼에 기본값을 getdate로 설정하는 부분과 Co_Seq를 프라이머리 키로 설정하는 부분
  ALTER TABLE [dbo].[Comment] WITH NOCHECK ADD
    CONSTRAINT [DF_Comment_Co_date] DEFAULT (getdate()) FOR [Co_date],
    CONSTRAINT [PK_Comment] PRIMARY KEY CLUSTERED
    (
      [Co_seq]
    ) ON [PRIMARY]
  GO

  'board_idx 컬럼의 참조키를 설정하는 부분
  ALTER TABLE [dbo].[Comment] ADD
    CONSTRAINT [FK_Comment_MyBoard] FOREIGN KEY
    (
      [board_idx]
    ) REFERENCES [dbo].[MyBoard] (
      [board_idx]
    )
  GO

이 스크립트는 크게 3 부분으로 나누어져 있는데요.  GO를 기준으로 보시면 됩니다. 먼저, 가장 첫번째 블럭은 역시나 테이블을 Create 하는 부분입니다. 어려울 것은 없을겁니다. 커멘트를 저장하기 위해 필요한 커멘트 테이블을 만드는 부분이니까요... 단, Co_Seq 컬럼은 Identity 컬럼으로 자동으로 그 값이 매겨지는 컬럼이라는 것을 기억하세요 .. 우리는 그 값을 임의로 입력할 수 없답니다. 서버가 알아서 지정하게 되지요.

두번째 블럭은 Co_seq에 프라이머리키를 설정하는 부분과, Co_Date에 기본값으로 getdate를 설정하는 부분입니다..  ^^  이것은 어려울 것이 없는 부분이지요?  물론, 꼭 스크립트로 하실 필요는 없구요.. 다음 그림들처럼 테이블 디자인모드에서 각각 설정하실 수도 있을 것이랍니다..  ^^ identity 설정하는 부분과 기본값을 설정하는 부분을요(위의 스크립트 중 두번째 블럭부분)

그리고, 3번째 블럭이 바로 외래키를 설정하는 부분인데요...  커멘트 테이블은 MyBoard 의 게시물들에 따라 존재하는 테이블 입니다. 즉, MyBoard 에 존재하지 않는 글에는 커멘트가 달릴 수 없겠지요? 해서, 이 테이블은 MyBoard 테이블에 종속적인 상태라고 볼 수 있습니다. 해서, 이러한 관계를 확실하게 유지하게 하기 위해서 외래키(Foriegn Key)를 설정해 두는 것이지요 이렇게 키를 잡아두게 되면 MyBoard에 존재하는 board_idx 값에 대해서만 커멘트가 생길 수 있게 됩니다. 존재하지도 않는 글에 대해서는 커멘트도 달 수 없게끔 한다는 것이지요..  ^^ .. (또한, 검색 속도도 빨라집니다.  ^^)

이를 다이어그램으로 표시하면 다음과 같을 수 있겠네요.

앗 차차....  !!  죄송합니다.. 

이것은 SQL 기준으로 설명드린 것입니다... 물론, Access 도 비슷한 방법으로 해주실 수는 있겠지요? 어쨋든 이 부분이 잘 이해가 가지 않는다면 데이터베이스에 대해서 공부를 하셔야합니다. ASP 를 하면서 데이터베이스를 모르면 아무 것도 만들어 낼 수 있는 것은 없습니다. 그만큼 데이터베이스는 중요하지요... 모든 것의 근간이 되는 데이터들을 보관하는 장소이니까요. 저도 SQL 서버를 잘 하는 것은 아닙니다만.. 꾸준히 열심히 할라고 맘은 먹구 있습니다. 저는 SQL 서버를 하지만, 여러분은 작게는 Access, 크게는 오라클이나 인포믹스를 다루고 있을 수도 있겠네요...

어떤 것이 맘에 들던지 간에 상당히 공부하셔야 할 것입니다. 관련 사이트들을 돌아다니시면서 말이죠. 어쩌면 ASP 보다는 그러한 데이터베이스에 더 많은 시간을 투자해서 공부하는 것이.. 여러분의 가치를 높이는 것일 수도 있습니다. 그만큼 데이터베이스의 기초를 다지는 것은 중요하니까요

지나가는 한마디~~~

위의 내용을 위해서는 적어도 테이블간에 포린키(외래키) 잡는 법, 일련번호 설정, 컬럼의 기본값 설정   방법을 공부하면 금방 하실 수 있을 것입니다. 대부분의 관계 서적에 빠지지 않고 나오니까요 ^^ 서점에 가셔서 눈으로 외워 오시는 것도 나쁘지 않은 방법입니다. 특히 Access 하시는 분들요  ^^ 만일, 난 서점 갈 시간도 없다 하시는 분은 리플을 달아주시면 그것도 강좌로 올려보겠습니다. 하지만, 스스로 어느정도는 공부하시는 성의를 조금은 기대해 본답니다. 감사합니다. 

좋습니다. 이제 테이블은 준비가 되어졌습니다. 그렇죠? 그러면, 이제 이 커멘트 기능을 한번 우리의 소스에 추가해 보겠습니다. 커멘트를 달 수 있도록 하는 장소로 가장 적합한 페이지는 어디일까요? Content.asp ?

그렇습니다. 우리는 각각의 글에 커멘트를 추가하고 싶은 것이니 Content.asp 가 가장 적절하겠네요. 자.. 다음 소스가 바로.. Content.asp에다가 커멘트의 기능을 추가한 소스입니다. 빨간 색으로 표시한 부분이 추가된 부분이니 신경을 써서 봐주시기 바랍니다.

Comment 기능이 포함된 Content.asp

<% Option Explicit %>
<!--#include file="config.asp"-->
<!--#include file="functions.asp"-->
<%
  Dim Gotopage
  GoTopage= request("GotoPage")

  Dim adoDb, SQL, Rs
  Set adoDb = Server.CreateObject("ADODB.Connection")
  adoDb.Open strConnect

  SQL = "SELECT board_idx,b_name,b_title,b_date,b_email,b_ipaddr,b_readnum,b_pwd,b_content from MyBoard "
  SQL = SQL & " where board_idx=" & request.Querystring("board_idx")

  Set Rs = adoDb.execute(SQL)

  Dim board_idx, name, title, mail, writeday
  Dim ipaddr, readnum, pwd, content
  Dim prev_idx, next_idx

  board_idx = Rs("board_idx")
  name = Rs("b_name")
  name = ReplaceTag2Text(name)
  title = Rs("b_title")
  title = ReplaceTag2Text(title)
  writeday = Rs("b_date")
  mail = Rs("b_email")
  mail = ReplaceTag2Text(mail)
  ipaddr = Rs("b_ipaddr")
  readnum = Rs("b_readnum")
  pwd = rs("b_pwd")
  content = Rs("b_content")
  content = ReplaceTag2Text(content)
  content = replace(content,vblf,"<br>")

  Rs.close

  '이전 글의 board_idx 값을 구하는 부분
  SQL = "Select Min(board_idx) from MyBoard where board_idx > " & board_idx
  Set Rs = adoDb.Execute(SQL)
  if Not Rs.EOF then
    prev_idx = Rs(0)
  end if
  Rs.close

  '다음 글의 board_idx 값을 구하는 부분
  SQL = "Select Max(board_idx) from MyBoard where board_idx < " & board_idx
  Set Rs = adoDb.Execute(SQL)
  if Not Rs.EOF then
    next_idx = Rs(0)
  end if
  Rs.close

  '현재글과 관계된 커멘트 읽어오기
  SQL = "Select Co_name, Co_date, Co_Content from Comment " & _
      " where board_idx=" & board_idx
  Set Rs = adoDb.Execute(SQL)
  Dim arrComment
  if Not Rs.EOF then
    arrComment = Rs.GetString()
  End if
  Rs.close


  adoDb.close
  Set Rs = Nothing
  Set adoDb = nothing
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ks_c_5601-1987">
<style type="text/css">
  A {text-decoration: none; color:navy }
  A:hover {text-decoration: none; color:orange}
  td {padding:7; font-family:돋움; font-size:12 }
  input {border: 1 solid silver; font-family:dotum; font-size:9pt;}
</style>
<script language="javascript">
<!--
  function Del()
  {
    var pwd = document.myform.pwd.value;
    if (CheckStr(pwd, " ", "")==0) {
      alert("비밀번호를 입력해 주세요");
      return;
    }
    document.myform.action = "del_ok.asp";
    document.myform.submit();
  }

  function Edit()
  {
    var pwd = document.myform.pwd.value;
    if (CheckStr(pwd, " ", "")==0) {
      alert("비밀번호를 입력해 주세요");
      return;
    }
    document.myform.action = "Edit.asp";
    document.myform.submit();
  }

  function addComment()
  {
    var name = document.frmMent.name.value;
    if (CheckStr(name, " ", "")==0) {
      alert("이름을 입력해 주세요");
      document.frmMent.name.focus();
      return;
    }
    var content = document.frmMent.content.value;
    if (CheckStr(content, " ", "")==0) {
      alert("커멘트 내용을 입력해 주세요");
      document.frmMent.content.focus();
      return;
    }
    document.frmMent.submit();

  }

  function CheckStr(strOriginal, strFind, strChange){
    var position, strOri_Length;
    position = strOriginal.indexOf(strFind);

    while (position != -1){
      strOriginal = strOriginal.replace(strFind, strChange);
      position = strOriginal.indexOf(strFind);
    }

    strOri_Length = strOriginal.length;
    return strOri_Length;
  }
//-->
</script>
</head>
<body>
<form method="POST" action="Write.asp" name="myform">
<input type= "hidden" name= "board_idx"value="<%=board_idx%>">
  <table cellpadding="0" cellspacing="0" border="0" width= "540">
    <tr>
      <td bgcolor="white"valign="top"style="padding:2px;"width="400">< br>        <ahref="list.asp?gotopage=<%=gotopage%>">[ 리스트로 ]</a>
      </td>
      <td bgcolor="white" valign="top" align="right" width="140">
        조회수 : <%=readnum%>
      </td>
    </tr>
    <tr>
      <td bgcolor="#aaaaaa" style="padding:2px;" colspan="2">
        <table cellpadding="0" cellspacing="1" border="0" width="540">
          <tr>
            <td width="100" bgcolor="#EFEFEF" align="center" height="20">게시자</td>
            <td width= "44"bgcolor = "white">
              <%if mail <> "" then%>
                <a href="mailto:<%=mail%>"><%=name%></a>
              <% else %>
                <%=name%>
              <% end if%>
            </td>
          </tr>
          <tr>
            <td BGCOLOR="#EFEFEF" align="center" valign="middle" height="25">날짜</td>
            <td bgcolor="white"><%=writeday%></td>
          </tr>
          <tr>
            <td BGCOLOR= "#EFEFEF" align="center" valign= "middle"height="25">제목</td>
              <td bgcolor="white"><%=title%></td>
          </tr>
          <tr VALIGN="top">
            <td BGCOLOR="#EFEFEF" align="center" valign="middle">내용</td>
            <td bgcolor= "white"class="content"><%=content%></td>
          </tr>
        </table>
      </td>
    </tr>
    <tr>
      <td style="padding-top:3px;" align="right" colspan="2">
        <table cellpadding="0" cellspacing="0" border="0" width="340">
          <tr>
            <td align="right" width= "200"style="padding=0">
              비밀번호 <input type="password" name="pwd" size="10" class="pwd"></td>
            <td align="right" width= "70"style="padding=0">
              <a href="javascript:Edit();">[수정하기]</a></td>
            <td align="right" width= "70"style="padding=0">
              <a href="javascript:Del();">[삭제하기]</a></td>
          </tr>
        </table>
      </td>
    </tr>
  </table>
  <table width="540">
    <tr>
      <td>
        <% if prev_idx <> ""then%>
          <ahref="list2content.asp?board_idx=<%=prev_idx%>&Gotopage=<%=Gotopage%>">
          &lt; &lt; 이전 글 보기
          </a>
        <% end if%>
        |
        <% if next_idx <> ""then%>
          <ahref="list2content.asp?board_idx=<%=next_idx%>&Gotopage=<%=Gotopage%>">
          다음 글 보기 &gt; &gt;
          </a>
        <% end if%>
      </td>
    </tr>
  </table>
</form>

<form name="frmMent" action="Insert_Comment.asp" Method="post">
  <table width="540" bgcolor="slategray" cellspacing="1">
    <tr bgcolor="#eeeeee">
      <td colspan=2>여러분의 커멘트를 남겨주세요</td>
    </tr>
    <Tr bgcolor="white">
      <INPUT class= "inputa" type="hidden" name= "GoTopage"value="<%=GoTopage%>">
      <INPUT class= "inputa" type="hidden" name= "board_idx"value="<%=board_idx%>">
      <td>이름 : <INPUT class="inputa" name="name" size="7"></td>
      <td align="center">멘트 :
        <INPUT class="inputa" name="content" size="50" maxlength="200">
        <Input class="buttona" type="button" onClick="addComment();" value="저장">
      </td>
    </tr>
  </table>
</form>

<%
  if arrComment <> "" then
    Dim arrRecord, arrColumn, inum
    arrRecord = Split(arrComment,chr(13))
%>
  <br><font size=2><b>Comment</b></font>
  <table width="540" bgcolor="slategray" cellspacing="1">
<%
  for inum=0 to Ubound(arrRecord)-1
    arrColumn = Split(arrRecord(inum), Chr(9))
%>
    <tr bgcolor="white">
      <td><p><%= arrColumn(0)%>(<%=arrColumn(1)%>)</p><%=arrColumn(2)%>
      </td>
    </tr>
  <%next %>
  </table>
<%
end if%>

</body>
</html>

커멘트 기능이 추가된 Content.asp 의 소스를 보면 먼저, 상단에 다음과 같은 코드가 추가된 것을 보실 수가 있을 것입니다.

'현재글과 관계된 커멘트 읽어오기
SQL = "Select Co_name, Co_date, Co_Content from Comment " & _
        " where board_idx=" & board_idx
Set Rs = adoDb.Execute(SQL)
Dim arrComment
if Not Rs.EOF then
   arrComment = Rs.GetString()
End if
Rs.close

이것은 Comment 테이블에서 현재 글과 연관된 모든 커멘트를 다 읽어와서 긴 하나의 문자열로 arrComment 라는 변수에 모두 담는 것입니다.  이렇게 하나의 긴 문자열로 모든 데이터를 일단 담고 레코드셋과의 연결은 끊어버립니다. 이렇게 하는 이유는 리소스를 많이 차지하는 데이터베이스와의 연결을 가급적 빨리 끊어버리기 위함이지요. 그래야 더 나은 성능을 내게 할 수 있으니까요..  ^^

GetString 메소드의 사용방법을 모르신다구요?  ^^   걱정마세요. 이것을 다루는 방법은 이미 강좌로 올려두었습니다. 다음 강좌를 꼭 참고해 보세요

ActiveX Data Object : Recordset - GetString

여기서 중요한 것은 데이터베이스에서 필요한 데이터를 쿼리해 온 다음에는 최대한 빨리 그 연결을 끊는 것이 포인트입니다. 이것은 서버의 성능을 향상시키는 코딩방법임을 기억하시고 꼭 기억해 주시기 바란답니다.  ^^

다시 강조하면, Content.asp 의 소스를 보면 상단의 ASP 코드내에서 데이터베이스에서 필요한 데이터는  모두 가져온 뒤, 변수에 담고 HTML을 만들기 이전에 그 모든 연결을 끊고 객체도 파괴하고 있죠? 이렇게 빨리 사용이 끝난 객체를 제거하는 것이 바람직하다는 것입니다.

그 다음에는 소스의 하단으로 내려가 봅시다.. 그러면 다음과 같은 HTML 코드가 있는 것을 볼 수 있죠? 이 코드는 커멘트를 입력받는 폼 코드들입니다. 히든으로 현재 페이지 번호와 현재 글의 board_idx 값도 같이 넘겨주는 것을 보실 수 있을 것입니다.  ^^

이 값은 커멘트를 저장한 다음 다시금 현재의 페이지로 돌아오게 하기 위해서 필요하답니.

<form name="frmMent" action="Insert_Comment.asp" Method="post">
  <table width="540" bgcolor="slategray" cellspacing="1">
    <tr bgcolor="#eeeeee">
      <td colspan=2>여러분의 커멘트를 남겨주세요</td>
    </tr>
    <Tr bgcolor="white">
      <INPUT class="inputa" type="hidden" name= "GoTopage"value="<%=GoTopage%>">
      <INPUT class="inputa" type="hidden" name= "board_idx"value="<%=board_idx%>">
      <td>이름 : <INPUT class="inputa" name="name" size="7"></td>
      <td align="center">멘트 :
         <INPUT class="inputa" name="content" size="50" maxlength="200">
        <Input class="buttona" type="button" onClick="addComment();" value="저장">
      </td>
    </tr>
  </table>
</form>

그리고, [저장] 버튼을 누를 경우에는 addComment 라는 자바스크립트 함수를 호출하고 있지요? 이 부분은 설명이 따로 필요없을 것 같네요... 게시판에 글쓰기 부분과 거의 비슷한 코드니까요..  ^^ 이름과 글을 입력하지 않았다면 메시지박스를 띄워서 경고를 주고, 모두 입력이 되었다면 폼의 내용을 모두 서브밋하게 하는 기능을 하지고 있는 함수이니까요..  ^^  이미 게시판의 글쓰기 부분에서 비슷한 함수를 만나보았지요? 

자.. 그러면, 이제 남은 것은 Content.asp의 가장 하단의 ASP 소스인데요.. 이것의 역할은 무엇일까요? 소스의 상단에서 GetString 메소드를 읽어온 데이터들을 화면에 출력해 주는 부분의 소스랍니다..  ^^ 물론, 그 값이 있을 경우에 한해서 말이죠.. 

<%
  if arrComment <> "" then
    Dim arrRecord, arrColumn, inum
    arrRecord = Split(arrComment,chr(13))
%>
  <br><font size=2><b>Comment</b></font>
  <table width="540" bgcolor="slategray" cellspacing="1">
<%
  for inum=0 to Ubound(arrRecord)-1
    arrColumn = Split(arrRecord(inum), Chr(9))
%>
    <tr bgcolor="white">
      <td><p><%= arrColumn(0)%>(<%=arrColumn(1)%>)</p><%=arrColumn(2)%>
      </td>
    </tr>
  <%next %>
  </table>
<%
end if%>

소스가 조금은 복잡해 보이지만 꼭 그렇지도 않습니다. 내부가 어떻게 동작하는지를 이해한다면 대단히 쉬운 소스이지요 ^^  (아닌가?) 먼저, 우리는 위에서 말씀드렸다시피... GetString 메소드에 의해서.. 쿼리에 의한 데이터가.. 하나의 긴 문자열로 arrComment 라는 변수에 담겨져 있다는 것은 알 수가 있습니다.

만일,  이번 강좌를 시작하며 보여드린 이미지의 경우에서처럼 데이터가 들어있다면... (조운, 유비) arrComment 라는 변수에는 다음과 같은 데이터가 들어있게 됩니다. (두개의 레코드이죠?)

조운 2001-06-04 오전 11:00:00 저는 삼국지의 조운입니다. 좋은 글 잘 읽었습니다. 감사합니다.  유비 2001-06-04 오전 11:13:00 저는 유비입니다. 우비가 아닙니다.. 여하튼 좋은 글 너무나도 잘 읽었구요. 그대로하면 진짜 갑부가 되겠네요. 흠흠...

라고 말이지요... 눈에 보기에는 주욱 글들이 이어져서 들어가 있는 것처럼 보이지만... 실은 그렇지 않아요..  여러분은 이미 위의 데이터중에서 "조운 2001-06-04 오전 11:00:00 저는 삼국지의 조운입니다. 좋은 글 잘 읽었습니다. 감사합니다."라는 부분까지가 하나의 레코드이고, 그 나머지가 또 하나의 레코드 라는 사실은 알고 있을 것입니다. ^^

이것은 서버도 마찬가지로 구분하고 있습니다. 어떻게 구분을 하느냐? 레코드의 단위마다 구분자로써 캐리지 리턴문자를 넣는 것이지요.. chr(13)을요  ^^ chr(13)은 우리 눈에는 안 보이지만 엔터와 같은 표시(정확히는 캐리지 리턴값)를 나타내는 것입니다.

즉, 위의 문자열은 우리 눈에는 한줄처럼 보이지만 사실 내부적으로는 다음처럼 그러한 표시가 들어가  있다는 것을 의미하지요.

조운 2001-06-04 오전 11:00:00 저는 삼국지의 조운입니다. 좋은 글 잘 읽었습니다. 감사합니다.chr(13)유비 2001-06-04 오전 11:13:00 저는 유비입니다. 우비가 아닙니다.. 여하튼 좋은 글 너무나도 잘 읽었구요. 그대로하면 진짜 갑부가 되겠네요. 흠흠...chr(13)

그리고, 또한, 하나의 레코드인 "조운 2001-06-04 오전 11:00:00 저는 삼국지의 조운입니다. 좋은 글 잘 읽었습니다. 감사합니다." 도 사실은 3개의 컬럼이 섞여있는 모습이지요?

해서, 이것 또한 내부적으로 각각의 컬럼의 구분을 Tab코드인 chr(9)로써 한답니다. 즉, 위의 긴 하나의 문자열은 사실 내부적으로 다음처럼 구성되어져 있다는 것이지요

조운chr(9)2001-06-04 오전 11:00:00chr(9)저는 삼국지의 조운입니다. 좋은 글 잘 읽었습니다. 감사합니다.chr(13)유비chr(9)2001-06-04 오전 11:13:00chr(9)저는 유비입니다. 우비가 아닙니다.. 여하튼 좋은 글 너무나도 잘 읽었구요. 그대로하면 진짜 갑부가 되겠네요. 흠흠...chr(13)

그렇기에 우리는 chr(13)으로 Split 을 하면 각각의 레코드를 가져올 수가 있구요. 그렇게 Split해서 얻어낸 값(레코드)를 다시 chr(9)로 Split 하면 각각의 컬럼값을 얻어낼 수가 있게 됩니다. 해서, 우리의 소스는 먼저 chr(13)으로 문자열을 Split 해서 각각의 레코드를 구한 다음.. 루프를 돌면서 그 각각의 레코드내에서 다시금 chr(9)로 Split 을 해서 각각의 컬럼값을 뽑아내어.. "이름 (날짜) 내용" 의 포맷으로 데이터를 각각 출력해주고 있는 것이랍니다.

이해가 되실런지 모르겠네요..  ^^

이해가 잘 안가신다면.... 다시 한번 말씀드리지만, 위에서 말씀드린 링크(GetString 메소드의 사용법)로 가셔서 그 내용을 꼭 공부해 보도록 하세요..  그리고, Split 이라는 함수의 역할도 궁금하시다면 MSDN의 링크를 통해서 공부해 보시구요..  ^^  무엇보다 좋은 것은 MSDN 에서 검색해서 각각의 기능에 대해서 더욱 공부해 보는 것이겠죠?

MSDN Search : http://search.microsoft.com/us/dev/default.asp

더 필요한 내용을 스스로 찾아서 공부하는 습관을 기르는 것이 중요하답니다.  ^^ 여러분이 원하는 것을 스스로 찾아나서서 결국은 알아내는 방법을 익히면 그때부터 여러분은 서서히 중급의 입구에 들어서게 되는 것이니까요..  ^^

이제 Content.asp 부분의 설명은 정리가 되었네요...

그렇다면, 이제 궁금한 것은 사용자가 입력한 커멘트를 데이터베이스에 저장하는 부분이겠네요. 즉, form의 action 페이지인 Insert_Comment.asp 가  될 것입니다.

Insert_Comment.asp의 역할은 무엇일까요?

커멘트 테이블에 사용자가 입력한 사용자의 이름과  글을 입력하는 것이겠지요? 단지, 그것만을 입력하는 것이 아니라 사용자가 입력한 커멘트가  원래 어떤글의 커멘트로 달리는 것인지 그 원본 글의 board_idx 값도 같이 저장해야 할 것입니다. 그렇죠? 그래야 나중에 board_idx 값이 123 인 글에 달린 커멘트들을 모두 가져오고 싶을 경우 이 값을 기준으로 Comment 테이블에서 데이터들을 가져올 수 있을테니까요  ^^

그렇습니다.

그럼 이제 Insert_Comment.asp의 소스를 봅시다. 이미 여러분은 상당히 수준이 있으시기에 그리 어렵지 않게 소스를 이해하실 수 있을 겁니다.

Insert_Comment.asp

<!--METADATA TYPE="typelib" NAME="ADODB Type Library"
  FILE="C:\Program Files\Common Files\SYSTEM\ADO\msado15.dll" -->
<% Option Explicit %>
<!--#include file="config.asp"-->
<%
Dim board_idx, GotoPage, name, content
board_idx = Request.form("board_idx")
GotoPage = Request.form("GotoPage")
name = Request.form("name")
content = Request.form("content")

Dim adoRs
Set adoRs = Server.CreateObject("ADODB.RecordSet")
adoRs.Open "Comment", strConnect, adOpenStatic, adLockPessimistic, adCmdTable

with adoRs
  .AddNew
  .Fields("Co_name") = name
  .Fields("board_idx") = board_idx
  .Fields("Co_content") = content

  .Update
  .Close
end with

Set adoRs = nothing
Response.Redirect "content.asp?GotoPage=" & GotoPage & "&board_idx=" & board_idx
%>

굳이 소스중에 설명을 할 부분이 있다면 이미 아는 이야기이겠지만. 역시나 이번의 Insert 의 경우도 레코드셋을 통해서 하고 있다는 겁니다.

Set adoRs = Server.CreateObject("ADODB.RecordSet")
adoRs.Open "Comment", strConnect, adOpenStatic, adLockPessimistic, adCmdTable

with adoRs
  .AddNew
  .Fields("Co_name") = name
  .Fields("board_idx") = board_idx
  .Fields("Co_content") = content

  .Update
  .Close
end with

다시 한번 강조하지만 속도측면을 생각하면 이 방법이 아니라 쿼리를 통해서 Insert 하는 것이 낫습니다. 근데, 전 왜 이렇게 했냐구요?  그냥요...  하지만, 만일 속도가 넘 느리다면... 저의 경우도 차후 튜닝하면서 이 부분의 소스를 바꿀 것임에는 틀림이 없답니다...  ^^ 여러분의 경우도 속도를 고려하셔서 SQL 쿼리로 바꾸시는 것이 좋을 것 같아요..  ^^

이제 소스는 끝났습니다. 여러분이 테스트하실 일만 남았네요..  ^^ 자... 위의 소스들을 수정, 추가하신다음 한번 테스트해보세요... 잘 동작하지요? 물론, 수준이 있으신 분들에게는 전혀 어렵지 않았을 수 있는 내용이었습니다만.. 제 강좌는 언제나 초보를 기준으로 작성되고 있기에.. 이러한 커멘트 달기 기능에 대한 내용을 마치 중요한 것처럼 다루어 보았습니다.

^^  시작하시는 분들에게 도움이 되기를 바라는 마음입니다...

이제 이번 강좌를 마무리할 시간입니다. 다음 강좌는 게시판 검색기능을 해야 하겠지요? 그다지 어렵지는 않을 것이기에.. 짧게 끝날 수도 있어보입니다...  하긴 여러분도 빨리 이러한 부분은 마치고.. 자료실을 접목하는 것을 하고 싶으실 것이지요?  저도 그래요...  ^^ 얼릉 마쳐보자구요..

그리고, 계층형 게시판을 원하시는 분들이 있는데... 이번 강좌에는 그 내용은 빠질 것입니다. 이유는? 기존의 계층형 알고리즘이 아닌 다른 방법으로 접근해 볼까 생각중이어서요..  ^^ 해서, 계층형 강좌는 이후 다른 강좌를 통해서 접근해 볼까 한답니다....  ^^

그럼 ... 일단, 다음 강좌를 기대하면서 이번 강좌는 이만 접어보겠습니다... 여러분도 좋은 6월달이 되시길 바랄꼐요... ^^


authored by


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

로딩 중입니다...

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