[문과 코린이의 IT 기록장] ASP 개체 모델 (사용자 정보 얻기 ( HTML FORM 태그 , ASP 페이지), ASP 개체 모델, Request 개체 종류, Server 개체 종류, Application 개체 종류)
1. 사용자 정보 얻기 ( HTML FORM 태그 , ASP 페이지)
[ regist.asp ]
<HTML>
<meta charset="UTF-8">
<HEAD>
<TITLE>사용자로부터 정보 얻기</TITLE>
</HEAD>
<BODY>
<FORM NAME=frmInfo METHOD=POST ACTION=regist_ok.asp>
이름 : <INPUT TYPE=TEXT NAME=txtName SIZE=15><BR>
Email : <INPUT TYPE=TEXT NAME=txtEmail SIZE=30><BR>
전화번호 : <INPUT TYPE=TEXT NAME=txtPhone SIZE=20><BR>
<INPUT TYPE=SUBMIT VALUE='전송'>
</FORM>
</BODY>
</HTML>
Form 요소
- Name : Form의 이름 (한 페이지 안에서 폼이 여러개가 될 수도 있기 때문에, 지정해주는 것이 좋음)
- Action : 사용자가 입력한 정보를 처리하는 페이지의 주소 (주소가 명확하지 않으면, 페이지를 찾을 수 없다는 오류가 뜸)
- Method : GET(정보를 주소창에 추가해서 전달하는 방식) / POST(숨겨서 정보를 전달하는 방식)
=> POST 방식이 더 보안적 측면에서 우수하며, 많은 양을 전달할 수 있다.
=> 그러나 GET방식이 POST방식보다 미세하게 속도가 빠르다.
* HTTP 메서드 참고
[ regist_ok.asp ]
<meta charset="UTF-8">
<%
DIM strName, strEmail, strPhone
strName = Request.Form("txtName")
strEmail = Request.Form("txtEmail")
strPhone = Request.Form("txtPhone")
Response.Write "이름은 = " & strName & "<BR>"
Response.Write "Email은 = " & strEmail & "<BR>"
Response.Write "전화번호는 = " & strPhone & "<BR>"
%>
- regist.asp에서 넘긴 정보를, 받는 부분
- POST방식으로 넘어온 경우, Request.Form() 형식으로 값을 받아야 한다.
* GET방식으로 전달받은 경우, Request.QureyString() 형식으로 값을 받아야 한다.
strName = Request.Form("txtName")
strEmail = Request.Form("txtEmail")
strPhone = Request.Form("txtPhone")
- 각 변수에 저장된 값들을, Response.Write 메소드를 이용해서 화면에 출력하게 된다.
- Response.Write 메소드를 사용해 화면에 출력하면, 이는 HTML로 변환된다. 따라서 줄을 바꾸기 위한 <BR>태그를 아래와 같이 넣어서 사용할 수 있다.
Response.Write "이름은 = " & strName & "<BR>"
Response.Write "Email은 = " & strEmail & "<BR>"
Response.Write "전화번호는 = " & strPhone & "<BR>"
2. ASP 개체 모델
- ASP에서는 프로그램을 짜는 사람들이, 쉽게 프로그래밍을 할 수 있게 하기 위해, 여러 가지 기능들을 만들어놓고 이를 권장하고 있다.
- 이 기능들은 종류별로 묶어 7가지 개체로 만들어졌으며,이는 바로 ASP 개체 모델이라고 한다.
1) Request 개체 2) Response 개체 3) Application 개체 4) Session 개체 5) Server 개체 6) ObjectContext 개체 7) ASPError 개체 |
1) Request 개체
- 클라이언트가 웹서버에 전달한 정보를 검색할 때 주로사용되는 개체
* 전반적으로 클라이언트가 요청한 것을 처리하는 개체
ex. Request.Form()
[ 가능한 작업 ]
a. 클라이언트가 URL의 뒤에 추가한 정보를 저장한다. (GET방식)
b. 클라이언트가 FORM 태그를 통해 전달한 정보를 저장한다. (GET, POST 방식)
c. 클라이언트에서 전달한 쿠키 값을 저장한다.
* 쿠키 : 클라이언트에게 저장되는 특정한 정보
d. 클라이언트에서 전달한 보안 코드를 저장한다.
e. 웹서버 자체에 대한 일반 정보(HTTP 서버 변수)를 저장할 수 있다.
2) Response 개체
- 서버가 클라이언트에게 응답할 때 사용되는 개체
- 즉, 웹서버에서 클라이언트로 정보를 어떤 방식으로 보여줄지 결정하는 개체
ex. Response.Write
[ 가능한 작업 ]
a. 클라이언트로 전달되는 페이지에 정보를 추가한다.
b. 클라이언트에 쿠키를 만들기 위해, 클라이언트의 웹 브라우저에 정보를 전달한다.
c. 요청한 페이지가 아닌, 전혀 다른 페이지로 이동(재지향)시킨다.
d. 페이지 생성과 동시에 정보를 전달할지, 생성된 다음 정보를 전달할지를 결정한다.
e. 페이지의 속성(HTML헤더, 타입)들을 제어하고 변경한다.
3) Application 개체
* 누군가 웹 서버에 처음 접근했을 때, 해당 Application이 작동하게 된 것이며, 모두 빠져나가게 되면 Application이 종료되는 것이다.
- 웹 어플리케이션이 시작하거나 종료할 때, 지정된 특정한 작업을 수행하기 위해서 주로 사용하는 개체이다.
- Application 개체는, 어플리케이션의 모든 영역에 걸쳐 있는 특성 때문에, 해당 사이트에 접속해있는 모든 사용자들이 접근할 수 있는 상태 정보(전역 변수)를 저장할 때도 유용하게 사용된다.
* 공통으로 사용하는 정보를 보관하는 역할
4) Session 개체
- 각 방문자들을 위한 개인적인 정보 저장 공간을 제공하는 개체
ex. 로그인 - 아이디/비밀번호 정보가 서버에 있는 Session 개체에 저장됨. => 페이지를 이동할 때마다 로그인할 필요 없이, 처음 단 한번의 로그인만으로 웹사이트를 자유롭게 돌아다닐 수 있음
5) Server 개체
- 서버 상에서 특정한 작업들을 실행하는 개체
- 즉, 웹서버의, 웹서버에 의한, 웹서버를 위한 작업을 하는 개체
[ 가능한 작업 ]
a. 페이지가 너무 오래 뜨지 않는 경우를 대비해, 한계 시간을 설정한다.
b. 사용자가 전달한 문자열을 HTML형식으로 변경한다.
c. 사용자가 전달한 문자열을, 올바른 URL 문자열의 형식으로 변경한다.
d. 가상 경로(URL)를 서버 컴퓨터의 실제 경로로 변경한다.
e. 다른 페이지로 이동하여, 실행 경로를 변경한다.
f. CreateObject라는 메소드를 사용해, 컴포넌트의 인스턴스를 생성한다.
6) ObjectContext 개체
- 트랜잭션을 시작하거나 종료할 때, 사용하는 개체
* 트랜잭션(Transaction) : 작업을 전부 실행 하거나, 전부 실행하지 않거나 (반드시 동시에 이루어져야 하는 작업의 경우 사용되는 것)
* 이 개체는 IIS버전이 5.0(Windows 2000)으로 올라가면서 필요성이 줄어들었고, 현재는 거의 사용하지 않는다.
7) ASPError 개체
- 에러 처리 작업을 위해, ASP 3.0에서 추가된 개체.
- ASP에서 발생한 마지막 에러에 대한 자세한 정보를 제공해준다.
3. Request 개체 종류
- Request 개체 : 서버가, 클라이언트들이 보내온 정보를 검색할 때, 사용하는 개체
- 이 Request 개체는, 5개의 컬렉션과, 1개의 속성, 1개의 메소드가 존재한다.
* 컬렉션 : 배열과 유사하며, 이름 / 데이터 형식의 한 쌍을 사용한다. (배열 : 인덱스번호 / 데이터 형식)
ex. 배열 : 배열이름(인덱스) = 데이터 => arrResult(0) = "홍길동"
컬렉션 : 컬렉션이름(이름) = 데이터 => Request.QueryString("name") = "홍길동"
1) 컬렉션 (Collcection)
* 컬렉션 : 서버가 관리하는 리소스 디렉토리
- Request개체에는 특수 기능이 있어, 컬렉션의 이름을 모두 생략 가능하다.
ex. Request.QueryString("count") = Request("count"), Request.Form("count") = Request("count")
- Request 개체의 우선순위 : QueryString > Form > Cookies > ClientCertificate > ServerVariables
(1) QueryString 컬렉션 (Request.QueryString)
- Request 개체 중, 가장 많은 빈도수로 사용되는 컬렉션
- <FORM>태그 안에 있는, 모든 HTML 컨트롤 요소들의 값을 저장하는 컬렉션이다.
- FORM 태그 내 Method는 GET방식이어야 한다.
ex. http://www.google.com/test.asp?first=hong&second=Minna
=> Request.QueryString("first") = "hong"
=> Request.QueryString("second) = "Minna"
(2) FORM 컬렉션 (Request.Form)
- QueryString 컬렉션과 마찬가지로, <FORM>태그 안에 있는, 모든 HTML 컨트롤 요소들의 값을 저장하는 컬렉션이다.
- 그러나 FORM태그 내 Method가 POST방식이어야 한다.
(3) Cookies 컬렉션 (Request.Cookies)
- 사용자 컴퓨터에 저장된 클라이언트의 정보를, 서버가 읽어오는 역할을 담당한다.
* 웹 서버는 클라이언트(사용자)들의 컴퓨터에, txt파일 형식의 정보를 저장할 수 있다.
ex. 처음 사이트에 접근해 로그인 했을 때, 그 아이디를 사용자 컴퓨터에 저장함.
=> 이후에 다시 그 사이트에 사용자가 들어오면 Request.Cookies 컬렉션을 이용해 그 사용자의 아이디를 읽어온다.
(4) ServerVariables 컬렉션 (Request.ServerVariables)
- 클라이언트(사용자)가 서버로 값을 전달할 때, 자동적으로 함께 전달되는, HTTP 헤더값들과, 웹 서버 자체의 몇 가지 환경 변수 값들을 저장한다.
* 클라이언트에 대해 제공해주는 정보 : OS 정보 / 접속 IP / 사용자 언어정보 (파티션이나 그 이상의 정보는 X)
** 이 컬렉션은 서버에 상당한 부하를 주기 때문에, 가능하면 사용을 자제하는 것이 좋음
- ServerVariables 컬렉션 내 모든 변수를 살펴보는 ASP 소스
<meta charset="UTF-8">
<TABLE BORDER>
<TR>
<TD><B>Server Variable</B></TD>
<TD><B>Value</B></TD> </TR>
<% For Each strKey In Request.ServerVariables %>
<TR>
<TD><%=strKey %></TD>
<TD><%=Request.ServerVariables(strKey) %> </TD>
</TR>
<% Next %>
</TABLE>
(5) ClientCertificate 컬렉션 (Request.ClientCertificate)
- 클라이언트의 브라우저에서 서버로 지정된 인증 필드들을 전송하게 되는데, 이 정보들이 저장되는 콜렉션이다.
* https:// => 사용자 인증 요구를 하는 사이트
2) 속성 (Property)
(1) TotalBytes 속성
- 클라이언트(사용자)에서 서버로 보낸 정보 내, 바이트의 전체 개수에 대한 정보를 제공한다.
* ASP 페이지에서 잘 사용되지 않음
- 사용법
<%
Dim intCount
intCount = Request.TotalBytes
%>
3) 메소드 (Method)
(1) BinaryRead(count) 메소드
- <FORM>에서 POST방식으로 정보를 전달할 때, count 바이트 만큼의 데이터를 읽어들이는 역할을 한다.
- 따라서 이 메소드는 Request.From 컬렉션과 부딪치는 경향이 있다. (이 둘은 같이 사용 불가능하다.)
<%
Dim strData, intCount
intCount = Request.TotalBytes // 정보의 바이트 개수
strData = Request.BinaryRead(intCount) // 이만큼 읽어들이는 역할
%>
4. Server 개체 종류
1) CreateObject 메소드
- ASP 페이지는 그 자신만으로는 파일을 다룰 수가 없으며, 파일을 다루는 컴포넌트인 FileSystemObject의 도움을 받아서 파일을 제어할 수 있다. 그러나 FileSystemObejct나, ADO 같은 것은, ASP.DLL에 들어있지 않고 따로 제공되어 진다.
- 이와 같이 ASP 페이지에서 ASP.DLL에 포함되지 않은 외부에서 제공되는 객체들을 사용하려면, CreateObject 메소드로 그 객체의 인스턴스를 만드는 방법으로 사용이 가능하다.
- 따라서, 외부에서 제공되는 모든 객체는, 그 프로그램 ID만 알고 있다면 ASP 페이지에서 코드를 통해 해당 객체의 인스턴스를 만들 수 있고, 그 객체가 가진 모든 기능을 사용할 수 있게 된다.
ex 1. Set adoCon = Server.CreateObject("ADODB.Connection")
// ADODB.Connection : ADO 커넥션 객체의 프로그램 id.
// 이후 adoCon이라는 객체변수를 사용하여, Connection 개체가 제공하는 모든 메소드와 속성(프로퍼티)을 사용할 수 있게 된다.
ex 2. Set oFSO = Server.CreateObject("Scripting.FileSystemObject")
// Scripting.FileSystemObject: 파일 시스템 포브잭트 객체의 프로그램 id
// 이후 ofFO라는 객체변수를 사용해, FileSystemObejct 개체가 제공하는 모든 메소드와 속성(프로퍼티)을 사용할 수 있게 된다.
2) URLEncode 메소드
- 하이퍼링크로 특수문자를 넘길 경우, 제대로 인식되지 않는 경우가 있음.
ex. <a href = "movie.asp? title = 48+1"> => 48 1로 출력 // + 특수문자는 한칸 띄는 의미로 인식되기 때문
- 이러한 특수코드들을 잘 넘겨주는 역할을 함.
<% str = "48 + 1" %>
<a href="movie.asp?name=movie&title=<%=Server.URLEncode(str)%>">
5. Application 개체 종류
- Global.asa : 웹 사이트(어플리케이션)을 전체적으로 지배하게 되는 파일 * 반드시 존재해야 하는 파일은 아님
1) global.asa의 역할
: 어플리케이션이 시작되고 끝나는 지점과, 세션이 시작되고 끝나는 지점을 체크해주는 역할을 한다.
* 즉, 이는 사이트를 방문하는 모든 방문자가 반드시 제일 처음 통과하게 되는 부분이다.
* 다시 말하자면, 사용자가 사이트를 방문해 처음으로 ASP 페이지를 요청하는 순간 시작된다. (html페이지에서는 작동x)
2) global.asa의 4가지 이벤트
<SCRIPT language=VBScript RUNAT="Server">
// RUNAT = "Server" : 이 스크립트는서버에서 실행된다.
Sub Application_OnStart // 어플리케이션이 시작할 때의 해야할 일을 코딩
End Sub
Sub Application_OnEnd // 어플리케이션이 끝날 때 해야할 일을 코딩
End sub
Sub Session_OnStart // 사용자마다 각각의 세션이 시작할 때의 해야할 일을 코딩
End Sub
Sub Session_OnEnd // 사용자마다 각각의 세션이 끝날 때의 해야할 일을 코딩
End Sub
</SCRIPT>
(1) Application_OnStart / Application_OnEnd
- Application_OnStart는 첫 사용자가 홈/가상 디렉토리에 최초로 웹 페이지(ASP 페이지)를 요청했을 때, 오로지 한 번만 발생한다. 따라서 서버가 스타트한 후, 첫 사용자가 들어올 때 한번 실행되고 다시는 실행되지 않는다.
- 디렉토리에서 모든 사용자의 세션이 끝나게 되면, 그때 Application_OnEnd가 실행되어진다.
(2) Session_OnStart / Session_OnEnd
- 매 사용자가 들어올때마다 Session_OnStart를 거치게 된다.
* 세션 : 각각의 사용자의 연결
- 기본적으로 세션은 20분간 지속되며, 사용자가 빠져나간지 20분이 지나면(20분간 사이트에서 어떤 액션도 취하지 않으면) Session_OnEnd가 실행되며, 세션이 끊어진다.
3) Application 개체를 통해, 전역변수 생성
Application("변수이름") = 기본값
// ex. Application("keyword") = 1
이렇게 선언되는 순간, 웹 사이트에서 keyword는 1이라는 값을 갖게 되며, 어떤 ASP 페이지에서도 이 변수를 사용할 수 있게 된다. 또한 이 변수는 Application이 종료될 때까지 서버에 존재하게 된다.
[ application_1.asp ]
<% Application("variant") = 1 %>
<HTML>
<HEAD>
<meta charset="UTF-8">
<title>Application 변수 테스트</title>
</HEAD>
<BODY>
<p>현재 Application("variant") 값은 <%=Application("variant")%> 입니다.</p>
<P>그리고, 지금 바로 이 값을 +1 합니다</P>
<% Application("variant") = Application("variant") + 1 %>
<p> 변경값 : <%=Application("variant")%></p>
</BODY>
</HTML>
[ application_2.asp ]
<HTML>
<HEAD>
<meta charset = "UTF-8">
<title>Application 변수 테스트</title>
</HEAD>
<BODY>
<p>현재 Application("variant") 값은 <%=Application("variant")%> 입니다.</p>
</BODY>
</HTML>
- 그런데 이렇게 전역으로 공유가능한 변수이기 때문에 문제가 발생하기도 한다.
: 동시에 여러명이 application_1.asp 페이지로 접근한다면, +1을 동시에 하려고 하기 때문에 충돌이 날 수 있다.
- 이 경우 해결하기 위해, Application객체는 두 개의 메소드를 추가적으로 제공하고 있다.
a. Lock : Application 개체에 락을 건다. 락을 건 사용자만이 Application 개체를 제어할 수 있다.
b. Unlock : Application 개체에 걸린 락을 풀어준다. 모든 이들이 다시 Application 개체에 접근이 가능하다.
- Application 변수를 바꾸거나 지정하는 코드의 앞뒤에는 Lock, Unlock을 설정해, 안전하게 페이지를 수정할 수 있도록 만들 수 있다. 즉, 이를 통해 먼저 페이지를 접근한 사용자가 수정을 안전하게 할 수 있도록 도운 후, 해당 사용자가 락을 풀면 다음 사용자가 데이터를 수정할 수 있도록 돕는다.
Application.lock
Application("variant") = Application("variant") + 1
Application.unlock
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |