login register Sysop! about ME  
qrcode
    최초 작성일 :    2001년 10월 13일
  최종 수정일 :    2001년 10월 23일
  작성자 :    Dukyoung (김덕영)
  편집자 :    Taeyo (김 태영)
  읽음수 :    566,610

강좌 목록으로 돌아가기

필자의 잡담~

드뎌 기다리던 태지의 강좌가 올라왔습니다. 내용의 충실성과 자세함. 정말 이해하기 쉬운 설명.
게다가 태오를 능가하는 말솜씨로 귀추가 주목되는 태지.. 그럼 강좌 스따뜨...
날씨가 제법 쌀쌀해졌습니다. 하늘이 높아서 까딱 잘못하면 쉽게 마비증세가 일어난다는 '천고마비' 의 계절,
가을이 깊어가는 것 같습니다. (하.. 시작부터 이 무슨 썰렁한 소리란 말인가. -_-a)
이 '가을' 이라는 친구는 어떠한 단어든지 마구 가져다 붙여도 좋은 계절이라는 생각을 잠깐 해보았습니다.
독서하기 좋은 계절.. 연애하기 좋은 계절.. 운동하기 좋은 계절..
물론 '게시판 만들기 강좌'를 보기에도 무척 좋은 계절임에 틀림없습니다. 가을은... ^^

오늘은 지난 시간에 입력한 정보들을 목록으로 보여주는 '리스트 페이지'를 작성해 보도록 하겠습니다.
우선 오늘은 소스를 먼저 보면서 말씀을 드리도록 하겠습니다.
지난 시간까지 사용하고 있었던 'taiji' 폴더 바로 밑에 'list.asp' 라는 파일을 하나 만들어 주시고
다음과 같은 내용을 입력해 주시기 바랍니다.

<list.asp>

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

<%
   Option Explicit
 
   Dim objDBConn
   Dim objRs
 
   Dim strSQL
 
   strSQL = "Select intSeq"                                          ' objRs(0) - 번호
    strSQL = strSQL & ",strName"                                  ' objRs(1) - 이름
   strSQL = strSQL & ",strEmail"                                   ' objRs(2) - 메일주소
   strSQL = strSQL & ",strSubject"                                ' objRs(3) - 제목
    strSQL = strSQL & ",intCount"                                  ' objRs(4) - 조회수
   strSQL = strSQL & ",dtmReg_Date"                           ' objRs(5) - 등록일
   strSQL = strSQL & " FROM board"
   strSQL = strSQL & " ORDER BY intSeq desc"
 
    Set objDBConn = Server.CreateObject("ADODB.Connection")
    Set objRs = Server.CreateObject("ADODB.RecordSet")
 
   objDBConn.Open "test", "sa", ""
 
   objRs.Open strSQL, objDBConn
%>
<html>
<head>
<title>목록보기</title>
</head>
<body>
<div align="center">
<h2>목록보기</h2>
<table border width="600">
   <tr align="center">
     <td>번호</td>
     <td>제목</td>
     <td>작성자</td>
    <td>등록일</td>
    <td>조회</td>
  </tr>
  <% If objRs.BOF or objRs.EOF Then %>
  <tr align="center">
    <td colspan="5">등록된 게시가 없습니다</td>
  </tr>
<%
         Else
              Do Until objRs.EOF
%>
  <tr align="center">
   <td><%=objRs(0)%></td>
    <td>
       <a href="content.asp?seq=<%=objRs(0)%>"><%=objRs(3)%></a>
    </td>
    <td> 
       <a href="mailto:<%=objRs(2)%>"><%=objRs(1)%></a>
    </td> 
    <td><%=left(objRs(5), 10)%></td>
    <td><%=objRs(4)%></td>
  </tr>
<%
                  objRs.MoveNext
              Loop
        End If
 
        objRs.Close
        Set objRs = nothing
        objDBConn.Close
       Set objDBConn = nothing
%>
</table>
<a href="regist/regist.asp">글쓰기</a>
</div>
</body>
</html>

