글 찾기( 아래 목록 크릭 또는 왼쪽 분류목록 클릭)

외통궤적 외통인생 외통넋두리 외통프리즘 외통묵상 외통나들이 외통논어
외통인생론노트 외통역인생론 시두례 글두레 고사성어 탈무드 질병과 건강
생로병사비밀 회화그림 사진그래픽 조각조형 음악소리 자연경관 자연현상
영상종합 마술요술 연예체육 사적跡蹟迹 일반자료 생활 컴퓨터

계시판만들기 /글 올리기

안녕하세요. 태지입니다..
요즘.. 하늘 한번 올려다 보신적 있으세요?
천고마비의 계절답게.. 하늘이 너무나 푸르고 아름답습니다. 정말로요.. (저는 서울에 삽니다)
여러분들께서도 공부하시다가 답답하거나 잘 안되실 때, 하늘을 한번 올려다 보세요.
너무도 청명하고 아름다운 그 모습에서 많은 위로와 격려를 받으실 수 있을 것이라는 생각을 합니다.

첫강좌를 올리고 2주간에 걸쳐 정말 많은 분들의 메일을 받았습니다..
격려성 메일에서 협박성(?) 메일까지.. 참 다양한 내용이었습니다만일치되는 부분이 하나 있더군요.
그것은 바로.. "7월 23일에 쓰고선 왜 두달 가까이 다음 강좌를 안올리는건데?" 였습니다.... -_-a
사실 이 점에 있어서...많이 반성하고 있고, 또 죄송스럽게 생각하고 있습니다.
'제가 몸담고 있는 회사에서의 프로젝트가너무 일정이 빠듯해서..' 라고하면서 최대한 불쌍한 표정을
지으면어느 정도이해해 주시려나.. 하튼 주된 변명 거리를 이걸로 삼으려 합니다. ^^
다음 강좌부터는간격을 좁히도록 노력하겠습니다. 꾸우벅~~

그럼오늘은 지난 시간에 이어.. 두번째 시간으로'게시판 만들기 - 글 올리기'강좌를 진행해볼까 합니다.

지난 시간에 우리가 무엇을 했는지 다들 기억하시지요?
혹 기억 못하시는 분들을 위해 잠시 복습의 시간을 가지도록 하겠습니다.

지난 시간에 우리는ASP가 작동하기 위한 환경을 설정해 보았습니다.
OS는 Windows 2000 Server를, DataBase는 MS-SQL 7.0을 선택했습니다.
또한혹 웹서버(IIS)가 설치되지 않은 분들을 위해서웹서버(IIS) 설치에 대해서도 잠시 생각해 보았고요.
그리고test라는 이름의 데이터베이스와 board라는 이름의 테이블을만들었고,
마지막으로
ODBC 등록에 대해 알아보았습니다.
'쟤, 뭐래니?' 싶으신 분께서는back 버튼을 살짝 누르신후지난 강좌를 참고해 주시길 권하는 바입니다..
환경 설정이바로 되어 있지 않다면 아무리완벽한 코드라 하더라도제대로 작동을 하지 않기 때문입니다.
실제로taeyo site에 올라오는수많은 질문 중에 적지 않은수가 환경 설정 문제였습니다.정말이에요..

자, 그럼 이제 오늘의 과제에 도전해 보도록 하지요.
오늘은 실제적으로 두개의 페이지를 만들어 볼 예정입니다.
첫번째 페이지의 이름은 regist.asp입니다.말 그대로글을 등록하는 페이지가 되겠습니다.
이 페이지에서는 단지글을 입력하는 폼을 보여주게 됩니다.
두번째 페이지의 이름은 regist_ok.asp입니다. 이 페이지는
regist.asp에서 입력한 정보를DB에 저장하는
페이지
가 되겠습니다. (지난 시간에 만든 test라는 Database안의 board라는 테이블에 저장합니다)

지난 시간에 ASP라는 친구는 웹서버에서 작동하는 특별한 파일이라는 말씀을 잠시 드렸습니다.
그렇다면예리하신 분들께서는이미 "오늘 만들asp 파일도 웹서버 상에 위치해야 하겠군" 이라는생각을
하실 수 있을 것입니다. 정말 예리하십니다. 바로 맞추셨어요.

웹서버의 위치는 "C:\Inetpub\wwwroot\"가 되겠습니다.반드시 기억하십시오..
이 밑에 있는 파일은 여러분들께서 웹브라우저(익스플로러가 기본이지요) 상에서 보실 수가 있습니다.
정말 그런지 아닌지 궁금하다고요? 한번 실제로 해보고 싶으시다는 말씀이시구운~요? (수다맨?)
좋습니다. 프로그래머들에게는 백개의 딱딱한 이론보다한번의 예제가 더 나은 법이지요.
탐색기를 여신 후 'C:\Inetpub\wwwroot\' 로 이동하셔서 test.asp 문서를 하나 만들어주십시오.
메모장을 여신 후아래 박스와 같이 입력하시고 'test.asp'로 저장해 주시면 됩니다.
(꼭 메모장이 아니더라도 편집기라면 아무거나 좋습니다. test.asp로 저장만 할 수 있으면 되겠습니다)
저장하셨으면 이 파일의 경로가 'C:\Inetpub\wwwroot\test.asp ' 이 정확한지 확인해 주십시오.

<test.asp>

게시판 만들기 - 글 올리기

<html>
<head>
</head>
<body>
코딩은 언제나 목마르다. 두 라인 부족할때..
</body>
</html>


정확하게 저장이 되었나요? 그렇다면 이제 웹브라우저(익스플로러)를 실행시켜보겠습니다.
실행이 되었다면 주소창에 'http://localhost/test.asp' 라고 입력한 후 이동해 보세요.
자. 어떻습니까. 방금 전에 우리가 만든 파일이 '짜안~' 하고 나타나는 장면을 보실 수가 있을것입니다.
볼품이 없다고요?저 간단한 소스로 무엇을 바라셨다는 말씀이십니까.. -_-a


혹시 '페이지를 찾을 수 없다' 또는 '페이지를 표시할 수 없다 ' 는 오류 메시지가 나오는 분들이 계신가요?
그런 분들께서는 '
여기'를 클릭해 주시기 바랍니다.

