login register Sysop! about ME  
qrcode
    최초 작성일 :    2001년 04월 30일
  최종 수정일 :    2001년 07월 19일
  작성자 :    taeyo
  편집자 :    Taeyo(김 태영)
  읽음수 :    124,996

강좌 목록으로 돌아가기

필자의 잡담~

역시나 저번 강좌로 인한 많은 토론이 이루어지고 있네요...
좋은 제안들도 많이 나오고 있고, 자신이 테스트한 많은 방법들이 많이 공유되고 있습니다요. ^^
부디 앞으로도 좋은 토론이 이루어졌으면 좋겠습니다. 누가 옳고, 누가 틀렸는지를... 따지는 것이 아니라.. 어떻게 하면 좀 더 좋은 코드를 작성할 수 있을까를 서로 고민하면서요....^^ 그렇게 우리는 같이 고민하고 같이 발전해 나갈 수 있을 것이라고 생각한답니다. 물론, 많은 분들이 주신 의견을 수렴하면 훨씬 더 나아질 것이구요.. ^^

그렇죠? 만일 데이터가 수백만건인 경우에 조회하는 것을 만들어야 한다면.. 테이블 구조부터 시작해서, 인덱스 등등도 상당히 많은 고려를 해야 할 것입니다. ^^ 여러분이 교환하고 있는 의견 중 그러한 부분을 생각

이번 강좌에서는 글의 본문을 보는 부분을 만들어 나가려 한답니다. 뭐.. 크게 어려운 부분은 없을 것입니다만. ^^ 자잘한 기능들이 있으니 여러분에게 역시나 조금은 도움이 되실 것이라 생각한답니다. ^^  그럼 한번 진행해 볼까요?

위의 그림이 먼저 만들어볼 간단한 구성의 본문내용보기 화면입니다. 디자인은 안된 상태이니.. 여러분이 나름대로의 디자인은 붙여보실 수가 있겠지요? 이전 태오의 강좌에서 내놓은 게시판에 본문에 비하면 조금은 틀린 것이 있는데요.. 

그것은 수정하기, 삭제하기를 시도하기 위해서 먼저 비밀번호를 이곳에서.. 입력하고 수정, 삭제로 분기된다는 것이지요...  페이지의 수를 줄이고, 사용자를 조금 더 편하게 하기 위한 일환으로 이처럼 해보았습니다. 몇몇 사이트에서 위와 같은 구성을 갖는데요... 쓰다보니 그게 훨씬 편하더라구요..  ^^ 그래서 이번에는 그것을 적용해 본 것이랍니다.

그렇다면, 이제 본문의 소스를 보아야 하겠지요?   자...  공개합니다..