우리가 지난 시간에 보았던 글 등록 페이지인 'regist.asp' 페이지는 html 만 잔뜩 나왔었고요.
입력한 내용을 DB에 저장하는 'regist_ok.asp' 페이지는 asp 코드만 잔뜩 나왔는데..
오늘은 혼합된 형태를 보이고 있네요. ^^

그럼 심호흡을 한번 크게 하시고, 한줄 한줄씩 소스를 분석해보도록 하겠습니다.
2번 줄은 'Option Explicit' 명령어입니다. 어떤 명령어였는지 기억하시죠?
'Dim ' 이라는 명시적인 변수 선언의 과정 없이는 변수를 사용하지 못하게 하는 명령어지요.
4번 줄은 지난 시간에 공부했던 Connection 개체의 인스턴스를 담을 변수 'objDBConn'을 선언했고요.
5번 줄은 오늘 새롭게 배우게 될 RecordSet 개체의 인스턴스를 담을 변수 'objRs '가 되겠습니다.
RecordSet 개체에 대해서는 잠시 후에 살펴보도록 하겠습니다.

7번 줄은 시퀄문(SQL문)을 담을 변수 'strSQL'을 선언했고요.

9번 줄부터 16번 줄까지는 방금 전에 선언했던 변수 'strSQL' 에 SQL문을 입력하는 작업이 되겠습니다.
(지난 시간에는 Insert 문을 이용해 정보를 DB(Board 테이블)에 입력했더랍니다. 기억나시지요?)
오늘은 DB(테이블)에 있는 정보를 가져오는 'Select' 구문을 알아보겠습니다.

Select 문의 형식을 우선 말씀드리겠습니다.

"Select " + 컬럼1, 컬럼2, 컬럼3... + " from " + Table 이름 + " Where " + 조건절

이렇게 말씀드리니 전혀~ 감이 안오시죠? 저도 잘 알고 있습니다. ^^
자.. 비주얼한 화면에 익숙하신 분들을 위해서 결과를 여러분들께 보여드리도록 하겠습니다.
'시작 -> 프로그램 -> Microsoft SQL Server -> Query Analyzer' 를 실행해 주십시오.

그러면 다음과 같은 화면이 뜰 것입니다.

<그림 1>


저희는 sa 계정을 이용해서 강좌를 진행하고 있으므로.. 첫 강좌에서 설정한 sa 의 암호를 입력하여
주시기를 바랍니다. 그리고 나오는 창(밑의 '그림 2'를 참고해 주세요)에서 DB를 'test'로 선택하신 후,
다음과 같은 구문을 입력해 주세요. DB를 선택하는 곳은 오른편 위쪽에 있습니다.

Select strSubject from Board

이 구문은 Board라는 테이블에 있는 내용 중에서 제목(strSubject)을 검색하는 구문입니다.
그리고 '실행 버튼'을 눌러주시면 (F5번 버튼 을 누르셔도 됩니다.) 다음과 같은 결과 화면이 뜰겁니다.
(저는 지난 시간에 3개의 게시를 더 입력해서 총 4개의 게시가 저장되어져 있습니다.)

<그림 2>


그렇다면... 제목만이 아닌 이름과 제목을 함께 검색하려면 어떻게 하면 될까요?
그렇습니다. 다음처럼 하면 깔끔하게 되겠지요. ^^

Select strName, strSubject from Board

또 그렇다면.. 전체 내용을 모두 보고 싶다면어떻게 할까요? 하나하나 컬럼을 다 입력해야 할까요?
그래도 괜찮습니다. 하지만 컬럼이 100개 정도 된다면 그것도 상당한 노가다가 되겠죠? ^^
그럴때에는 단 하나의 문자 '* '로 해결이 가능합니다. 즉 다음 문장처럼 입력하시고 실행하면 됩니다.

Select * from Board

<그림 3>