하지만 여기서 중요한 것은 test.asp의 내용이 아닙니다.
'웹서버를 통해 asp 파일을 동작시켰다는 점'이중요하다는 말씀입니다.
그렇다면 과연.. asp 파일을 일반 파일 다루듯이 더블 클릭으로 실행할 수는 없는 것일까요?
좋습니다.백설(百說)이 불여일행(不如一行).. 이번에도 직접 테스트 해보도록 하시지요.
탐색기를 여시고 'C:\Inetpub\wwwroot\' 으로 이동해 주십시오.
그 곳에서 'test.asp'파일을 찾아낸 후 힘차게(!) 더블 클릭 을 해 주십시오.
어떤 결과가 발생하는지요?
아마도여러분 컴퓨터에 설정되어 있는 편집기 프로그램이 실행될 것입니다.
아마도.. 라는 애매한 표현을쓴이유는 여러분들의 프로그램 설치 환경에 따라 결과가 다르기 때문입니다.
연결된 프로그램이 없는 경우 '연결할 프로그램 설정' 화면이 뜰테고요. 어떤 프로그램을 설치했느냐에
따라각각 다른 프로그램이 실행될 것이기 때문입니다. (제 경우에는 '포토샵'이 떠 버리더군요. -_-a)

확실한 것은아까 웹서버를 통해 실행시켰던 깔끔한 결과는 결코 나오지 않는다는 것입니다.
그렇다면 어떤 분들께서는 이런 생각을 하실지도 모르겠습니다.
'어차피 asp 파일도 웹브라우저 상에서보여지는거잖아.. 그럼
브라우저(익스플로러)에서 실행하면될 것
같은걸?
'이라는 깜찍한 생각 말입니다.. 호오. 정말 그럴듯 하지요??
그렇다면 이 경우도 한번 테스트 해보도록 하지요.

아까 열었던 탐색기를 그대로 두시고따로 익스플로러를 실행합니다.
그리고는 방금실행한 익스플로러에 탐색기에 있는 test.asp 파일을 드래그 앤 드롭(끌어당겨놓기) 합니다.
다음 그림과 같이 말이지요.



<그림 1>


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

<그림 2>




여기서 '현재 위치에서 이 파일 열기'를 선택하시면 여러분들의 편집기 프로그램이 실행되고요.
'이 파일을 디스크에 저장'을 선택하시면 말 그대로 여러분의 하드 디스크에 저장을 하셔야 합니다.
즉, 이 방법으로도 asp 파일을 제대로동작시킬 수 없다 는 결론이지요.

여기서 정리하고 넘어가겠습니다.
'ASP 라는파일은 웹서버를 통해서만이 동작된다' 는사실을 반드시 숙지하시기 바랍니다.
또한 기본 웹서버의 위치는 'C:\Inetpub\wwwroot\' 라는 사실도 기억하셔야 하고요.

그렇다면 탐색기에서 'C:\Inetpub\wwwroot\' 밑에다 'test' 라는 새 폴더를 만들고 그 안에'test2.asp' 를
만들면어떻게 될까요? 이러한 경우웹브라우저에 'http://localhost/test/test2.asp' 라고입력하신후
실행시키면 test2.asp가 제대로 동작하는 것을 보실 수 있습니다.어떻습니까? 이제 조금 감이 잡히십니까?

'그렇다면 웹서버는 어디서 관리하는 것일까?' 라는 의문을 가지신 분 혹시 계십니까?
(없으시다고요. 음... 그렇다면 제가의문을 가졌다고 치겠습니다.)
아~ 정말 예리한 분이시군요. 상당한 센스의 소유자임에 틀림없으십니다..(-_-a)

웹서버의 관리는 우리가 지난 시간에 열심히 설치해 본 '인터넷 서비스 관리자(IIS)'에서 관리합니다.
다같이 IIS를실행해 보도록 하지요. ('시작 -> 프로그램 -> 관리도구 -> 인터넷 서비스 관리자 ' 입니다)
그렇다면 다음과 같은 화면이 뜰 것입니다.(저는 전람회를 좋아해서 컴퓨터 이름이 '전람회'입니다..)

<그림 3>




자 이제 컴퓨터 이름을 클릭하고 다음과 같이 '기본 웹 사이트 '를펼쳐 보도록 하겠습니다.

<그림 4>


 

어떻습니까? '기본 웹 사이트' 안에서 test.asp 를 찾아볼 수가 있지요?
또한 방금전 만들었던 test 폴더도 볼 수가 있을 것입니다.
그렇습니다. 이곳이 바로 기본 웹서버인 'C:\Inetpub\wwwroot\' 의 위치입니다.
그렇기 때문에이 곳에서 우리는 test.asp를 찾을 수가 있었던 것이지요.

'우띠.. 귀찮다. 꼭탐색기를 열고 여기까지 들어와야 이걸 할 수 있다는 말인가.. 지겹다' 는 분들이
계실 것이라 생각합니다.그런 분들을 위해(?) '가상 디렉터리'에 대해 설명드리겠습니다.

가상 디렉터리라.. 앞에 '가상 '이 붙는 것으로 미루어 보아 무언가 가짜의 분위기가 나지 않습니까?
조금 전 우리는탐색기로 일부러 'C:\Inetpub\wwwroot' 를 찾아 들어가서 그 안에 'test.asp' 와 'test' 라는
폴더를생성해 보았습니다. 그리고 실행해 보았었지요. 그곳이 웹서버이기 때문입니다.
하지만 '가상 디렉터리'는 '다른 곳에서 폴더를 만들고서 마치 웹서버에 위치한 것처럼 동작' 시켜 줍니다.
웬지 마음에 드는 이름이라고요? 좋습니다.그럼 이제 '가상 디렉터리'를 하나 만들어 보도록 하지요.

여러분들께서 좋아하시는 장소에 '새 폴더' 를 하나 만들어 주세요. 장소는어느 곳이든 상관없지만 되도록
나중에 여러분들께서 찾기 편한 곳으로 만드시는게 좋겠습니다.(참고로 저는D 드라이브에 만들었습니다)
폴더의 이름은마음 내키시는대로 정하시면 됩니다. 저는'Taiji'라는 이름으로 주었습니다.
그리고.. 폴더 이름은 가급적 영어로 지어주시기를 부탁드립니다.

<그림 5>


'새 폴더'의 이름을 정해주세요.. 라고했더니 '독수리', '제비' 이렇게 하시는 분들 꼭 계신데요.
그러지 마시고되도록 'eagle', 'swallow' 이렇게 하시라는 말씀입니다. (하..하..하.. -_-a)
'쯧쯧.. 그걸 개그라고 하냐?' 하시는 분들.그래도 이 개그.. 한때 잘 나갔던 개그랍니다. ^^

지금까지는그냥 폴더 하나 만드는 것과 아무 차이가 없지요?하지만 진짜는 이제부터입니다.
새로 만드신 폴더에서 '마우스 오른쪽 버튼'을 클릭하시고 '등록정보 '를선택해 주십시오.

<그림 6>




그림에서 마우스의 위치를 유심히 보시면 '웹 공유'탭 위에 있다는 것을 확인하실 수 있습니다.
'웹 공유 '를 선택해 주십시오.

중간에'이 폴더를 공유함' 과 '이 폴더를공유하지 않음' 이 나오게 되는데 이때'공유함 '에 체크해 주세요.

그러면 다음 그림과 같은 화면이 뜨게 됩니다.내용을 확인하시고 '확인 ' 버튼을 눌러주세요.

<그림 7>




그러면 다음 그림처럼 별칭에 'Taiji'가 등록되어 있는 것을 보실 수 있는데요.

<그림 8>




이렇게 되면 가상 디렉터리의 생성은 모두 완료됩니다.
'허어~.상당히 까다로울 것 같았는데 의외로 쉽군. 진짜 된거야?' 싶으신 분들 계시죠?안봐도 비디오입니다.

좋습니다. 그렇다면과연 웹서버 에 지금 만들어 놓은 'Taiji'라는 폴더가 있는지 확인해 볼까요?
아까 실행했던IIS를 다시 실행해주십시오. ('시작' -> '프로그램' -> '관리도구' -> '인터넷 서비스 관리자' )
그리고 '기본 웹 사이트 ' 안으로 들어가보면 다음 그림처럼 'Taiji' 목록이 추가된 것을 볼 수가 있습니다.

<그림 9>




'어라? 그런데 일반적인 폴더가 아니라.. 무언가 이상한 모양으로 생겼는걸?' 이라는 의문을 제기하시는
분들이 있을지도 모르겠습니다.이것의 이름은 사실 '가상 디렉터리' 가 아닌 '가상 애플리케이션 '입니다.
하지만 이번 강좌를 진행함에 있어서 이둘의 차이는 고려하지 않아도무방한 것이기에일단
'가상 디렉터리 ' 라는 이름으로 이름을 고정하고 사용하도록 하겠습니다.
(사실 저는 이런식으로 얼렁뚱땅 넘어가는 것을 좋아하지 않습니다. 진짜로요.. 하지만'가상 디렉터리' 와
'가상 애플리케이션'의 차이는 초보자의 수준을 넘어선다는 판단하에 일단 넘기고 계속 진행하겠습니다)

자아~. 그렇다면 이 'Taiji ' 라는 가상 디렉터리로는 어떻게 접근해야 할까요..
우선Taiji 폴더(저는 D 드라이브에 있지요) 안에다 아까 만들었던 'test.asp' 파일을 이동시키겠습니다.
그리고 웹브라우저에서 'http://localhost/taiji/test.asp' 를 입력하고 실행해 보십시오.
아주 잘~ 실행되는 것을 보실 수 있을 것입니다. (제대로 따라오신 분이라면..)

이제 가상 디렉터리의 사용법과 기능을이해하시겠지요?
기본 웹서버의 위치인 'C:\Inetpub\wwwroot\'까지 굳이 이동하지 않더라도,여러분께서 원하는 위치에서
폴더 하나를 생성하는 것만으로ASP 파일을 동작시키는 이 '가상 디렉터리'는
상당히 매력적인 친구일 것입니다. 그렇지 않습니까?
이 친구는 앞으로도 상당히 유용하게 사용되므로 사용법을 잘 기억해 두시기를 부탁드립니다.

막상 가상 디렉터리 생성법을 살펴보고 나니까.. 아까 탐색기로 열심히wwwroot를 찾아 들어갔던게
후회되십니까? 넘 복잡하고 쓸모도 없을것 같아서..?아까운 시간만 허비한것같아서?
하지만 그만큼 귀찮고 어려웠던 과정이하나하나 쌓여 저와 여러분에게 든든한 기초가 될 것입니다.
다같이 경건한 마음으로 조용히 "화이팅!!"을 한번 외치고.. 계속 진행하도록 하겠습니다. ^^


자, 참으로 길었던 준비 과정을 모두 마치고 그럼 이제 정말로 코딩에 들어가겠습니다.
방금 만들었던 가상 디렉터리인 Taiji 라는 폴더를 그대로 사용하도록 하겠습니다.
우선.. 아까 테스트 해 보았던 test.asp 파일을 사정없이 지워 주십시오.
그리고Taiji 폴더 안에 다시 'regist' 라는 이름의 폴더를하나 만들겠습니다. (글쓰기 페이지 전용 폴더)
그리고 생성된 폴더 안에 'regist.asp' 라는 파일을 하나만들어서 다음소스를 입력해 주십시오.
(편집기나 에디터에서 직접 치셔도 좋고, 복사해서 붙이는 것도 좋겠습니다. 하지만 정말 초보시라면
직접 손으로 입력해 보시는 것이 얻는바가 더많을 것이라고 감히 말씀드리고 싶습니다.)

<regist.asp>

01<html>
02 <head>
03<title>태지의 게시판 - 글쓰기 폼</title>
04 </head>
05 <body>
06 <form name="registForm" method= "post" action="regist_ok.asp">
07 <table border cellspacing="0" width="500">
08 <tr>
09 <td colspan="2" align="center"><b>글을 적어주세요</b></td>
10</tr>
11 <tr>
12 <td align="center">이름</td>
13 <td><input type="text" name="userName" size="15"></td>
14 </tr>
15 <tr>
16 <td align="center">비밀번호</td>
17 <td><input type="password" name="userPwd" size="15"></td>
18 </tr>
19 <tr>
20 <td align="center">Email</td>
21 <td><input type="text" name="userEmail" size="50"></td>
22 </tr>
23 <tr>
24 <td align="center">제목</td>
25 <td><input type="text" name="subject" size="50"></td>
26 </tr>
27 <tr>
28 <td align="center">내용</td>
29 <td><textarea name="content" cols="50" rows="10"></textarea></td>
30 </tr>
31 <tr>
32 <td align="center">HTML</td>
33 <td>
34<input type="radio" name="tag" value="T" checked>적용
35<input type="radio" name="tag" value= "F">비적용
36 </td>
37 </tr>
38 <tr>
39 <td colspan="2" align="center">
40 <input type="submit" value="작성 완료">&nbsp;&nbsp;&nbsp;
41 <input type="reset" value="다시 작성">
42 </td>
43</tr>
44 </table>
45 </form>
46 </body>
47 </html>

이 강좌는 여러분들께서 기본적인 html 문서 정도는만들 수 있다는 전제 하에진행됩니다.
그러므로 위의 regist.asp의 내용이 도대체 무슨 내용이며 어떤 의미를 담고 있는지 전혀 모르시겠다면..
애석하지만 이 강좌 안에서는 저로서도 더 이상 도와드릴 방법이 없습니다.
(우선 html을 먼저 공부하실 것을 권해드리고 싶습니다. 어느 정도만이라도 말입니다...)

우선 regist.asp 는 글을 등록하는 폼이므로 html 태그가 주를 이룹니다.
사실 이 폼은 'regist.asp' 가 아닌 'regist.htm ' 으로 작성한다 하더라도 그다지 문제되지 않을 페이지입니다.
이 페이지는전부 기본적인 html로만 이루어져 있기 때문입니다.
(이 말은 문서 이름을 regist.htm이라 해도 무방하다는 뜻입니다)
사실 IIS 4.0 (Windows NT)까지는 이렇게 html로만 이루어진 페이지라면성능과 효율 측면에서
asp 보다는 htm 확장자를사용할 것을추천했습니다만,IIS 5.0 (Windows 2000)부터는 굳이 htm으로
쓰지 않고 asp로 써도 성능 저하가 일어나지 않는다고 하네요. 그래서 asp 확장자를 붙여보았습니다.
(이 말은 역으로 말하자면 지금Windows NT로 이 강좌를 따라하시는 분이시라면 'regist.htm' 으로
따라하시는 것이속도와 성능면에서 유리하다는 말씀이 되겠습니다. 물론 미세하긴 하겠지만요...)

위의 내용을 간단히 요약드리면..
이름 - userName
비밀번호 - userPwd
E-mail - userEmail
제목 -subject
내용-
content
HTML - tag
라는 이름으로 값을 전달하게 됩니다.

이렇게'regist.asp' 문서를 저장을 하고, 웹 브라우저를 통해서이 문서를 실행해 보도록 하겠습니다.
웹 브라우저(익스플로러)를 여시고, '

 

http://localhost/taiji/regist/regist.asp' 를 실행해 주세요.

다음과 같은 화면이 보이면 되겠습니다.

<그림 10>




무언가 그럴듯한 화면을 기대하신 분들께서는 실망이 크실지도 모르겠군요.
화면이 너무 허하고 썰렁해서.. 제가 보기에도 조금 민망하네요.ㅋㅋ
하지만 우리가 공부해야 할 부분은 보여지는 겉의 모습이 아니라 내면의 모습이기에..
이 썰렁한 화면을 받아들이고 넘어가도록 하겠습니다.화장발에 속지맙시다.. ^^
('그래도 이런 썰렁함은 용서할 수 없어!!' 라고 절규하시는 분들께서는 디자인을바꾸셔도 좋겠습니다.)

이제 각 칸을 적당하게 입력하시고 '작성 완료' 버튼을 살포시 눌러주시면..
여기에입력된 모든 내용은 'regist_ok.asp ' 로 전송되게 됩니다.
"왜? 어떻게 전송이 되는데? 난 초보라구... 자세히 알려달란 말야!!!"라고 외치시는 분들을 위해
전체적인 흐름에 대해서 설명드리겠습니다.

'regist.asp' 의 6번째 줄을 보시면다음 줄을 찾을 수가 있습니다.
<form name="registForm" method="post" action= "regist_ok.asp">
그리고 45번째 줄에는 '</form>' 이라는 문구로 이 폼을 닫습니다.

이렇게 <form> 태그로 둘러주게 되면6~45 줄까지는 하나의 폼으로 묶이게 됩니다.
그 폼의 이름(name)은 'registForm' 이 되고,이 안에서 사용자들이 입력한 정보들은
'post' 방식(method)으로'regist_ok.asp' 페이지에게 전송(action)되어지는 것입니다.

자, 조금은 이해가 되시는지요?
사용자들이 입력하는 모든 정보(userName, userPwd 등등..) 들은 'registForm ' 이라는 폼 안에 들어있고요.
우리가 모든 정보를 입력한 이후에 이 값들을 전송하기 위해 '작성완료' 버튼(submit)을 누르게 되면
'registForm' 안에 있는 모든 정보들은(즉 6줄부터 45줄까지의 모든 입력된 정보는)
'regist_ok.asp ' 페이지로전송되어집니다. 'post ' 방식으로 말이지요.

'음. 대충 이해가 갈듯도 한데.. 그럼 도대체 post 방식이머야...?'
form을 전송하는 방식에는 두가지 방식이 있습니다. 하나는 'post' 방식이고 또 하나는 'get ' 방식입니다.

이 두방식의 차이를 설명드리자면..
'post' 방식은 HTTP 헤더에 정보를입력하여 보내는 방식 이고,
'get' 방식은웹 브라우저에 적혀지는주소(URL)의 뒤에 정보를 추가하여 넘기는 방식 입니다.

무슨 말인지 잘 모르시겠다고요? 그럼 실제로 한번 테스트를 해 보도록 하시지요.
지금입력되어 있는 'regist.asp' 파일은 'post' 방식으로 전송하게 되어 있습니다.
이 페이지에 정보를 대충 입력하신 후 '작성 완료' 버튼을 눌러주세요.
그럼 다음과 같은화면이 뜨게 됩니다.. 맞나요?

<그림 11>




'뭐야? 페이지를 찾을 수 없다잖아? 내 이런 날이 올줄 알았지..' 하지 마시고 변명(?)의 기회를 주십시오.
당연히 페이지를 찾을 수 없다는 메시지가뜨게 됩니다.
왜냐하면 아직 'regist_ok.asp' 페이지를 만들지 않았기 때문이지요.
(전송은 했지만 받아 주는 페이지가 없으니까요)
지금 눈여겨 보아 주십사하는 부분은.. 위에 나와 있는 '주소창' 입니다.
주소창에는 'http://localhost/taiji/regist/regist_ok.asp' 라고나타나 있을 것입니다.
즉, 우리가action 으로 지정했던 'regist_ok.asp'로 자알 찾아왔다는 말입니다.
하지만 그 어느 곳에도 우리들이 정보를 입력했던 userName이나 userPwd같은 값들은 보이지 않습니다.

이처럼 'post' 방식은 'HTTP 헤더' 라는 다소비밀스런 공간에정보를 입력하여 전송 하는 방식으로서,
이전 페이지에서 넘겨받은 값들을 우리는확인할 수가 없습니다.
'그렇다면 'get' 방식은 우리 눈에 보여진다는 말인가??' 라는 의문이 드시겠지요?
좋습니다. 'get'방식도 한번 테스트해 보도록 하겠습니다.

'get' 방식은 주소(URL)의 뒤에 정보를 추가하여 보내는 방식이라는 말씀을 잠시 드렸는데요.
'regist.asp' 에서 6번째 줄을 <form name="registForm" method= "get" action= "regist_ok.asp"> 라고
수정한 후'작성 완료' 버튼을 누르게 되면 다음과 같은 화면이 뜨게 됩니다.

<그림 12>




아까와 마찬가지로 주소창을보아 주십시오..
'http://localhost/taiji/regist/regist_ok.asp?userName=%B1%E8&userPwd=df&userEmail=....'

'regist_ok.asp' 뒤에... 어라? 그 뒤에 무언가가길게(상당히 길게) 붙어있는 것을 볼 수 있습니다.
이렇듯 길게 늘어선 것이 바로 앞의 'regist.asp' 에서 사용자들이 입력한 정보인 것입니다.
regist_ok.asp 바로 다음에는 의문부호인 '?'로 구분 을 짓고,userName에는 '%B1%E8' 이라는 값을
넘겨줍니다. 그런데.. userName의 뒤에 붙은 값들이 웬지 마음에 걸리지요?
'엇? 나는 한글로 이름을 적었는데이상한 값이 넘어왔다!!!' 라고 하면서놀라실 필요 없습니다.
한글로 넘긴 값은 자동적으로 Encoding 이 되어 값이 변환되므로그런 현상이 나타나는 것입니다..
그 값의 다음부터는'&' 기호로 구분 을 지어 userPwd에 'df' 라는 값을, userEmail에
'maestrody@orgio.net'
이라는값을 넘겨주게 됩니다. (주소창의 뒤를 보면 나머지 값들도 계속 이어지는 것을 보실수 있습니다.)

이것이 바로 'get' 방식인 것입니다. 이제 URL의 뒤에 정보를 추가한다는 말이 무엇인지 이해하시겠지요.

그렇다면 'post' 방식과 'get' 방식은 어떤 장단점 을 가지고 있을까요?
첫째, 속도는'get' 방식이 'post' 방식보다 상대적으로 빠릅니다 .
물론 get, post 방식 모두 눈깜짝할 사이에 자료를 전송하므로 이것은 별 의미없는 이야기일지도 모릅니다.
어쨌든 HTTP 헤더에 정보를 입력하는 일련의 작업 후전송하는 post 방식보다는, 단지 URL의 뒤에 붙여
전송하는get 방식이 적은 차이지만 상대적으로 속도면에서 더 낫다는 말씀이 되겠습니다.

둘째,'post' 방식이 'get' 방식보다 더 많은 용량을 소화 할 수 있습니다.
URL의 뒤에 추가하는get 방식은 아무래도 용량의 제한을 받게 됩니다.
그 용량은시스템 환경에 따라 다르다고하네요.
어쨌든post 방식은 상대적으로 더 많은 양의 정보를 전송할 수 있다고 합니다.

셋째, 'post' 방식이 'get'방식보다보안적으로 조금 더 안전 합니다.
아까 결과를 보셔서 아시겠지만, get 방식은 넘기는 정보들이 주소창에 다 보이지요?
하지만 post 방식은 넘기는정보들을볼 수가 없었습니다. 이런 차이가 있지요.

이 강좌에서는 'post'방식을 사용했다는 사실을 기억해 주십시오.

자, 그럼 이제 전송한 정보를 받는 'regist_ok.asp ' 페이지에 관해서 알아보도록 하겠습니다.
다음 소스를 입력하신 후 'regist_ok.asp' 파일로 저장하셔서 regist 폴더 안에 저장해 주세요.

<regist_ok.asp>

 

01 <% Option Explicit
02
03 Dim objDBConn
04 Dim strSQL
05 Dim strName, strPassword, strEmail, strSubject, strContent, blnTag, strUserIP
06
07 strName= Request.Form("userName")
08 strPassword = Request.Form("userPwd")
09 strEmail = Request.Form("userEmail")
10strSubject = Request.Form("subject")
11 strContent= Request.Form("content")
12 blnTag = Request.Form("tag")
13strUserIP = Request.ServerVariables("REMOTE_ADDR")
14
15 strSQL = "Insert into board ("
16 strSQL = strSQL & " strName"
17 strSQL = strSQL & ",strEmail"
18 strSQL = strSQL & ",strPassword"
19 strSQL = strSQL & ",strSubject"
20 strSQL = strSQL & ",strContent"
21 strSQL = strSQL & ",blnTag"
22 strSQL = strSQL & ",intCount"
23 strSQL = strSQL & ",strUserIP"
24 strSQL = strSQL & ",dtmReg_Date"
25 strSQL = strSQL & ") Values ("
26 strSQL = strSQL & "'"&strName& "',"
27 strSQL = strSQL & "'" & strEmail & "',"
28 strSQL = strSQL & "'" & strPassword & "',"
29 strSQL = strSQL & "'" & strSubject & "',"
30 strSQL = strSQL & "'" & strContent & "',"
31strSQL = strSQL & "'" & blnTag& "',"
32 strSQL = strSQL& "0,"
33 strSQL = strSQL & "'" & strUserIP & "',"
34 strSQL = strSQL & "getDate())"
35
36Set objDBConn = Server.CreateObject("ADODB.Connection")
37
38objDBConn.Open "test", "sa", ""
39
40 objDBConn.Execute strSQL
41
42 objDBConn.Close
43 Set objDBConn = nothing
44%>
45 <script language="javascript">
46 <!--
47 alert("등록되었습니다");
48 location.href="../list.asp";
49 //-->
50 </script>

'regist_ok.asp' 페이지에서는 'regist.asp' 와는 대조적으로 html이 하나도 보이지를 않지요?
그렇다면.. 아마도 이 페이지는 사용자에게 보여지는 부분이 없게 될 것 같지 않나요?
맞습니다. 이 페이지에서 하는 일은 정보를 받아와서, DB에 등록하고,등록이 완료되면
글의 목록을 보여주는 페이지인'list.asp' 로이동시켜주는 역할만을 합니다.