Content.asp

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

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

  SQL = "Update MyBoard set b_readnum=b_readnum+1 where board_idx=" & request("board_idx")
  adoDb.execute SQL

  SQL = "SELECT board_idx,b_name,b_title,b_date,b_email,b_ipaddr,b_readnum,b_pwd, "
  SQL = SQL & " 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

  if Rs.BOF or Rs.EOF then
    Response.Write "<Script>"
    Response.Write " alert('현재 글은 존재하지 않습니다.');"
    Response.Write " location.href='list.asp';"
    Response.Write "</Script>"
    Response.End
  else
    board_idx = Rs("board_idx")
    name = Rs("b_name")
    title = Rs("b_title")
    writeday = Rs("b_date")
    mail = Rs("b_email")
    ipaddr = Rs("b_ipaddr")
    readnum = Rs("b_readnum")
    content = Rs("b_content")
    content = replace(content,vblf,"<br>")
  end if

  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()
  {
    document.myform.action = "Comment.asp";
    document.myform.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">
        <a href="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>
</form>
</body>
</html>

소스가 한 눈에 모두 들어오기에는 버겁겠네요.. 조금 길죠? 하지만, 소스를 이해하고 나면 전혀 길어보이지 않을 겁니다. 내용자체는 너무나도 심플하니까요..  ^^ 소스에는 4가지 종류의 코드가 자리하고 있습니다.

첫번째는 ASP 코드입니다. 이것은 list.asp 에서 사용자가 클릭하여 넘어온 해당 글의 board_idx 값을 받아서 그 값을 가지고 데이터베이스에 쿼리하는 역할을 합니다. 쿼리로 해당 Board_idx 값에 해당하는 레코드를 가져와서 그 레코드에서 필요한 컬럼의 값들을 지역변수에 모두 담고 있는 것을 확인하실 수 있을 것이구요.. 이에 대해서는 밑에서 조금 더 구체적으로 알아보도록 하겠습니다.

그 다음에 존재하는 것은 스타일시트입니다. 이것은 HTML의 모양새를 지정하기 위해서 사용된 것이랍니다. 그리고, 자바 스크립트입니다. 여기서 자바 스크립트가 필요한 이유는... 사용자가 비밀번호 입력란에 비밀번호를 넣고, [수정하기]나 [삭제하기]를 누를 경우,  각각의 해당 ASP 페이지로 분기할 수 있도록 하는 스크립트들이 들어있게 됩니다..  ^^

그리고, 화면에 디스플레이를 위한 HTML들이 또한 존재합니다. HTML의 중간 사이사이에는.. 출력을 위한 ASP 코드들이 들어가서 사용자에게 보여주기 위한 페이지의 모습을 완성하게 됩니다.

전체적인 흐름은 머리속에 들어오시나요? 그렇다면, 이제 소스를 찬찬히 순서대로 살펴보도록 하자구요..  ^^

가장 첫 부분에 등장하는 소스는 다음과 같습니다.

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

네.... 이 부분은 이미 List.asp 를 공부할 때 알아보았듯이 Option Explicit 를 지정하는 부분과,  데이터베이스 연결 문자열이 들어있는 config.asp 파일을 인클루드 하는 부분입니다.  ^^ 그리고, List.asp 에서 넘어온 Gotopage 라는 인자의 값을 로컬변수에 저장하는 부분입니다. List.asp 에서는 총 2개의 인자가 Content.asp 로 넘어오도록 우리가 만들어 두었는데요... 그것은 사용자가 어떤 글을 선택했는지 그 글의 고유코드인 board_idx 값과 위의 페이지 값입니다.

왜? list.asp 에서의 현재 페이지 번호 값을 content.asp로 넘겨왔는지 궁금하시겠죠? 그것은 본문보기인 Content.asp 에서 글을 다 본 뒤, 리스트로 이동할 경우.... 이전에 내가 보던 페이지로 되돌려주기 위함입니다. List.asp 는 우리가 만들어 놓은 것처럼... Gotopage 라는 값으로 넘어오는 것이 없으면 무조건 1 페이지를 보여주게 될테니까요...

물론,  사용자가 본문 글을 읽는 동안에... 글이 마구 늘어나거나, 마구 삭제되어서.. 일전의 페이지로 돌아간다고 하더라도... 그 페이지가 현재 내가 글을 본 페이지가 아닐 수도 있습니다만...  그 정도는 감수하셔야 할 겁니다. ^^ 안 그러면, List.asp 로 돌아갈 때마다. 현재들의 페이지 위치를 구하고 그 페이지로 이동하게 하는 것.. 자체를 구현해야 하는데, 구현이 어려웁지는 않겠지만, 서버에 이유없는 부하를 줄 수 있겠죠? 해서, 약간의 오차가 있다고 하더라도 그냥 일전의 페이지로 바로 보내게 하려는 것이랍니다.  ^^

그래서, Gotopage 라는 페이지 값을 Content.asp로 가져온 것이구요. Content.asp 페이지내에서 [ 리스트로 ] 란 링크를 선택하면 이 페이지값을 다시금 list.asp로 보내줄 것이랍니다 ^^

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

이 부분의 코드는 데이터베이스와의 연결을 시도하는 부분이기에 이해하는데에 큰 무리가 없을 것입니다. 단지, 왜 Connection 개체의 인스턴스의 이름으로 adoDb를 사용했냐고 물으신다면... 이렇게 답해드리고자 합니다.     

"그냥~~~~"   (실은 인브레인의 최현진님의 영향도 조금 있습니다. 그분이 Naming Rule을 상당히 강조하셔서리..)

   SQL = "Update MyBoard set b_readnum=b_readnum+1 where board_idx=" & request("board_idx")
   adoDb.execute SQL

이 부분은 현재 글의 조회수를 +1 증가시키는 부분입니다. Update 쿼리를 던져서 조회수를 증가시키고 있는데  내용은 그다지 어렵지 않을 것입니다. 하지만, 이 코드가 약간의 문제가 있는 것은.... 현재의 Content.asp 가 refresh 될 때마다 무조건 조회수는 1이 증가한다는 사실입니다.

이것은 막는 것이 좋겠지요? 즉, 조회수는 사용자가 List.asp 에서 특정 글을 선택하고 이 Content.asp로 들어와야지만 증가시켜주는 것으로 만드는 것이 훨씬 나을 것입니다. 좋습니다.... 그렇게 만들어 봅시다... 그러나, 지금이 아니라... 앞으로 그렇게 수정해 나갈 것이랍니다.  ^^ 나름대로의 방법으로 한번 고민해 보시는 것도 나쁘지 않아보입니다. 그리고나서 제가 사용한 방법과 비교해 보는 것도 재미있겠지요? ^^

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

   Set Rs = adoDb.execute(SQL)

이어지는 쿼리문의 작성입니다. 사용자가 선택한 그 레코드만을 쿼리해 오는 것이지요.. 쿼리를 작성할 때 * 을 사용하지 않고, 모든 컬럼명을 다 써 주고 있는 것을 볼 수가 있는데요.. 이것이 * 을 사용하는 방법보다 나은 방법이라는 것을 기억하시기 바란답니다. 그리고, 그 쿼리를 실행함으로써 Rs 라는 레코드셋에는 해당 레코드가 들어왔을 것입니다. 그러하다면, 이제 무엇을 해야하나여? 그 레코드에서 우리가 필요한 각각의 컬럼을... 변수에 주욱 담는 단계가 필요할 것입니다. 하지만, 그전에....  뭔가 깨림직하지 않나요?

만일, 두명의 사용자가 게시판에 들어왔는데,  A 라는 사용자가 게시판에 새로이 글을 썼다고 가정합시다. 그 떄, B 가 게시판의 목록을 봅니다. 거기에는 사용자 A 가 방금 올린 글도 있을 것입니다. B는 그 글을 읽으려 하다가 갑자기 걸려온 전화에 잠시 머뭇거립니다. 이런.. 여자친구에게 전화가 왔군요.. -_-; 조용히 마우스에서 손을 뗴고 최선을 다해 여자친구와 이야기를 나누고 있네여.. 그 사이 A는 아까 자신이 올린 글이 맘에 안 들어 버렸습니다. 해서 지워버렸지요.... 자신이 썼던 글을 지운 A는 그리고는 사이트를 빠져나가 버렸습니다.

이 때, B의 통화가 그다지 내용이 좋지 못했나 봅니다. 또 여자친구와 다투었군요.. -_-a 그래서 "커플끼리 넘 오래 통화하면 싸움이 생긴다"는 말이 있는 것입니다. 어쩃든 기분이 상한 B 아까 읽으려 했던 A가 써놓은 글을 읽으려 듭니다. 하지만, 잠깐...  이 글은 이미 지워져버린 상태입니다.

하지만, B의 게시판 화면은 전화하는 내내 새로 갱신된 적이 없기 때문에... 예전의 목록을 그대로 가지고 있었던 것이죠. 해서 B의 브라우저에는 이미 삭제된 글도 아직 남아있는 것처럼 보일 것이고, 그 글을 읽으려 할 수 있을 것입니다.

어쩃든 B는 그 글을 눌렀구요..  Content.asp로 이동합니다. 그러나, 그러한 board_idx를 가지는 레코드는 이미 삭제되어져 존재하지 않기에... 레코드셋에서 데이터를 가져와서 변수에 담으려 할 경우 다음과 같은 에러가 날 수 있습니다.

Either BOF or EOF is True, or the current record has been deleted.
Requested operation requires a current record.

혹은 한글로는,

"BOF 나 EOF 가 참이거나 현재 레코드가 삭제되었습니다. ... "

이유는.... 해당 레코드가 없는데, 그 레코드에서 데이터를 가져올려고 해서이지요.. 그런 것을 알리가 있든 없든... 사용자 B 는 화가 물밀듯이 밀려옵니다. "이런 C8@#&$%@^!*^#&!%%#*! 사이트가 뭐 이래... 어떤 XX 가 이 사이트 좋다구 그랬어?"라며 사이트는 이유없이 모든 욕을 다 먹을 수가 있게 된다는 것이지요...   -_-;;

그러므로, 이러한 에러를 피해가는 방법으로... 데이터를 불러다 쓰기 전에 먼저 데이터의 유무를 확인하는 검다. 레코드가 존재하는지 안 하는지를 검사하는 것이지요...  그를 위해서는 레코드셋 개체의 BOF 혹은 EOF 가 쓰입니다. 해서 만일 EOF, BOF 라면.. 현재의 레코드는 존재하지 않는 것이니 그렇다는 알림 메시지를 알리고 list.asp로 되돌려 보내구요.. 레코드가 존재할 경우만 그 레코드에서 해당 데이터들을 가져오는 것이랍니다. 다음 코드처럼 말이져

    if Rs.BOF or Rs.EOF then
        Response.Write "<Script>"
        Response.Write "  alert('현재 글은 존재하지 않습니다.');"
        Response.Write "  location.href='list.asp';"
        Response.Write "</Script>"
        Response.End
    else
        board_idx = Rs("board_idx")
        name = Rs("b_name")
        title = Rs("b_title")
        writeday = Rs("b_date")
        mail = Rs("b_email")
        ipaddr = Rs("b_ipaddr")
        readnum = Rs("b_readnum")
        pwd = rs("b_pwd")
        content = Rs("b_content")
        content = replace(content,vblf,"<br>")
    end if

   Rs.Close
   adoDb.close
   Set Rs = Nothing
   Set adoDb = nothing

만일, if Rs.BOF or Rs.EOF then 라면, 현재 데이터는 존재하지 않는 것이니... 자바스크립트를 사용자에게 건네어주게 하고 Response.End 를 합니다.  ^^  그리고, 만일, 데이터가 있다면 대부분의 경우가 이 경우에 해당하겠습니다만.... 각각의 컬럼의 값들을 지역변수에 담는 것이지요... 가급적이면 컬럼의 순서에 맞추어서요

그리고, 소스의 하단에서는 사용이 끝난 레코드셋 개체와 데이터베이스 커넥션 개체를 냅다.. 닫고, 소멸시키고 있습니다. 이것이 무척이나 중요합니다. 빠른 개체의 해제는 페이지의 성능향상에 도움이 되니까요..... 가끔 보면 페이지의 제일 하단에서 이러한 개체의 소멸처리를 하시고는 하는데요... 그것은 좋지 않은 코드입니다. 개체가 더이상 필요가 없는 시점에 조금이라도 빨리 해제하는 것이 서버의 성능향상에 도움이 됩니다.  참고하세요..

그리고, 위에 제가 작성한 contetn.asp 코드는 나름대로 최적화 되어있는 코드입니다. 코드의 스타일을 자세히 살펴보세요. ASP에서 사용할 데이터를 모두 로컬변수에 담고  데이터베이스와의 연결은 최대한 빨리 끊어버립니다. 그리고, 이하에서는 로컬변수만을 사용합니다. 보시기에도 ASP코드와 HTML들이 분리되어져 있어보이지 않나요?

이렇게 코드를 간결하게 작성하면 차후 디자이너들이 디자인을 붙일 경우도... 복잡한 코드들로 불안해 하지 않을 수 있습니다... 역시나 참고하세요..

그 다음의 코드들은 그리 어려운 부분이 없답니다....  ^^ 주욱 화면에 출력해 주는 부분이니까요.... 이제, 위 ASP 코드들은 화면에 출력할 모든 HTMl을 생성했구요.. 그에 따라 화면은 만들어져서.. 다음과 같은 그림의 결과화면을 여러분은 만나시게 된 것이랍니다.

 

그렇다고, 여기서 강좌가 끝나느냐?:  그것은 아닙니다.. 이유는 아직 설명해야 할 것이 남았기 때문이지요.. 음하하.. 그것은 자바스크립트 입니다.... 결과에서 보시다시피 이번 글 보기 페이지는 수정과 석제를 위해서.. 먼저 비밀번호를 요구하고 있습니다. 기존 제 게시판은 먼저 글을 수정한 다음.. 비밀번호를 요청했었는데요. 이번에는 그 틀을 바꾸어 본 것이지요.. 말씀드렸다시피 이게 더 나은 것 같아서요....  ^^

자.. 그런데, 어떤 사람들은 비밀번호를 넣지 않고 [수정하기]나 [삭제하기]를 누를 수도 있겠지요? 그런 경우에 대비하기 위해서... 비밀번호란에 아무것도 넣지 않고....  수정이나 삭제를 시도하면 경고메시지를 자바스크립트로 나타내 주는 것입니다. 이것은 어려울 것이 없지요?  그런데, 뭐하러 이야기하느냐구요?  그렇다면 다음의 경우를 봐주세요

만일, 사용자가 스페이스바를 여러번 입력한 다음...  수정하기를 누르면 어떻게 될까요? 기존의 여러분의 자바스크립트는 

var pwd = document.myform.pwd.value;
if (pwd == "")

    alert("비밀번호를 입력해 주세요"); 
    return;
}