어떻습니까.. 정말 쉽지 않나요? ^^
'쉽군... 그런데 말이지.. 난 3번 게시만 보구 싶은데 항상 이렇게 모든 게시를 봐야 하나? -_-a'
물론 선택할 수 있지요.. 그게 바로 SQL 형식을 설명할때 Table 이름 뒤에 붙었던 'Where + 조건절 ' 입니다.
정보를 가져오긴 오는데.. 조건을 입력해서 그에 해당하는 게시만을 가져오는 것이죠.
그러면 여기서는 번호(intSeq)가 3번인 게시의 모든 내용을 한번 검색해 보도록 하겠습니다.
다음과 같이 입력하면 되겠습니다.

Select * from Board Where intSEQ = 3

<그림 4>


자.. 이제 조금 감이 오시는지요? 그런데 한가지 알아두셔야 할게 있겠습니다.
지금은 숫자(intSeq) 였기 때문에 상관없었지만.. 만약 작성자의 이름이 '김덕영'(문자)인 사람을 찾으시려면
Insert 문을 사용할 때와 마찬가지로 문장의 앞뒤로 작은 따옴표( ' )를 쓰셔야 합니다.
즉, '김덕영' 이라는 사람이 쓴 게시만을 검색하고 싶다면 다음처럼 하셔야 한다는 말이지요.

Select * from Board Where strName = '김덕영'

어떻습니까? 그렇게 어렵지는 않으시죠? (부디 그러시기를 바랍니다요... ^^)
SQL 문은 ASP에서 매우,엄청나게,대단히 큰 비중을 차지하므로 자알~ 알아두실 필요가 있습니다.
개인적으로는 여러분들께.. ASP를 공부하심에 있어서 Database 쪽도 조금씩 공부하시는게 좋다는 말씀을
드리고 싶습니다. ASP와 Database는 정말 뗄레야 뗄 수 없는 관계라고 할 수 있습니다.
저는 ASP와 Database의 내공은 함께 간다고 해도 과언이 아니라고 배웠고, 저 또한 그렇게 알고 있지요.

그러면 마지막으로.. 오늘 쓰이게 될 'Order by' 구문만 알아보도록 하겠습니다.
Order by..  이 구문은 가져온 게시물을 정렬할때 사용 하는 구문입니다.
게시판에서는 보통 가장 최근에 올라온 게시를 가장 위에 배치하지요?
그런데.. 테이블에 저장되는 순서대로 하자면 가장 예전에 들어간 게시가 가장 위에 있을텐데 말이지요.
자.. 이럴때 Order by 구문을 쓴답니다. 다음 예를 보시지요.

<그림 5>


위에서 원하는 결과를 말로 풀어서 설명하자면 다음과 같습니다.
'Board 라는 테이블에서 번호(intSeq)와 이름(strName), 제목(strSubject) 을 가져옵니다.
조건은(Where) 이름이 '김덕영' 이고 (strName = '김덕영' AND) 번호는 2,3,4번 안에 포함 되어
있어야 합니다. (intSeq IN (2,3,4))
그리고 정렬 방식(Order by)은 역순(Desc)
입니다. 즉 번호가 큰 순서에서 작은 순서로 정렬한다는 뜻이지요.

'머야? Order by 구문만 알아본다더니 머가 또 이상한게 붙었어.. -_-a' 라고 하시는 분들 계시는군요.
지금 여러분들의 수준이라면 능히~ 이해하실 수 있을거라는 판단에.. 조건 구문을 하나 추가했습니다.
추가된 조건문은 'intSeq IN (2,3,4)' 인데요. 이것은 번호(intSeq)가 2,3,4번 내에 있어야 한다는 뜻 입니다.
이처럼 범위를 지정하고 그 안에 해당되는 내용만을 검색할 때에는 'IN (조건1, 조건2..)' 문장이 쓰입니다.

그리고 조건문 사이에 AND 라는 단어가 있는데요. 이것은 앞, 뒤의 조건문이 모두 일치해야 한다는 뜻 입니다.
즉, 'Where strName = '김덕영' AND intSeq IN (2,3,4)' 라는 문장의 의미는 '이름이 김덕영일 뿐만 아니라
동시에
번호는 2,3,4번 안에 있어야 하는 조건' 이 되는 거지요. 이해가 되시나요?
그렇다면 만약 '이름이 김덕영이거나 번호가 2,3,4안에 있거나.. 둘중에 하나만 만족해도 되는'
조건인 경우에는 어떻게 하면 좋을까요? 그것은 'AND'를 'OR'으로 살짝 바꾸어주면 해결이 됩니다.
'Where strName = '김덕영' OR intSeq IN (2,3,4)'
어떻습니까? 정말 재미있지 않나요? 설령 재미가 없었다구 해도 재미있게 공부하자구요. ^^
자..  그렇다면 이제 Order by 구문을 알아보도록 하지요.

'Order by intSeq Desc' 문장의 의미는 '번호(intSeq)를 역순으로 정렬 ' 라는 의미입니다. 
이 명령어는 게시물의 번호가 큰 순서부터 나열(즉, 최근 게시부터 나열)되게 하는 명령어입니다.
'Desc' 는 '하강, 아래로 향한' 이라는 뜻을 의미하는 단어 'descending ' 에서 유래되었습니다.
이미 눈치 채셨다고요? 오옷.. 영어가 좀 되는 분이시군요?
그렇다면 Desc의 반대말은 무얼까요? Desc 의 반대말은 'ascending' 에서 유래된 'Asc ' 가 됩니다.
만약 'Order by intSeq Asc' 라고 했다면 번호가 작은 순서부터 큰 순서대로 정렬되겠지요.

그럼 이제 9줄부터 16줄까지의 내용이 정리가 되시나요?
그 내용은 'board 테이블에 있는 번호, 이름, 메일주소, 제목, 조회수, 등록일을 가져오되 역순으로 가져와라 '
는 의미가 됩니다. 조건절인 Where 구문이 빠졌으니 모든 게시를 다 가져오게 되겠지요.
이러한 내용의 SQL 문장이 strSQL 이라는 변수에 담겨지게 됩니다.

그리고 18줄에서는 지난 시간에 공부해 보았던 Connection 개체의 인스턴스인 objDBConn을 생성합니다.
이 인스턴스는 DB에 연결할때 사용된다는 사실은 지난 시간에 말씀드린 바 있습니다.
('그래서..? 그게 어쨌다구? 설명 안하겠다는거야?' 라고 물으신다면... 그냥 웃지요. 하.하.하. -_-a)

그리고 19줄에서는 RecordSet 개체의 'objRs' 라는 이름의인스턴스(분신)를 생성합니다.
RecordSet 개체는 무엇을 하는 개체일까요.. 간단하게 말씀드리자면 이것은 우리가 가져온 정보들을 저장
(record)하는 개체
입니다. 센스 있는 분들께서는 Record라는 이름에서 감을 잡으셨을테지요.

RecordSet 개체의 인스턴스인 objRs를 사용하기 위해서는 우선 DB에 연결이 되어야 할것입니다.
그래서 지난 시간에 알아본 것처럼 20줄에서 만들었던 objDBConn을 이용하여 DB에 연결을 합니다. (21줄)
그리고 23줄에서 레코드셋의 인스턴스 objRs를 오픈합니다.

원래 RecordSet 개체의 open 이라는 메소드는 인자를 5개 취합니다. 인자는 다음과 같습니다.
Source, ActiveConnection, [CursorType], [LockType], [Options]    ([ ]는 선택사항입니다)
모든 인자에 대해서 알아보면 좋겠지만.. 이 강좌는 초보자용이므로 필수 인자 2개만 알아보도록 하겠습니다.
우선 첫번째 인자인 Source 입니다. 이 인자의 의미는 '적용시킬 소스가 무엇이냐 '는 것이지요.
당연하겠지만.. 이것은 9~16줄까지 우리가 열심히 작성하였던 strSQL (SQL문) 이 될 것입니다.
두번째 인자는 ActiveConnection 입니다. 이것은 'DB에 연결은 어떻게 할것이냐'는 것인데요.
우리는 DB연결을 Connection 개체의 인스턴스인 objDBConn에게 일임했으므로 여기선 그친구를 사용합니다.
그러므로 objRs.Open 뒤에는 strSQL, objDBConn 이라는 두개의 변수가 인자로서 들어갑니다.
이제 23번째 줄이 조금 이해가 가시는지요..

자 이렇게 RecordSet 개체의 인스턴스인 objRs 를 열어놓은(open 시켜놓은) 상태로 html 이 등장합니다.
'기본적인 html까지 세세하게 말씀드리는 것은 여러분들의 수준을 완전히 13579로 보는 처사이다!!!'
(주: 13579 = 띄엄띄엄) 라는 판단에 은근슬쩍, 얼렁뚱땅, 구렁이 담 넘어가듯 몰래 넘어가다가...
40번 줄에서 갑자기 다시 <%...%>로 둘러싸인 ASP 코드가 등장을 합니다.

'If objRs.BOF or objRs.EOF Then'

이 줄이 중요한데요.. 이 줄에서는 두가지의 설명을 드릴 내용이 나옵니다.
그 첫번째로는 조건 구문인 'If.. Else.. End If' 문입니다. 이 구문은 다음과 같은 형식을 가집니다.

If 조건A Then
   실행 A
Else
   실행 B
End If
 

이 구문은.. 만약  '조건 A'가 참이라면 '실행 A'를 실행하고, '조건 A'가 거짓이라면  Else 뒤에 있는 '실행 B'를 실행하라는 의미를 가집니다.
그리고 마지막에 If 문이 끝났다는 의미로 'End If' 라는 문장을 꼭 넣어주어야 합니다 .
(안넣으시면 에러가 납니다. 아마 앞으로 자주 접하는 에러중 하나일 거라고 생각합니다.)
이 IF 문은 비단 ASP 뿐 아니라 거의 모든 프로그래밍 언어에서 공통적으로 사용하기 때문에 아마 프로그램을
조금이라도 접해본 경험이 있으신 분들은 무척 반가운(?) 구문 일거라 생각합니다.

두번째로 말씀드리려는 내용은 레코드셋의 시작과 끝인 BOFEOF 입니다.
BOF 와 EOF 라는 생소한 단어가 나와서 저으기 긴장하는 분들이 계실지도 모르겠는데요.
이것들은 'Begin Of File (파일의 시작)' 과 'End Of File (파일의 끝) ' 이라는 비교적 쉬운(?) 의미를 가진답니다.

현재 objRs 라는 레코드셋 개체의 인스턴스 안에는 Board 테이블의 모든 내용이 들어가 있을텐데요..
그것을 그림으로 나타내 본다면 다음 <그림 6>과 같습니다. (저는 현재 4개의 게시가 들어 있습니다)

<그림 6>
 

레코드셋은 위의 그림과 같은 구조를 가지고 있다고 생각하시면 되겠는데요.
표 왼쪽에 보이는 커서는 처음에는 항상 저장되어진 정보의 첫번째 행을 가리키고 있습니다.
(첫번째 내용 안에는 첫번째로 나오는 게시물의 번호, 제목, 이름, 비밀번호.. 등의 내용이 담겨져 있겠지요)
유념하셔아 할 부분은.. 맨 위에 있는 BOF 와 맨 아래에 있는 EOF 에는 정보가 들어가지 않는다는 사실입니다..
이부분은 레코드셋의 처음과 끝을 나타내주는 다소 개념적인 공간이라고 할 수 있기 때문이지요.

우리는 커서가 위치한 곳에 접근해서 그 안에 담겨져 있는 정보를 가져올 수 있습니다.
그렇다면.. 첫번째 행의 내용을 모두 다 알아냈다고 하면 어떻게 할까요. 다음으로 이동하고 싶다면 말이죠..
그때에는 레코드셋의 메소드인 'MoveNext' 를 사용하시면 됩니다. <그림 7>을 보아주시지요.

<그림 7>
 
어떻습니까. MoveNext ( objRs.MoveNext) 메소드에 의해서 커서가 다음 줄로 이동하게 되었습니다.
덕분에 우리는 두번째 행에 있는 내용도 모두 알아낼 수 있게 되는 거지요.


<그림 8>
 
그렇다면 계속해서 MoveNext를 반복하다보면 <그림 8> 처럼 언젠가는 마지막 내용을 지나
레코드셋의 마지막 부분인 EOF 에 이르게 되겠지요? 이곳에서 내용을 조회하려 하다가는 에러를
만나게 되실 겁니다. 이곳에는 내용이 없으니까요.. 그러므로 EOF가 되기 전까지만 정보를 찾아야 하겠지요..
(그 내용이 46번 줄의 'Do Until objRs.EOF' 인데 이 부분은 잠시 후에 설명드리겠습니다.)

그렇다면 이런 의문이 드는 분도 계실겁니다.
'애써서 검색한 레코드셋에 정보가 하나도 없을 수도 있잖아. 그러면 어떻게 되는거지...?'
그런 경우에는 다음 <그림 9>와 같은 형태가 될 것입니다. 어떻습니까? 짐작이 맞으셨나요? ^^

<그림 9>

정보가 하나도 없는 까닭에. BOF 와 EOF는 위치가 같아지게 된답니다. 물론 커서의 위치도 바로 그곳이지요.
그렇다면... 만약 이 상황에서 정보를 얻으려는 시도를 하면 어떻게 될까요? BOF와 EOF는 정보를 저장하는
곳이 아니므로(다분히 개념적인 장소라는 말씀을 드렸지요?) 에러 메시지를 출력해 줄겁니다.

이러한 지식을 가지고 40번 줄을 다시 한번 보아주시지요.

' If objRs.BOF or objRs.EOF Then'

이제 이 문장이 '만약 레코드셋의 시작(BOF) 이거나 끝(EOF)이라면' 의 뜻이라는 것을 이해하시겠지요.
이 문장이 참이라면(<그림 9>와 같은 상태라면) 41~43 번줄에 있는 문장이 실행되게 될 것입니다.
그 결과 화면은 다음과 같습니다.

<그림 10>

 


어떻습니까. 보시는 것처럼 41~43줄에 있는 내용만이 선택적으로 실행되게 되지요.
자.. 그럼 이제는 레코드셋에 정보가 들어가 있는 경우를 생각해 보아야 하겠지요?
지난 시간에 내용을 입력해서 Board 테이블에 정보가 저장되어져 있는 분들(대부분의 분들이 여기에
해당하시리라 생각합니다)의 경우에는 40번 If 문에서 거짓이라는 값을 넘겨주게 되고,
그 결과 45번줄 Else의 이후인 46번 ~ 61번 줄의 내용이 실행되게 될 것입니다.

이 안에는 또 하나 생각해 보아야 할 구문이 등장하는데요..
그것은 바로 위에서 잠시 언급했던 'Do ~ Loop 문 '입니다. 이것을 보통 루프문 또는 순환문이라고 합니다.
일정한 형식을 반복해서(계속해서) 실행 해야 하는 경우 아주 유용하게 사용되는 구문인데요.
다음의 예를 보시면 이해하시는데 도움이 되리라 생각합니다.

<loopTest.asp>

  <%
1        Dim i
2        i = 1
3        Do Until i > 5
4             Response.Write "이번의 숫자는 " & i & "입니다. <br>"
5             i  = i + 1
6        Loop
  %>

이 파일을 'loopTest.asp' 파일로 저장하신 다음에 'taiji' 폴더 밑에 위치시키고요.
웹브라우저를 열어서 'http://localhost/taiji/loopTest.asp ' 를 실행시키시면 다음과 같은 결과가 나올 것입니다.

이번의 숫자는 1입니다.
이번의 숫자는 2입니다.
이번의 숫자는 3입니다.
이번의 숫자는 4입니다.
이번의 숫자는 5입니다.

'Do Until i > 5
이 문장의 의미는 'i 의 값이 5보다 클때까지' 라는 의미입니다.
(같은 의미로는 'Do While i < 6' 이 있습니다. 이것은 'i 의 값이 6보다 작은 동안에는 ' 이라는 의미입니다.)
그런 뜻이기에 i 의 값이 1부터 5일때 까지는 Do ~ Loop 사이에 있는 문장이 계속해서 실행되게 됩니다.
(한번 이 문장을 순환할때마다 i 의 값은 5번 줄에 의해 1씩 증가할 것입니다.)
그러다가 i 가 6이 되면 Do 문은 끝이 나게 되고 이 문장은 더 이상 실행되지 않게 되지요.

4번 줄에 Response.Write 라는 메소드가 또 하나 등장 하는데요.
이것은 Write 뒤에 나오는 내용을 html 형식으로 변환하여 웹브라우저에 보여지게 하는 메소드 입니다.
즉, i 가 1일때 Response.Write "이번의 숫자는 <b>" & i & "</b> 입니다." 이라고 한다면
웹브라우저에는 '이번의 숫자는 <b>1</b> 입니다. ' 이라는 내용이 전달되게 되고,
우리가 웹브라우저를 통해서 이 내용을 보게 되면 태그가 적용이 된 다음과 같은 내용을 보게 됩니다.

'이번의 숫자는 1 입니다.' (1에 bold 체가 적용되었지요)

이 Response.Write 메소드는 자주 쓰고, 또 중요한 메소드이므로 꼭 기억해 주셔야 하겠습니다.
(이것은.. 노량진 XX 학원 영어 선생님의 말투?? -_-a)

자. 그렇다면 이제 용감하게 46번줄을 보아주시기 바랍니다.

'Do Until objRs.EOF '

이 문장은 '레코드셋(objRs)의 마지막(EOF)이 될때까지 실행하세요 ' 라는 의미가 되겠습니다.
레코드셋의 마지막(EOF)을 만나게 되면 이 순환문은 자동적으로 종료가 될 것입니다.
그럼 지금 현재... 커서는 어디에 위치해 있을까요?
네. 가장 위에 있는 첫번째 정보(레코드)를 가리키고 있을 것입니다.

이 정보에 접근하는 방법 은 의외로 간단합니다.
우리가 Select 를 이용하여 가지고 온 정보들의 순서. 바로 그 순서대로 번호를 붙여 정보를 가져오면 됩니다.
지금 우리가 적용한 순서는 번호, 이름, 메일주소, 제목, 조회수, 등록일.. 의 순서인데요. (9~16줄 참고)

objRs(0) - 번호
objRs(1) - 이름
objRs(2) - 메일주소
objRs(3) - 제목
objRs(4) - 조회수
objRs(5) - 등록일

이와 같은 식으로 접근하면 된다는 것입니다. (이것또한 0부터 시작하는 것에 주의 하세요)
또는 이렇게 번호를 사용하지 않고, 직접 컬럼의 이름을 사용해서 접근하는 방법도 있습니다.

objRs("intSeq")             - 번호
objRs("strName")          - 이름
objRs("strEmail")           - 메일 주소
objRs("strSubject")        - 제목
objRs("intCount")          - 조회수
objRs("dtmReg_Date")  - 등록일

두가지 방법 중에서 마음에 드는 방법을 사용하시면 되겠습니다. (저는 보통 위의 방법을 쓰지요. ^^)
49 ~ 57 줄의 내용은 이렇게 접근한 정보를 차례차례 나열하는 부분이 되겠습니다. 49번 줄을 보시지요.

'<td><%=objRs(0)%></td>'

여기에서는 <%=%> 라는 낯선 표현이 나왔는데요. 이것은 위에서 잠시 언급했던 'Response.Write'
메소드의 간략한 표현
이 되겠습니다.
즉, <% Response.Write "안녕하세여~ 태진데여~" %> 와 <%="안녕하세여~ 태진데여~"%>
의 결과는 같다는 뜻입니다. (상당히 유용한 표현입니다. 잘 기억해 주시면 고맙지요. ^^)

이제 별다른 어려운 내용은 없어 보입니다. 그런데 56번 줄의 ' <%=left(objRs(5), 10)%>' 가 눈에 띄네요.
여기서는 Left 함수를 사용했는데요.. 이 함수는 'Left(string, length) ' 와 같은 형식을 가집니다.
첫번째 인자인 string(문자열)의 왼쪽부터 length(길이, 숫자)만큼의 문자를 반환 한다는 뜻이지요.
즉, Left("taeyo's ASP", 5) 이라고 한다면 반환되는 값은 'taeyo' 가 된다는 말씀입니다.

그럼 이제 56줄을 다시 보시지요. objRs(5)에 '2001-10-20 오후 12시 28분 32초' 라는 값이 들어있다면
56줄의 left(objRs(5), 10) 이라는 구문을 통해 반환되는 값은 '2001-10-20' 이 되는 것입니다.

이렇게 진행된 내용이 60번 줄에서 레코드셋의 커서를 다음 줄로 이동 시킨 후 (objRs.MoveNext)
46번줄로 돌아가서 objRs.EOF 의 조건을 만족시킬때까지 지금까지의 내용을 다시 반복 하게 됩니다.
그렇게 진행하다가 objRs.EOF가 참이 되면 드디어 61번 줄의 Loop를 빠져 나가게 되고,
64~67번 줄에서 RecordSet 개체의 인스턴스인 objRs 와 Connection 개체의 인스턴스인 objDBConn을 닫고(Close) 해제시키게 됩니다. (Set objRs = nothing, Set objDBConn = nothing)

자.. 정신없이 진행된 'list.asp' 페이지는 이렇게 마무리가 되는것 같습니다.
이제, 페이지 아래쪽에 있는 70번째 줄의 링크(글 쓰기)를 누르고 글을 입력하시면 다시 list.asp로 돌아오는..
최소 기능은 갖춘 게시판이 완료된 셈입니다. (물론 아직 할일이 많지만요. ^^)

여기서 잡담 한마디..

ASP를 처음 접하는 분이 아니시라면 이런 질문을 하시는 분들이 계실지도 모르겠습니다.
' 이렇게 꼭 Do ~ Loop 문을 이용하는 것말고 배열을 이용하는 방법이 있다고 들었는데요?' 라고 말이지요
배열을 이용한 방법은 사실 초보자가 접하기에는 약간 어려운 방법입니다.
그래서 이 강좌에서는 레코드셋을 열고 Do ~ Loop 문을 이용하는 이 방법을 사용했습니다. 

이번 시간의 강좌는 여기서 줄이겠습니다.
최소 수준의 게시판을 직접 만드신 기쁨(?)을 따뜻한 커피 한잔과 천천히 음미하시기를 바랍니다.
다음 시간에는 올라온 글의 내용을 살펴보는 '내용 보기' 페이지에 관해서 알아보겠습니다.
그럼 다음 강좌까지 건강하시고요.. 항상 행복하세요. ^^


P.S (추신, 덧붙임..)

요즘.. 제게 강좌의 업데이트가 늦다는 항의 및 협박(?)메일이 많이 오는데요.. T.T
진행중인 프로젝트가 빠듯해서 본의 아니게 늦는 것이니 넓은 마음으로 양해해 주시기를 부탁드립니다.
저도 최대한 빨리 강좌를 진행하도록 노력하겠습니다.. 죄송합니다 또한 감사합니다..


태지의 화(話)

강좌중 의문사항이나 하시고픈 말씀 겸허하게 받겠습니다: maestrody@orgio.net


authored by


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

로딩 중입니다...

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