이 'regist_ok.asp' 페이지는 크게 4부분으로 분류할 수 있습니다.
첫번째(1~13줄)는 변수 선언 및사용자가입력한 정보들을 변수에 저장 하는 부분입니다.
두번째(15~34줄)는 지난 시간에 우리가 만들었던 'board' 테이블 속으로 사용자가 입력한 정보들을 넣기
위해서,DB가 알아볼 수 있는 '쿼리(query)문' 을 작성하는 부분 입니다.
세번째(36~43줄)는ASP 내장 컴포넌트인
ADO(ActiveX Data Objects) 컴포넌트를 사용하여 DB와 연결
하고,조금전에 작성한 쿼리문을 이용하여 DB에 정보를 저장 하는 부분입니다.
네번째(45~50줄 )는저장을마친 후,글의 목록을 보여주는 'list.asp' 라는 페이지로 이동 시키는 부분입니다.

ASP 의 문장들은 '<%' 으로 시작해서 '% >' 으로 마쳐야 합니다.
그 안에 있는 부분들만이 서버에서 동작합니다.

1줄 맨 처음에 나오는 문장은 'Option Explicit ' 입니다.
이것은 '이 페이지에서 사용되는 모든 변수들은 반드시 선언되어진 이후에 사용 될 수 있다' 는약속입니다.
왜 이 기능을 사용했을까요?

ASP는 기본적으로 '변수 선언' 없이 변수를 사용하더라도 에러가 발생하지 않습니다.
이것은 참으로 편리한 기능이지만 부작용도 만만치 않습니다.예를 들어보겠습니다.
strTaiji = "서태지" 라는 값을 저장하고선, 나중에오타(실수)로 strTaeji 를 출력한다고 상상해 보시지요.
이런 경우 ASP는 에러를 발생시키지 않습니다.
전혀 다른 두개의 변수(strTaiji, strTaeji)가 있는 것 뿐이지요.
그렇다면 사용자가 아무리 strTaiji 에 값을 바꾸어 집어넣고 테스트를 해도, 그 값은 절대 출력되지 않습니다.
사용자는 변수명이 바뀌었다는 사실을 깨닫기 전까지는 전혀 이상없는 다른 소스를 붙잡고 고민해야 한다는
말이지요.(실제로 저도 예전에 'Option Explicit' 를 사용하지 않았을 때,반나절을 고생했던기억이.. T.T)

그래서 'Option Explicit' 라는 명령어는 꼭 사용해 주는 것이 좋습니다.
물론 변수마다 'Dim ' 이라는 명령어로 선언을 해 주어야 한다는 불편함과 귀찮음이 있을 수 있지만
잘 정리되어 있는 변수 선언은그 페이지의 특성을 한눈에 알아보게 할 수 있게 해 준다는 장점도 있습니다.
(솔직히.. 변수 선언은 C나 Java 같은 다른 언어에서는 기본중의 기본입니다. 귀찮다 생각하지 마시어요 ^^)

3~5줄 까지는 변수 선언 부분입니다.
그리고 7~13줄 까지는 regist.asp 에서 넘긴 사용자 정보를, 선언한 변수들 안으로 저장하는 작업을 합니다.
strName 이라는 변수에는 'regist.asp' 에서userName이라는 이름으로 넘긴 값을 저장하게 됩니다.
Request.Form 이라는 부분이 낯설게 느껴지실 것입니다.
Request는 ASP 내부에 자체적으로 내장된 개체 입니다.
문자 그대로 해석하면 '요청하다, 요구하다'는 뜻이 되지요.
이름에서 알 수 있듯이 Request 개체는 브라우저에서 사용자가 입력한 정보를받아 담아두는 일을 합니다.
그렇다면뒤의 Request.Form 에서 뒤의 'Form'은 무슨 의미일까요?
여러분들께서는 아까 'regist.asp' 에서 정보를 넘길 때 'post' 방식으로 넘겼던 사실을 기억하실것입니다.
'post' 방식으로 정보를 넘겼을 경우에는 Request.Form 이라는 명령어로 받게 됩니다.
그렇다면 'get' 방식은?이 때에는 Request.QueryString 이라는 명령어로 정보를 받아들이게 됩니다.

그렇다면 7~12 줄의 내용이 이해가 가시겠지요?
이름, 비밀번호, Email,제목, 내용, HTML의 정보들이 각각에 해당하는변수로 들어가게 되는 것입니다.
그렇다면 13줄의 Request.ServerVariables("REMOTE_ADDR") 는 무엇일까요?
이것은정보를 입력한 사용자의IP를 알아내는 구문이 되겠습니다.
(일단 관용적으로 알아두시면 좋겠습니다)

그렇다면 15~34 줄에 있는 무언가 반복되는 듯한 구문은 무엇일까요?
이것은 우리가 지난 시간에 만들었던 'test' 라는 DB, 그 안에 있는 'board' 라는 테이블안으로
7~13줄에서 변수에 저장한 각각의 정보들을 입력하는 SQL(Structed Query Language)구문 입니다.
(시퀄문이라고 불리우는 이SQL 구문을해석하자면 '구조적 질의 언어'가 됩니다)

우리가 이번 강좌 전체를 통해서 사용하게 될 SQL 구문은 총 4개입니다.
검색/조회구문인 Select문, 입력구문인 Insert문, 수정구문인 Update문, 삭제구문인 Delete문 입니다.
지금은 'board' 테이블에 정보를 '입력' 해야 하므로 'Insert' 구문을 사용하게 되겠습니다.

Insert 구문의 형식은 다음과 같습니다.

Insert intoTable 이름 (컬럼이름1, 컬럼이름2...) Values (저장할정보1, 저장할정보2...)

<그림 10>에서 입력한 정보를 그대로 전송하였다면 15~34 줄까지는 다음과 같은 SQL이 만들어집니다.

Insert into board ( strName,strEmail,strPassword,strSubject,strContent,blnTag,intCount,strUserIP,
dtmReg_Date) Values ('김덕영',
'maestrody@orgio.net','1111','헉, 왜 이렇게 썰렁해?','이거 머야.. 무지하게 썰렁하네. -_-a','T',0,'211.152.124.135','2001-09-16 오후 10:13:00')

