01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
<% Option Explicit
Dim objDBConn Dim objRs
Dim strSQL
Dim intSeq, strName, strEmail, strSubject, strContent Dim blnTag, intCount, strUserIP, dtmReg_Date
intSeq = Request.QueryString("seq")
Set objDBConn = Server.CreateObject("ADODB.Connection") Set objRs = Server.CreateObject("ADODB.RecordSet")
objDBConn.Open "test", "sa",""
strSQL = "Update board Set intCount = intCount + 1" strSQL = strSQL & " Where intSeq = " & intSeq
objDBConn.Execute strSQL
strSQL = "Select strName"' objRs(0) - 이름 strSQL = strSQL & ",strEmail" ' objRs(1) - 이메일 strSQL = strSQL & ",strSubject" ' objRs(2) - 제목 strSQL = strSQL & ",strContent"' objRs(3) - 내용 strSQL = strSQL & ",blnTag" ' objRs(4) - 태그사용여부 strSQL = strSQL & ",intCount" ' objRs(5) - 조회수 strSQL = strSQL & ",strUserIP" ' objRs(6) - 작성자 IP strSQL = strSQL & ",dtmReg_Date" ' objRs(7) - 작성일 strSQL = strSQL & " From board" strSQL = strSQL & " Where intSeq = " & intSeq
objRs.Open strSQL, objDBConn
strName = objRs(0) strEmail = objRs(1) strSubject = objRs(2) strContent = objRs(3) blnTag = objRs(4) intCount = objRs(5) strUserIP = objRs(6) dtmReg_Date = objRs(7)
objRs.Close Set objRs = nothing
objDbConn.Close Set objDBConn = nothing
If blnTag = "F" Then strContent = Server.HTMLEncode(strContent) End If
strContent = Replace(strContent, vbLf, vbLf & "<br>") %> <html> <head> <title>태지의 게시판 - 내용보기</title> </head> <body> <table> <tr> <td>이름</td> <td><%=strName%></td> <td>등록일</td> <td><%=dtmReg_Date%></td> </tr> <tr> <td>Email</td> <td><ahref="mailto:<%=strEmail%>"><%=strEmail%></a></td> <td>조회</td> <td><%=intCount%></td> </tr> <tr> <td>제목</td> <tdcolspan="3"><%=strSubject%></td> </tr> <tr> <tdcolspan="4"style="padding:15px;"><%=strContent%></td> </tr> <tr> <tdcolspan="4" align="center"> <ahref="edit/edit.asp?seq=<%=intSeq%>">수정하기</a> <ahref="list.asp">목록으로</a> <ahref="delete/delete.asp?seq=<%=intSeq%>">삭제하기</a> </td> </tr> </table> </body> </html> |
소스가 저번보다 길어졌나요? 하지만 내용은 지난번 'list.asp' 와 크게 다를바가 없답니다. ^^ 지난번 'list.asp' 를 잘 이해하신 분이라면 오늘의 강좌는 상당히 쉬울거라고 생각합니다. 그럼 자신감을 가지고 소스를 분석해 보도록 하지요..
이제는 제법 친숙하게 느껴지는 2, 4, 5, 7번 줄입니다. (저만 그런가요? ^^a) 'Dim' 이라는 변수 선언 없이는 함부로 변수를 선언하여 사용할 수 없도록 하는 'Option Explicit ' 라는 명령어가 2번 줄에 나타나 있습니다. 이 명령어를 사용하는 것이 좋은 코딩 습관이라고 이미 말씀드렸지요.
4,5번 줄은 objDBConn 과 objRs 라는 변수를 선언하였는데요. 이것은 Connection 개체의 인스턴스와 RecordSet 개체의 인스턴스라는 사실을.. 잘 알고 계실겁니다.
가끔'objDBConn' 과 'objRs' 는 어떤 의미가 있는 단어냐는 메일을 받게 되는데요. DBConn은 'DataBase Connection' 의 약자라고 보시면 되겠습니다. Rs는 물론 'RecordSet' 의 약자고요. 그리고 이것들은 개체(의 인스턴스)이므로 개체를 의미하는 영어 'object' 의 obj 를 따와서'objDBConn' 과 'objRs' 가 되는 것이랍니다. (정수형은int를, 문자열은 str을 변수 앞에 붙이는 것과 같은 의미지요 |
7번 줄은 SQL 문을 담는 strSQL이라는 변수를 선언하였습니다. 얘도 꾸준히 나오는군요..
그리고 9, 10번줄은 꽤 많은 변수들을 무더기(?)로 선언하였는데요. 개수에 겁먹지 마시고 자세히 보시면...... 어라? 어디선가 많이 본듯한 느낌이 드시지 않나요? 그렇습니다. 이것은 첫 강좌에서 test 라는 DB 안에서 'board ' 라는 테이블을 만들 때, 하나하나 입력했었던 컬럼(column) 명이 되겠습니다. 오래간만에 보니까 반갑지 않으시나요? ^^
DB에서의 컬럼명과 같은 변수명을 주었기 때문에 '반드시 그래야 하나?' 라고 생각하실 수도 있겠네요.. 하지만 반드시 그럴 필요는 없습니다. 컬럼 명과 변수명이 일치해야 한다는 규칙은 없습니다. 저는 단지 여러분들께서 헷갈리실까봐 일부러 DB와 ASP 문서에서의 변수명을 통일한 것이지요. 그러므로 여러분들께서 실제로 소스를 작성하실 때에는 변수명을 다르게 주셔도 상관없습니다. |
변수 선언 순서대로.. 9번째 줄은 '번호, 이름, Email, 제목, 내용'을 의미하게 되고요. 10번째 줄은 '태그 적용, 조회수, 작성자 IP, 등록일'을 의미하는 변수들이 되겠습니다.
그리고 12번 줄에서는 이전 페이지(list.asp)에서 넘겨준 'seq' 라는 값을 받아와서 intSeq 라는 번호를 의미하는 변수에 값을 지정하게 됩니다.
'받아와? 멀 어떻게 받아온다는 말이지?' 라는 생각을 하시는 분들이 계실 것 같은데요. 이미 우리는 지난 강좌에서 'get' 방식과 'post ' 방식으로 값을 전달하는 법을 배운 적이 있습니다. (혹시 아직까지 기억을 하고 계신 분이라면 정말 기억력이 좋은 분이시거나, ASP 를 처음 접해보는 분이 아닐거라는 막연한 추측을 해 봅니다. ^^a) 기억이 가물가물하신 분께서는 두번째 강좌인 '글 올리기' 중간 부분을 참고하시기 바랍니다. 제가 간단하게 요약해 드리면 get 방식은 브라우저의 주소창에 나오는 url의 뒤에 붙어서 값을 전달 하고요. post 방식은 HTTP 헤더(Header)에 값을 입력한 후전달하는 방식입니다.
list.asp 페이지에서 제목이 링크된 부분을 유심히 살펴보시면요.. (지난 강좌의 소스를 참고하는 분이시라면 'list.asp'의 소스 51번째 줄을 참고해 주시기 바랍니다.)
<그림 1>
그림에서 보시는 것처럼4번 게시의 제목에 마우스를 올려 놓았더니 작업표시줄에 빨간 테두리와 같은 내용이 나오는 것을 보실 수가 있을 것입니다. 이 부분은 content.asp를 링크하고 있는데요.. 예리하신 분들께서는 seq 라는 변수에 4라는 값을 담아서 넘기는 것을 눈치 채셨을 것입니다. 이 방법이 전에 말씀드렸던 get 방식이 되겠습니다. 주소(URL)의 뒤에 값을 붙여서 전송하는 것이지요.
이렇게 넘어온 값은 12번 줄에서 intSeq 라는 변수에 담아지게 됩니다. get 방식으로 넘어온 값이므로 Request.QueryString 으로 받았다는 사실을 기억해 주시기 바랍니다.
그리고.. 다음으로 넘어가서 '얘네들을 그냥 통째로 외워버려?' 라는 갈등을 때리게 만드는 14, 15번 줄은 Connection 개체의 인스턴스인 objDBConn 과 RecordSet 개체의 인스턴스인 objRs를 생성하는 부분이 되겠습니다. (굳이 외우려 하시지 않으셔도 됩니다. 자주 쓰다보면 손가락이 알아서 움직일겁니다.. ^^)
그리고 17번 줄은 Connection 개체의 Open 메소드를 이용해 'test' DB와 연결 을 시켰습니다.
자.. 그런데 19번과 20번줄에 낯선 SQL 문이 등장을 합니다.. 여기서는 'Update' 문이 등장을 하는데요. 이것은 '수정/변경'을 담당하는 구문이 되겠습니다. (두번째 시간에서는 Insert(입력)문, 세번째 시간에서는 Select(조회)문, 오늘은 Update(수정) 문이 나왔군요. 다음 시간에 삭제를 담당하는 Delete문 까지 공부하면 SQL 문에 대한 설명은 일단락 짓게 되겠네요)
Update 문의 형식은 다음과 같습니다.
"Update" + Table 이름 + "Set" + 변경할 값 + "Where" + 조건절
제가 써놓고도 '참 이해하기 힘들겠다..' 싶네요. 바로 예를 들어드리도록 하지요. ^^ 지난 시간에 사용했던 Query Analyzer 를 또 한번 실행해 보도록 하겠습니다. (시작 -> 프로그램 -> Microsoft SQL Server -> Query Analyzer )
우선 다음 그림처럼 현재 'board' 테이블에 있는 정보를 확인해보도록 하겠습니다. (실행은 F5번 키입니다)
이제는 다음과 같이 문장을 입력하신 후에 실행해 보도록 하겠습니다.
<그림 3>
어떻습니까. board 테이블에 있는 모든 이름(strName)이 '태지' 로 바뀐 것 을 보실 수가 있을 것입니다. (Update 문과 Select 문이 같이 있어서 헷갈리신다고요? 그렇다면 헷갈리실 것 없습니다. Query Analyzer 에서는 기록된 모든 SQL 문을 위에서부터 아래로차례차례 실행한답니다. 즉, 위의 경우에는 Update 문을 먼저 실행하고, 그 후에 Select 문을 실행했기에 결과가 저렇게 나온 것입니다. 그렇다면 또 하나의 의문이 드시지요?'모두가 아니라 선택적으로 실행하려면 어떻게 할까?' 라고 말이지요.. 그럴때에는 마우스로 싸악~ 긁어서 (block을 지정해서) 영역을 정하신 후에 실행하시면 됩니다.)
Update 문은 이처럼 기존의 정보를 수정 또는 변경할 때 사용하는 문장입니다. 하지만.. 웬지 결과가 찜찜하신 분들이 계실지도 모르겠습니다.. '내가 원하는 건 이런게 아냐!! 난 한놈(?)만 골라서 바꾸고 싶다구..' 라고 말이지요.
하나(또는 원하는 게시)만 바꾸고 싶다면.. 어떻게 하면 될까요? 이미 짐작하신 분들도 계시겠지요. 그렇습니다. 뒤에 'Where + 조건절 '을 추가하면 되는 것입니다.. 그렇다면 이번에는4번 게시만 이름을 '전람회'로 바꾸어 보도록 하겠습니다. 이렇게 하면 되겠습니다.
<그림 4>
어떻습니까. 이렇게 'Where + 조건절'을 추가하니까 원하는 게시만 수정할 수가 있게 되었습니다.
이제 Update 문의 사용법을 이해하시겠지요? Update 문은 이처럼 수정/변경시 유용하게 사용되는 구문입니다.
그렇다면 이제 본문으로 돌아가 보도록 하겠습니다. 본문에서 19~20번 줄은 도대체 무엇을 하려는 구문일까요? 무언가 값을 바꾸기는 하는것 같은데 말이지요. 네.. 지금 받아온 번호(intSeq)에 해당하는 게시의조회수(intCount)를 1만큼 증가 시키고 있습니다. 왜 이런 작업을 하는 것일까요? 보통의 게시판에서 조회수라는 것은 그 게시의 내용을 보았을 때 증가하게 되는 것이므로 이와같은 처리를 해 주는 것입니다. 즉, content.asp 페이지가 한번씩 실행될 때마다 조회수는 1씩 증가하게 되는 것이지요.
22번 줄은 방금 19~20번 줄에서 작성했던 SQL 문을 실행시키는 구문이 되겠습니다. '글 올리기' 에서 Insert 문을 실행할 때와 마찬가지로 Connection 개체의 Execute 메소드 를 사용합니다.
조회수를 증가시켰으면.. 이제는 본격적으로 내용을 보여주기 위한 SQL 문을 작성하게 됩니다. 24~33번 줄이 바로 그것인데요. 지난 시간에 공부했던 'Select ' 구문이 다시 등장을 하네요. Select 구문은 '조회'를 담당한다는 말씀을 지난 시간에 말씀드렸습니다. 위 구문의 뜻은 다음과 같답니다.
'list.asp 페이지에서 받아온 번호(intSeq)에 해당하는 게시의 이름(0), 이메일주소(1), 제목(2), 내용(3), 태그사용여부(4), 조회수(5), 작성자 IP(6), 작성일(7) 을 board 테이블에서 가져오시어요...'
그리고는 지난 시간과 마찬가지로 RecordSet 개체의 인스턴스인 objRs를 Open 시킨 후, 그 안에 SQL문에 해당하는 정보를 저장 하게 됩니다.
37번부터 44번까지는 objRs에 담겨진 정보들을 우리가 지정한 변수에 옮겨넣는 작업을 실행합니다. 'Select 문에서의 컬럼 순서'가 각각의 번호가 됩니다. 0부터 시작한다는 것을 꼭 기억해 주시기 바랍니다. (만약 'Select intCount, blnTag...' 이처럼 SQL 문을 작성하셨다면 objRs(0)에는 조회수가, objRs(2)에는 태그사용여부가 들어가게 된다는 말씀이 되겠습니다.)
사실 이 부분을 강좌처럼 굳이 변수에 넣지 않고 그냥 objRs(0), objRs(1)...objRs(7)과 같이 그냥 쓰셔도 무방하겠습니다. 저는 단지강좌를 보시는 분들께서 편하시기를 바라는 뜻에서 의미 전달이 쉽도록 변수에 저장하는 방법을 택한 것입니다. 마음에 드시는 방법으로 선택하시기를 바랍니다. ^^
objRs 안에 있는 정보를 모두 변수에 복사해서 넣었으니.. 이제 더이상 objRs는 필요가 없겠지요? 그래서 46, 47번 줄에서는 objRs 를 닫고(Close), 해제시켰습니다.(Set objRs = nothing) (만약 조금 전에 objRs(0) 과 같은 식으로 접근하시려는 분들께선 46, 47번 줄을 실행시키시면 안됩니다 . 아마도 '형식이 일치하지 않습니다' 라는 에러메시지를 만나게 되실겁니다.)
또한 이제 더 이상의 DB 연결은 필요가 없을것 같아서 49, 50번 줄에서는 objDBConn 도 닫고, 해제시켰습니다.
52~54번 줄이 상당히 재미있는 부분인데요. 이 짧은 구문이 상당히 큰 역할을 하게 된답니다. 보면서 말씀드리겠습니다.
If blnTag = "F" Then strContent = Server.HTMLEncode(strContent) End If
If 문이 낯설지는 않으시겠지요? 위의 구문을 해석하면 다음과 같습니다. '만약 태그사용여부(blnTag)가 사용안함(F - False) 이라면 내용(strContent)에 Server.HTMLEncode 메소드 를 적용시키시와~요.'
이렇게 말씀드리면 아마도 Server.HTMLEncode 메소드가 어떤 역할을 하는지 궁금해 하실 것 같습니다. Server.HTMLEncode 메소드에 대한 말씀을 드리기 전에 잠시 퀴즈를 하나 내고자 합니다.
우리가 만들고 있는 게시판에서는.. 기본적으로 태그를 먹을까요? 안먹을까요?
결론부터 말씀드리자면.. 정답은 '먹는다(태그가 적용된다) ' 가 되겠습니다. 즉, <b>전람회</b> 라고 입력을 했다면 브라우저에서는 '전람회' 처럼 Bold 체가 적용이 된다는 뜻이지요. 때문에 '태그사용여부'에 '적용함(T)'을 선택했다면 내용(strContent)을 보여줄때 별다른 수정없이 그대로 보여주면 되겠습니다.
그렇다면 문제는? 그렇습니다.'적용안함(F)' 을 선택한 경우가 문제가 되겠는데요.. 이 경우에는 Server.HTMLEncode 라는 메소드를 사용하게 되면 태그가 먹지 않은 상태 로 보여지게 되겠습니다.
'태그가 먹는다는건 뭐고 안먹는다는건 또 뭐야?? 뭔지 몰라두 먹는게 남는거 아녀??' 이런 분들을 위해서 간단한 예제 페이지를 한번 작성해 보도록 하겠습니다..
<tag_test.asp>
<html> <head> </head> <body> <input type="button" value="submit"> <br><br> <% Response.Write "submit 이라는 이름을 가진 회색 버튼을 보실 수가 있지요?<br>" Response.Write "이 버튼을 만드는 소스는 다음줄에 나와 있답니다<br>" Response.Write "<input type=button value=submit> <br>" %> </body> </html> |
이 페이지를'taiji' 폴더에 넣으시고실행시키시면 다음과 같은 결과 화면을 보실 수가 있을 것입니다. (혹시 주소를 잊으신 분들을 위해.. 'http://localhost/taiji/tag_test.asp ' 입니다.)
<그림 5>
어떻습니까? 우리가 원한 결과는 페이지의 위쪽에서는 버튼의 모양이 나오고, 밑에서는 그 버튼을 나오게 하는 소스를 보여지게 하는 것을 원했던 것이었습니다. 하지만 위,아래 모두 버튼의 모양이 나와버렸네요. 이 곳에서의 문제는 'tag_test' 페이지의 10번째 줄에 있는 '<' 부분과 '>' 부분이 되겠습니다.
웹브라우저에서는 '<' 과 '>' 그리고 '&' 같은 문자들을시키지도 않았는데 지 맘대로태그로 인식해 버립니다. 그렇다면 이런 문자들을 원래 모습 그대로 보고 싶다면 어떻게 해야 할까요.. 이런 경우에는 웹브라우저에서 '<' 과 '>' 를 대체할 특수문자 '<' 와 '>' 를 사용하시면 됩니다. 따라서 '<' 는 '<'로, '>' 는 '>' 로 바꾸어 준 후 'tag_test.asp' 페이지를 다시 실행시키시면 원하시는 결과가 나타나게 되겠습니다. 다음 그림처럼 말이지요.
<그림 6>
이처럼 소스를 원래의 상태 그대로 웹브라우저에 보여지게 하는 것을 '태그를 적용시키지 않는다 ' 고 말합니다. 또한 이처럼 태그를 적용시키지 않게 하는 메소드가 바로 Server.HTMLEncode 메소드가 되는 것이지요. 우선은 Server.HTMLEncode 메소드에 관해서는 이정도만 알아두시고 넘어가셔도 되겠습니다.
Server 개체와 메소드에 대해서 더 자세히 알아보고 싶으신 분들께서는 지금 브라우저를 여시고 'http://localhost' 라고 입력하신 후 엔터를 살짝~ 눌러주세요. (기본 웹사이트가 작동중이어야 합니다) 그러면 새창이 열리면서 'IIS 5.0 설명서 ' 라는 페이지가 뜰것입니다. 여기서 'Active Server Pages 가이드' -> 'ASP 기본 제공 개체' -> 'Server 개체' -> 'Server 메소드 ' 를 참고하시면 좋을 것 같습니다. 비단 Server 메소드 뿐만 아니라 IIS 나 ASP에 관련된 정보 들은 이곳을 자주 이용하시는 것이 좋습니다. 정말 유익하고 필요한 정보들이 가득 담겨있는 보물창고 같은 곳이랍니다. ^^ |
자.. 그럼 이제 정리해보도록 하겠습니다. 52~54줄에 있는 내용을 풀어서 말씀드리면요.. 만약 글을 작성한 사람이 'HTML 적용' 에서 '적용함'을 선택했을 때에는 아무런 수정 없이 그대로 넘어가고요. '적용안함'을 선택했을 경우에는 Server.HTMLEncode 메소드를 거치게 하는 것입니다.
그리고 나오는 56번째 줄은 Replace 함수 를 사용합니다. Replace 함수는 뜻 그대로 '대체' 시키는 함수인데요. 형식을 잠시 살펴보도록 하겠습니다.
Replace(expression(문자열), find(찾는문자), replacewith(대체시킬문자))
Replace 함수는 어떠한 문자열에서 특정한 문자를 다른 문자로 바꿀 때 유용하게 쓰이는 함수입니다.
strTest = "My nickname is taiji" strTest = Replace(strTest, "taiji", "exhibition")
위의 두 문장을 거친 후 strTest에는 어떠한 문장이 들어있을까요? 어렵지 않게 짐작이 되실 것입니다. strTest = "my nickname is exhibition" <--- 이렇게 바뀌어 있을 것입니다. 그리 어렵지 않으시지요?
그렇다면 56번째 줄은 무엇을 의미하는 것일까요? 'vbLf' 라는 값을 찾아서 'vbLf' 라는 값에 개행을 의미하는 '<br>' 태그를 덧붙이라는 의미 가 되겠습니다. 그렇다면 'vbLf' 는 어떤 의미일까요. 웬지 느낌상 문자 그대로의 의미는 아닐것 같은데 말이져.. ^^ 그렇습니다. 'vbLf' 의 의미는 문자열 그대로의 의미가 아니라, 우리가 textarea 에서 엔터(Enter)키를 쳤을 경우에 자체적으로 입력되는 특별한 값 이 되겠습니다.
textarea 상에서 '엔터키를 누른다'는 의미는'행을 바꾸겠다'는 의미입니다. 하지만textarea 상에서 엔터를 백날 쳐봤자원칙적으로 웹브라우저에서는행이 바뀌지 않는데요. 그 이유는 웹브라우저가 인식하는 개행문자는 오로지 <br> 이기 때문입니다. 그렇기 때문에 글을 작성한 사람이 엔터를 쳤을 때 웹 브라우저에서도 개행이 일어날 수 있도록 <br> 태그를 추가한 것입니다. 태그 적용 여부에상관 없이 모든 경우에 말입니다.
이렇게 해서 content.asp 페이지의 asp 코드 분석은 모두 마치게 되었고, 58번부터 92번 줄까지는 위에서 말씀드린 내용을 display(전시)하는 부분이 되겠습니다. 이부분까지 구구절절 말씀을 드린다는 것은 여러분들은 완전~히 무시하는 처사라 생각하기 때문에 과감하게 생략하도록 하겠습니다. 지금까지의 강좌를 충실하게따라온 분들이시라면 쉽게 이해하실거라 생각합니다.
오늘 'content.asp'강좌를 제대로 잘 따라오셨다면다음과 같은 결과 화면이 보여질 것입니다. (물론 내용은 틀려질 수 있습니다. 여러분들께서 입력하신 내용에 따라 달라지겠지요..)
<그림 7>
어떻습니까? 이제는 나름대로 게시판다운 틀을 잡아나가는 것 같지 않습니까?/옮긴글
|