와 같은 식으로 코딩이 되어져 있을텐데요...  ^^
그러면, 스페이스도 문자로 인식하기에 위의 자바스크립트는 스페이스만을 입력한 것을 걸러주지 못합니다. 물론, 자바스크립트를 쓰지 않고, VBScript를 클라이언트 스크립트로 사용했다면.. replace 함수를 통해서.. 이것은 어렵지 않게 처리가능할 것입니다. 만일, VBScript로 작성했다면 다음과 같이 말이지요..

pwd = document.myform.pwd.value
pwd = replace(pwd, " ","")
if  pwd = "" then
   msgbox "비밀번호를 입력해 주세요" 
End if

즉, 공백문자인  "  " 를 널문자인 ""로 바꾸어준다음 널값의 여부를 체크하는 것이지요...

하... 지... 만...

자바스크립트에는 Replace 와 같은 함수가 지원되지 않습니다.. Replace 라는 함수가 있기는 한데요.. 이것은 제한적인 편이어서요...  제대로 사용할라면 정규표현식까지 공부를 해야하는데... 그게 그리 쉬운 편이 아니어서요..  T.T

그래서, 푸서리의 악어라는 친구는 자바스크립트를 사용해서 VBScript의 Replace 와 같은 함수를 만들어 공개했는데요.. 그게 소스중의 function CheckStr(strOriginal, strFind, strChange) 랍니다. 그냥 여러분들도 가져다가 사용하실 수 있지요..  악어님이 공개하신 것이니까요..  ^^ 이 함수의 기능에 대해서 자세히 알고 싶다면 다음 링크로 가보세요...  사용법과 이 함수의 기능에 대해서 자세한 설명을 보실 수 있을 것입니다.  ^^

일단,  푸서리 사이트로 들어가신 다음에요..   http://dongari.puseori.co.kr/
다음 링크로 들어가세요.. 아래 링크로 바로 들어가면 그냥 푸서리가 나올 겁니다.

  http://dongari.puseori.co.kr/study/script/function/string.asp?part=1 

이 링크에서 여러분은 좋은 정보를 또한 얻을 수 있을 것이랍니다.
그럼... 아쉬운대로... 이번 강좌는 여기서 접을까 합니다.

물론, 부족한 부분이 없지는 않지요? 그래서, 다음 강좌들에서 이 content.asp로 조금 더 보강해 볼 것입니다. 먼저, 보강할 부분을 알려드립니다. 여러분도 고민해 보세요...

1. 현재의 페이지에서 [새로고침]을 하면 조회수가 그냥 막 올라간다...우리는 list.asp 에서 링크를 눌러서 글을 보는 것들만 조회수를 올리고 싶다.. 단지 새로고침만 한다고 조회수가 늘어나서는 안된다.. 어케 할 것인가?

2. 본문에서도 이전글, 다음글로 이동하고 싶다.. 어떻게 하면 될까?

결혼 전에 끝내려고 맘 먹은 강좌였는데...  터무니없이 시간이 없는 바람에... 결혼후에도 신혼의 시간을 쪼개어 강좌를 써야할 것 같네요.... 너무 강좌가 늦어서 대단히 죄송합니다만.. 부디 이해해 주세요... 신혼이라는 것이 다 그렇지 않겠습니까??  몸이...고단하잖아요....  히히... 드디어 다음 주 태오는 빰빠밤을 합니다....  2001년 5월 8일 화요일....  음하하... 평일을 노렸습니다.

여러분의 축복~~~  대단히 감사드립니다....   또한, 여러분의 이해심 정말로...  감사합니다.


authored by


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

로딩 중입니다...

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