Insert 문을 사용할 때 다음과 같은 점에 주의하시기 바랍니다.
1. 컬럼이름의 순서는 바뀌어도 상관없습니다만, 컬럼이름의 순서와 정보(변수)의 순서는 일치 해야 합니다.
- 즉,Insert into board 다음 컬럼이름의 첫번째에 strName 이 왔다면 Values 다음의 저장할 첫번째
정보에는 이름에 해당하는 '김덕영'이 와야 한다는 것입니다. 이것은 당연한 것이겠지요.
2. 정보를 입력할 때 해당 정보의 앞 뒤를 작은 따옴표(')로 감싸줍니다. 단 숫자(예: int)형은 예외입니다.
- 문자열로 입력되는 값들은 작은 따옴표를 꼭 붙여주고, 숫자형인 경우에는 작은 따옴표를 붙이지 않습니다.

위의 15~34 줄을 보시면 지금껏 말씀드린 Insert 문이 나오게 되는데요..
눈썰미가 있는 분들께서는 무언가 이상한 점을 발견하셨을 것입니다.
컬럼 이름 하나, 저장할정보 하나마다 한 줄씩 따로따로 쓴 것을 말입니다.
'우씨,소스 길게 보이게 하려고벼라별 꽁수를 다 쓰는군.' ... 이건 아니고요.
여러분들께 약간의 Tip을 드리기 위해 이런 방법을 사용하였습니다.

우선 이 Tip을설명드리기 위해서 문자열의 결합에 대해서잠시 알아보겠습니다.
문자열의 결합은 '&' 라는 기호를 사용해 표시하게 됩니다.
예를 들어보면 다음과 같습니다.
strLastName = "김"
strFirstName = "덕영"
strName = strLastName& strFirstName
이때strName에는 "김덕영"이라는 값이저장되어 있다는 말씀입니다.
그렇다면 다음과 같은 경우 strName에는 어떤 값이 저장되어 있을까요?
strName = strName & " 천재"
예상하신 대로 strName = "김덕영 천재" 가 저장되어져 있게 됩니다.(주의!! 천재 앞에 공백 한칸 주었어요)

문자열에 관한 또 하나의 예를 들어보지요.
strTaiji = "안녕하세여~ 태진데여"
strTest1 = strTaiji
strTest2 = "strTaiji"
자.. 그럼 문제입니다. strTest1 과 strTest2 에 저장된 값은 일치할까요?
정답은 "아니다 " 입니다. 왜일까요?
strTest1 에는 strTaiji에 저장되어진 "안녕하세여~ 태진데여"라는 값이 저장되어 있고,
strTest2 에는strTaiji에 저장된 값이 아닌 문자열 그대로의 "strTaiji" 가 저장된 것입니다.
(따옴표 때문에 그렇습니다)
이 두가지의 차이를 이해하시겠습니까? 간단하지만중요한 차이이므로 잘 기억해 두시기를 바랍니다.

그렇다면 이제 15~34 줄을 마치고 난 후에 strSQL 이라는 변수에 어떤 값이 들어있는지 아시겠지요?
strSQL 이라는 변수에는아까 보여드렸던 다음과 같은 문장이 저장되어져 있을 것입니다.

Insert into board ( strName,strEmail,strPassword,strSubject,strContent,blnTag,intCount,strUserIP,
dtmReg_Date) Values ('김덕영',
'maestrody@orgio.net','1111','헉, 왜 이렇게 썰렁해?','이거 머야.. 무지하게썰렁하네. -_-a','T',0,'211.152.124.135','2001-09-16 오후 10:13:00')

그렇다면 왜 한칸 한칸 줄을 바꾸어서 썼는지 말씀드리겠습니다.
우선 이렇게 한줄씩 따로 쓰게 되면 컬럼이름 쪽의 변수 갯수와 저장할 정보 변수 갯수를 비교해 보기가
편해지겠지요?이렇게 쓰면 컬럼 갯수와 저장할 정보의 갯수를 확인하는 측면에서 유리 해집니다.
또하나의 이점은 만약 board 라는 테이블에서컬럼을 삭제 또는 추가 한다고 했을때 생깁니다.
지금은 컬럼이 9개밖에 없지만 컬럼이 100개 정도 되는 테이블이라고 상상해 보시지요.
일렬로 주욱~ SQL 문을 입력한 상태에서, 중간에컬럼이 하나 추가된다고 한다면 그 부분을 찾는 것
또한 일이 됩니다.
그리고 컬럼을 어찌어찌해서 끼워 넣었다고 하더라도, 그 컬럼과 대응하는 정보를 또한 끼워넣어야 하는데...
작은 따옴표와 쉼표가 난무하는 곳에서 그 자리를 찾는 것은정말 못할 짓입니다. (눈이 핑핑 돕니다. -_-a)
사실 이것은 '규칙'은 아닙니다.또한 다분히 유지보수적인 측면이고요.
'별로 필요 없겠는걸...' 이라고 생각하시는 분들께서는 무시하고 넘어가셔도 상관 없다는 말씀입니다.
하지만실무에선 이런식으로 쓰고 있으며, 이런 방식에 적응되면 장점이 많더라는 말씀을 드리고 싶었습니다.

어쨌든 15~34 줄을 통하여 strSQL 이라는 변수에는 참으로 긴 문장이 입력이 되었습니다.

자 그럼이제는 36줄을 보도록 하시지요.

Set objDBConn = Server.CreateObject("ADODB.Connection")

이 짧은 한줄에 아주 심오한 의미가 담겨져 있습니다.. ^^
ASP에서는 우리가 DB에 접근할 수 있도록 자체적으로 내장된 컴포넌트를 제공해 주는데, 이 DB 관련
컴포넌트를ADO(ActiveX Data Objects) 라고 부릅니다. 그 ADO 라는 컴포넌트 안에는 여러가지 개체가
존재하는데요.그 중에서도 DB와의 연결을 담당하는 개체가 방금 사용한 Connection 개체 가 되겠습니다.
사용 방법은 위에서보시는 바와 같이 Server.CreateObject 라는 명령어를 이용해서 objDBConn 이라는
변수에Connection 개체의 인스턴스를 생성 합니다. 그리고 그 녀석(objDBConn)을 사용하게 되는 것이죠.

조금 어려운 내용일 것입니다. 이부분은 이해가 잘 안가시더라도 그냥 고개를 끄덕이시면서 따라와 주시기를
바랍니다. 어차피 이부분은 앞으로 지겹도록 사용해야 하는 부분이고, 사용하다보면 나름대로 정도 들 것이니까요. ^^

기억해야 하는 것은 이것입니다.
DB와 연결하기 위해서 Connection 이라는 개체의 인스턴스를 생성했다. 그것이 바로 objDBConn 이라는 녀석이다..

'인스턴스가 머야? 인스턴트 식품은 알겠는데.. 인스턴스는 도무지 모르겠단 말이쥐.' 라는 분들께서는 보아 주십시오.
예전에 저는 '서유기'를 참 재미있게 보았던 기억이 납니다. TV 에서도 만화로 자주방영해 주었고요.
서유기의 주인공인 손오공은 머리카락을하나 뽑은 다음에 훅~ 하고 불면 그 녀석이 손오공으로 되는..
아주특별한 재주가 있었습니다. 분명 그 녀석도 손오공이 맞지요. 생김새도, 하는 짓도.. (일종의 분신이죠)
인스턴스가 그와 같은 개념입니다. 원래의 개체(original)가 있는데 그 개체를 복사해서 그 개체가 하는 모든 기능을자신도 할 수 있게끔 하는 녀석.. 그것이 바로 인스턴스입니다. 조금은 이해가 되시는지요?

그 objDBConn 이라는 인스턴스를 사용하여 실질적으로DB와 연결을 하고,또원하는 내용을 저장할 수 있게 됩니다.
그럼 이제 DB와 연결이 이루어지는 38 줄을 보시겠습니다.

objDBConn.Open "test", "sa", ""

윗줄에서는 Connection 개체의메소드인 Open 메소드를 사용하는데요. 이 메소드는 인자 세개를 필요로 합니다.
첫번째는 DSN(Data Source Name), 두번째는 userID, 세번째는 password 입니다.
첫번째 인자인 DSN은 우리가 지난 시간에 만들었던 DB의 이름 "test" 가 되겠습니다.
두번째 인자인 userID는 역시 지난 시간에 ODBC 등록시 입력했었던 "sa"(system administrator)가 되고요.
세번째 인자인 password는 sa에 대응되었던 비밀번호가 되겠습니다.
지난 시간에 sa 의 비밀번호를 바꾸시라고 간곡(?)하게 말씀을 드렸었는데...
그때 혹시 비밀번호를 바꾸셨다면 바뀐암호를 여기에 입력하시면 됩니다. (참 착한 분들이세요.. ^^)

이제 DB와 연결이 되었으니 우리가 해야 할일은 strSQL 이라는 변수에 저장되어진 SQL 문을 'board' 라는
테이블에 저장하는 일일 것입니다. 그것도 또한 objDBConn 이라는 인스턴스를 사용합니다.
40줄이 되겠습니다.

objDBConn.Execute strSQL

이번에도 Connection 개체의 메소드를 사용하는데요. 이번에는 'Execute' 라는 메소드입니다.
이 메소드는 뒤에 있는 strSQL의 구문을 실행하는 역할 을 합니다.
즉, strSQL 안에 있는 구문이 실행되면서.. 실질적으로 DB에 저장하는 작업 은 여기서 이루어집니다.

이렇게 모든 작업이 이루어졌다면 우리가 36줄에서 생성했던 objDBConn 이라는 인스턴스를 없애주어야 하는데요.그 작업이 42~43 줄에 있습니다.

objDBConn.Close - Open을 해주었으니 당연히 Close도 해주어야 하겠지요?
Set objDBConn =nothing- objDBConn 이라는 인스턴스를 해제합니다.

자, 이렇게 Connection 개체의 인스턴스를 이용해DB를 열고, 저장을한 후 DB와의 연결을 닫고, 인스턴스를해제하면우리가 오늘 알아보고자 하는 모든 작업은 완료가 됩니다.

마지막으로 45~50 라인은 '자바 스크립트'를 이용하여 저장이 성공함을 알려주고, 페이지를 이동시키는 역할을 합니다.
47줄을 보시면 다음과 같은 소스가 있습니다.
alert("등록 되었습니다");
이 부분은 사용자에게 등록이 완료되었다는 간단한 정보 화면을 제공합니다. 다음 그림처럼요.

<그림 13>


그리고 48 줄의 location.href="../list.asp";는 현재 페이지를 상위 폴더에 있는 list.asp 라는 페이지로 이동시켜주는 역할을 합니다.
(물론 지금은 'list.asp' 페이지를 만들지 않았기 때문에 다음과 같은 화면이 뜰 것입니다.)

<그림 14>





이렇게 'regist.asp' 와 'regist_ok.asp' 를 거치게 되면사용자가 입력한 정보들이 DB에 저장되게 됩니다.
정말 저장이 되어 있는지 그럼 같이 한번 확인해 보도록 하겠습니다.
'시작 -> 프로그램 -> Microsoft SQL Server -> Enterprise Manager' 를 실행해 주시고요.
지난 시간에 만들었던 'test' DB 내에 있는 'board' 라는 테이블을 찾아주시기 바랍니다.
찾으셨으면 다음 그림처럼 'board' 테이블에서 마우스 오른쪽 버튼을 클릭하시고요.
'Open Table -> Return all rows' 를 실행해 주십시오.

<그림 15>




그랬을 때 다음과 같은 화면을 보신다면 성공적으로DB에 정보를 입력하신 것입니다.

<그림 16>





만약 'regist.asp' 에서 정보를 입력했을 때,<그림 13> 과 <그림 14>의 화면이 나오지 않고 에러메시지가 뜬다면'regist_ok.asp' 를 잘못 입력하셨을확률이 높습니다.
(특히40 줄인 'objDBConn.Execute strSQL ' 에서 에러가 난다면 그것은 15~34 줄의 SQL문에서의 오류입니다)
이럴 경우 주변의 잘하는 분들께 물어보시거나, 주위에 그런 분이 안계시다면제게 메일을 주십시오.
(메일을 주실때에는 에러메시지 를 꼭 같이 보내주셔야 합니다. '에러 났어요!!!'그러면 제가 어떻게 알겠습니까? -_-a)     /옮긴 글


'컴퓨터' 카테고리의 다른 글

인터넷 고수  (1) 2010.07.24
게시판 만들기 - 내용 보기  (1) 2010.07.14
단축키  (2) 2010.07.10
태그기초  (1) 2010.06.28
아이콘모음  (1) 2010.06.21
Posted by 외통
,