본문 바로가기

Web Development/ASP

[ASP] 내장 객체 에 대해서

Request Object

Request Object는 주로 사용자로부터 정보를 전달 받을때 사용되는 개체입니다우리는 ASP 라는 서버 사이드를 공부하는 것이기에 모든 관점은 서버쪽에서 바라보는 습관이 필요함다

Request 라는 말은 "요청하다" 이지만 이것은 서버측에서 요청한다는 의미입니다... 즉, 사용자가 서버로 보내오는 요청이나 데이터를 얻어내는 역할을 하는 것이 바로 이 Request 개체가 담당하는 역할이지요..

이 개체가 가지고 있는 주요기능은 다음 표와 같습니다만...아무래도 강좌에서 이 개체의 컬렉션등을 구체적으로  모두 알아보기에는 어려움이 있기에...우린 여기서 그 중 중요한 몇가지만 체크하려 합니다....  (더 깊숙한 내용은 책이나 MSDN을 참고해 주세요)

Collection (컬렉션)
ClientCertificate 사용자가 페이지나 리소스를 액세스할 때 서버로 전달한 클라이언트 증명서에 있는 모든 필드와 엔트리값(읽기 전용)
Cookies 사용자의 시스템에서 요청과 함께 전달된 모든 쿠키값
Form 폼 요청으로 전송된(POST 사용) 모든 HTML 컨트롤 요소 값
QueryString 사용자 요청에서 URL에 추가된 모든 이름/값 쌍들이나, GET 방식이 사용된 폼에 있는 HTML 컨트롤 요소값들(읽기 전용)
ServerVariables 클라이언트로부터 이들의 요청과 함께 전달된 모든 HTTP 헤더 값들과 웹 서버의 여러 가지 환경 변수값들(읽기 전용)

Property (속성)
TotalBytes 사용자에 의해 전송된 요청의 본문에 있는 바이트들의 총 수(읽기전용)

Method (메소드)
BinaryRead(count) 데이터가 POST 요청의 일부로 서버로 전송될 때, 사용자 요청으로부터 count 바이트의 데이터를 얻어낸다. 이것은 Variant 배열로 반환되며 ASP 코드가 이미 Request.Form 컬렉션을 참조했으면 이 메소드는 사용될 수 없다. 마찬가지로 여러분이 BinaryRead 메쏘드를 사용했으면 Request.Form 컬렉션도 사용할 수 없게 된다. 둘 중에 하나만이 사용

위의 표에서 굵게 처리한 것들이 Request 개체의 자주 쓰이는 것들입니다.가장 많이 쓰이는 것이 바로 QueryString, Form 입니다만...아마도 이들을 명시해서 사용하는 분은 없을 것입니다... 반드시 명시할 필요는 없기 때문이지요...  ^^   그 이야기는 이따가 다시 하시고 하구요.. 이제 한번 조금은 더 구체적으로 알아볼까요?

 

1. QueryString & Form

이 컬렉션은 한 페이지에서 다른페이지로 GET 방식으로 데이터를 보낼때, 그 클라이언트가 보낸값을 알아내기 위해 쓰입니다. 간단하게 예를 코드로 보면 다음과 같은 코드를 통해서 알 수 있습니다.

Form.htm

<html>
<body>
    <form Action="Result.asp" METHOD="GET">
        이름 : <INPUT TYPE="Text" NAME="name"><br>
        나이 : <INPUT TYPE="Text" NAME="age"><br>
    <INPUT TYPE="Submit" NAME="Enter" Value="확인">
    </form>
</body>
</html>

Result.asp

<html>
<body>
    이름은 <%=Request.QueryString("name")%> 이구요..<br>
    나이는 <%=Request.QueryString("age")%> 입니다
</body>
</html>

각각의 페이지를 작성해서... 웹 서버의 디렉토리에 올리고...  ^^Form.htm 부터 로딩해서 살펴보면,... 각각의 폼안의 컨트롤에 입력한 값이..Result.asp에 제대로 찍혀나오는 것을 볼 수 있을 것입니다.

중요한 것은 폼안의 컨트롤들의 이름과 Request.QueryString 할 때의 이름이 같아야 한다는 겁니다.이 이름은 반드시 맞추어 주셔야만 합니다. 반드시요.. 안 그러면, 그 값으로 NULL이 나오게 되기에 문제가 될 수 있습니다.

그리고, 위의 소스에서는 Form.htm 페이지의 폼 태그안에서..그 폼의 Method를 GET으로 준 것을 볼 수가 있습니다. 만일, 위처럼 GET 방식으로 데이터를 전송한다면반드시 ASP 측에서는 Request 개체의 QueryString로 그 값을 받아야 합니다.  ^^QueryString 이란 메소드가 바로 GET 방식으로 넘어오는 데이터를 서버측에서 얻어내는 역할을 하니까요

하지만, GET 방식으로 넘어오는 데이터들은 그다지 보안에 좋지 못합니다.이러한 데이터들은 브라우저의 URL바에 그 넘어오는 값이 모두 노출되기 때문이지요...

해서, 그보다는 POST 방식으로 데이터를 전송하는 것이 추천되는데..폼을 통해서 데이터를 전송할 경우 폼의 Method를 POST 로 지정해 주게되면 해당 데이터들이 URL의 꼬리에 붙어서 전송되는 것(브라우저의 URL바에 다 보임)이 아니라HTTP 헤더안에 포함되어져 오기에 조금은 보안적인 데이터 전송방법이라고 볼 수 있지요..물론, 완전한 보안적인 방법은 아니구요. QueryString 에 비하면 그렇다는 것입니다. ^^

이 방법은 뭐 많이 바꿀 것이 없습니다. 단지, 위의 소스에서 Form 태그안의 Method를 POST로만지정하면 그게 전부이지요..  ^^ 위의 소스를 POST 방식으로 바꾼 소스를 한번 보입시다.

Form.htm

<html>
<body>
    <form Action="Result.asp" METHOD="POST">
        이름 : <INPUT TYPE="Text" NAME="name"><br>
        나이 : <INPUT TYPE="Text" NAME="age"><br>
        <INPUT TYPE="Submit" NAME="Enter" Value="확인">
    </form>
</body>
</html>

Result.asp

<html>
<body>
    이름은 <%=Request.Form("name")%> 이구요..<br>
    나이는 <%=Request.Form("age")%> 입니다
</body>
</html>

소스중에 굵고, 빨갛게 처리된 부분이 수정된 부분입니다. 두 페이지 모두 다음과 같은 결과를 가져다 주기는 하지요...

 

단지 중요한 것은 하이퍼링크로 정보를 보낼때는 form을 쓰지못하고 반드시 Querystring를 써야만 한다는 것입니다. 하이퍼링크를 통해서 넘어오는 데이터는 GET 방식으로 넘어오게 되기에 말입니다.

하지만, 이 두가지 컬렉션 QueryString, Form 을 반드시 명시해 주어야 하는 것은 아닙니다..GET 방식으로 넘어오던, POST 방식으로 넘어오던 그 데이터를 서버측에서 얻어내기 위해서는

GET : Request.QueryString("...")POST : Request.Form("...")
GET, POST : Request("...")

와 같이 할 수 있다는 뜻입니다. 고로, 위의 Result.asp 소스는... 폼에 GET 방식이던, POST 방식이던지에 무관하게다음처럼 작성할 수 있다는 것이지요.

Result.asp

<html>
<body>
    이름은 <%=Request("name")%> 이구요..<br>
    나이는 <%=Request("age")%> 입니다
</body>
</html>

이 방법은 간단하기는 하지만, 그다지 서버의 성능에 좋지 못한 방법입니다...고로, 튜닝시에는 반드시 제대로 된 컬렉션의 이름을 지정하는 것이 필요합니다.

그러니 첨부터 프로그래밍시에 QueryString 이나 Form 을 사용해주는 것이 바람직합니다.개발자에게 가장 귀찮은 방법이 가장 빠른 방법이고는 합니다..  ^^

 

2. ServerVariables

Servervariable는 서버자체의 CGI버전이나 PORT, 로그인 유저명,IP주소등을 알려주는 컬렉션입니다.만일, 현재 서버의 웹 서버 버전을 알고 싶다면 다음처럼 하시면 됩니다..

Request.Servervariables("SERVER_SOFTWARE") 혹은 Request("SERVER_SOFTWARE") 처럼 사용하면 된답니다. 하지만, 역시 Request("SERVER_SOFTWARE") 라고 하는 방법은 서버의 성능에좋지 못합니다. 가급적 Request.Servervariables("SERVER_SOFTWARE") 라고 사용하세요

이 컬렉션을 사용해서 우리가 개발자의 입장에서 쓸만한 것은 사용자의 접속 IP 주소를 알아오는

Request.Servervariables("REMOTE_ADDR")

가 있습니다. 그리고, 사용자의 브라우저나 OS 버전을 알 수 있게 해주는

Request.Servervariables("HTTP_AGENT")

정도입니다. 이것은 나름대로 유용한 정보이지요...  ^^그렇다면, 위의 몇 가지 외에 얻어올 수 있는 또 다른 정보들로는 어떤 것들이 있을까요?그것이 사정없이 궁금해 지지 않나요? 하하... 궁금해 지지요?해서 따로 강좌를 준비해 두었습니다.

아래의 링크를 눌러 이 컬렉션의 활용법을 좀 더 알아봅시다. 이 링크를 누르신다면 지금 접속하신 분(당신!!!) 의 접속사항을 보실수 있습니다.

[ServerVariables 활용법]

Request Object - ServerVariables Collection


게시판이나 방명록이나 하여간 뭐를 만들때 이 ServerVariables은 유용한 편이기는 합니다.접속자의 접속환경을 어느정도 알려주니까요. 하지만, 이 컬렉션이 클라이언트에 대한 많은 정보를 제공해 줄 것이라고는 기대하지 마세요.클라이언트에 대해서라면 고작해야. 브라우저 정보나 OS 정보, 접속 IP, 사용자 언어정보 정도 랍니다.그 이상의 정보는 얻어낼 수가 없지요?

어떤 분은 클라이언트의 파티션 정보나 기타 사용자 개인적인 정보를 얻어올 수 있지 않을까?기대하시는 분들도 계신데여... 그렇지는 않다는 것을 기억하시기 바랍니다.

또한, 이 컬렉션은 서버에 상당한 부하를 주는 것이라..MS의 문서에서는 이 컬렉션의 사용을 가급적 자제하라는 권고가 있습니다...그렇기에 정말로 필요한 경우가 아니라면 이 컬렉션을 통해서 정보를 얻어내는 방법은..사용하지 않는 것이 좋습니다. 정말로 필요한 경우를 제외하고는 말이지요....

어쨋든, 이 컬렉션을 통해서 얻어올 수 있는 정보가 무엇인지 여러분은 궁금하실텐데요..아래에 정보들이 쭈~욱 보이지요??  왼쪽 컬럼의 이름들이 바로 키값인데요.. 원하는 정보에 맞는 키값을 써주시면 그 정보를 얻을수 있습니다. 예를 들면, 서버의 이름을 알고프다면 <%= Request.ServerVariables("SERVER_NAME")%> 처럼 써주시면 되지요.

아래의 키값들을 참조하셔서 원하는 정보들을 얻어보세요... 쉽죠??? 만약 아래처럼 전체의 키값과 내용을 보고싶다면 일일히 따로 따로 추출하지 마시구... For 문으로 돌리시면 됩니다. 어떻게???? ..... 정보를 보시고 난다음에 그 소스를 함께 보실 수 있을 것입니다....  

좋은 하루 되세요...

현재 접속하신 분의 ServerVariables의 결과입니다. :

ALL_HTTP HTTP_CONNECTION:Keep-Alive HTTP_ACCEPT:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-silverlight, */* HTTP_ACCEPT_ENCODING:gzip, deflate HTTP_ACCEPT_LANGUAGE:ko HTTP_COOKIE:ASPSESSIONIDCSRCRARB=CENHOHMAFBIKMGFKCHKBOJNM HTTP_HOST:www.taeyo.pe.kr HTTP_REFERER:http://www.taeyo.pe.kr/lecture/3_beginner_Objects/Request.htm HTTP_USER_AGENT:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Embedded Web Browser from: http://bsalsa.com/; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) HTTP_UA_CPU:x86
ALL_RAW Connection: Keep-Alive Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-silverlight, */* Accept-Encoding: gzip, deflate Accept-Language: ko Cookie: ASPSESSIONIDCSRCRARB=CENHOHMAFBIKMGFKCHKBOJNM Host: www.taeyo.pe.kr Referer: http://www.taeyo.pe.kr/lecture/3_beginner_Objects/Request.htm User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Embedded Web Browser from: http://bsalsa.com/; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) UA-CPU: x86
APPL_MD_PATH /LM/W3SVC/688450068/Root
APPL_PHYSICAL_PATH C:\Inetpub\Taeyo.pe.kr\
AUTH_PASSWORD  
AUTH_TYPE  
AUTH_USER  
CERT_COOKIE  
CERT_FLAGS  
CERT_ISSUER  
CERT_KEYSIZE  
CERT_SECRETKEYSIZE  
CERT_SERIALNUMBER  
CERT_SERVER_ISSUER  
CERT_SERVER_SUBJECT  
CERT_SUBJECT  
CONTENT_LENGTH 0
CONTENT_TYPE  
GATEWAY_INTERFACE CGI/1.1
HTTPS off
HTTPS_KEYSIZE  
HTTPS_SECRETKEYSIZE  
HTTPS_SERVER_ISSUER  
HTTPS_SERVER_SUBJECT  
INSTANCE_ID 688450068
INSTANCE_META_PATH /LM/W3SVC/688450068
LOCAL_ADDR 119.205.211.4
LOGON_USER  
PATH_INFO /lecture/3_beginner_Objects/Request_ServerVariable.asp
PATH_TRANSLATED C:\Inetpub\Taeyo.pe.kr\lecture\3_beginner_Objects\Request_ServerVariable.asp
QUERY_STRING  
REMOTE_ADDR 118.40.58.83
REMOTE_HOST 118.40.58.83
REMOTE_USER  
REQUEST_METHOD GET
SCRIPT_NAME /lecture/3_beginner_Objects/Request_ServerVariable.asp
SERVER_NAME www.taeyo.pe.kr
SERVER_PORT 80
SERVER_PORT_SECURE 0
SERVER_PROTOCOL HTTP/1.1
SERVER_SOFTWARE Microsoft-IIS/6.0
URL /lecture/3_beginner_Objects/Request_ServerVariable.asp
HTTP_CONNECTION Keep-Alive
HTTP_ACCEPT image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-silverlight, */*
HTTP_ACCEPT_ENCODING gzip, deflate
HTTP_ACCEPT_LANGUAGE ko
HTTP_COOKIE ASPSESSIONIDCSRCRARB=CENHOHMAFBIKMGFKCHKBOJNM
HTTP_HOST www.taeyo.pe.kr
HTTP_REFERER http://www.taeyo.pe.kr/lecture/3_beginner_Objects/Request.htm
HTTP_USER_AGENT Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Embedded Web Browser from: http://bsalsa.com/; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
HTTP_UA_CPU x86

그리고, 다음 소스는 위의 결과가 나오게 하는 소스이랍니다.. 여러분도 다음 소스를 돌려보시면 위와같은 모습의 결과를 얻을 수 있을 것입니다.

<HTML>
<BODY>
    <TABLE >
    <% For Each key in Request.ServerVariables %>
        <TR>
            <TD><%=key %></TD>
            <TD>
            <%
                if Request.ServerVariables(key) = "" Then
                    Response.Write " "
                else
                    Response.Write Request.ServerVariables(key)
                end if
            %>
            </TD>
        </TR>
    <% Next %>
    </TABLE>
</BODY>
</HTML>

 

Server Object

1) CreateObject 메소드

Server 객체의 가장 유용한 메소드이자, 끝내주는 메소드입니다. 이 메소드가 없이는 ASP 페이지는 앙꼬없는 찐빵과 다를 바가 없지요...  도대체 이 메소드가 무언데 그러느냐구요?

ASP 페이지는 많은 기능을 가지고 있지만.. 그렇다고 모든 기능을 가진 것은 아닙니다. 예를 들면 ASP 페이지는 그 자신만으로는 파일을 다룰 수가 없습니다. 이것은 파일을 다루는 컴포넌트인 FileSystemObject 의 도움을 받아서 파일을 제어할 수가 있지요..

또한,  ASP 혼자만으로는 데이터베이스도 다룰 수 없습니다. 데이터베이스를 잘 다루기 위해서는 MS 가 제공하는 ActiveX Data Object 라는 것을 사용해야지 가능하지요....

하지만, FileSystemObject 나 ADO 와 같은 것은 ASP.DLL 에 같이 들어있지 않으면, 따로 제공이 되어집니다. 다행스럽게도 무료로 제공되어지지요... 

ASP 페이지에서 이렇게 ASP.DLL 에 포함되어지지 않은 외부에서 제공되는 객체들을 사용하려면 어떻게 해야하느냐? 바로 CreateObject 메소드로 그 객체의 인스턴스를 만들고난 다음 사용할 수가 있게 되는 것입니다.

고로, 외부에서 제공되는 모든 객체는 그 프로그램 ID 만 알고 있다면 우리는 ASP 페이지에서.. 다음과 같은 식의 코드를 통해서 해당 객체의 인스턴스를 만들 수 있구요... 그 후, 생성된 인스턴스로 그 객체가 가진 모든 기능을 사용할 수 있게 된다는 겁니다.

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

여기서 ADODB.Connection 은 ADO의 커넥션 객체의 프로그램 아이디입니다.  ^^ 이렇게 작성하면 여러분은 adoCon이라는 객체변수를 사용해서 Connection 개체가 제공하는 모든 메소드와 프로퍼티를 사용할 수가 있게되는 것입니다....

만일, 파일을 다루고 싶다? 그렇다면 다음처럼 파일시스템포브젝트의 개체 인스턴스를 CreateObject 메소드로 생성해서 사용할 수 있게 됩니다.

Set oFSO = Server.CreateObject("Scripting.FileSystemObject")

얼마나 유용한 메소드인지 조금은 감이 오시나요?  ^^
아직은 잘 안 다가오겠지만.. 조금만 지둘려 보세요. 수많은 ASP 페이지에서 이를 사용하게 될 겁니다. ^^

 

2) URLEncode 메소드

하이퍼링크로 가끔가다 특수문자를 넘길일이 있곤 합니다...  예를 들면, % 나 + 등등 말이지요...
만약, 영화 리스트 페이지인데 하이퍼링크로 이 영화의 제목을 누르면 하이퍼링크로 이 영화의 제목을 넘겨서 DB검색을 하려고 한다. 그럴 경우 말입니다. 만약, 영화제목이 특수문자가 들어가는 예를 들면 "48+1"이라던가 하는 경우 일반적으로 하이퍼링크 되는 쪽 페이지이름이 movie.asp라면  하이퍼링크를 이렇게 넘기겠죠?

<ahref="movie.asp?title= 48+1">

하지만 이렇게 넘긴 48+1이라는 제목은 받는 쪽에서 보면 48+1이 아닌 48  1로 나옵니다.
+ 대신에 한칸이 띄어진 상태가 되는 것이지요.  ?? 진짭니다. 해보세요....  -_-;

왜 이런 현상이 발생할까요? 호기심 천국에 물어볼까요?  -_-;
제가 알려드리겠습니다. 이 이유는  + 라는 특수문자는 한칸띄는 의미로 인식되어지기 때문입니다.   만약 + 를 찍고 싶다면 %2b를 사용하셔야 합니다. 2b가 나타내는 것이 + 이니까요...

%를 같이 쓰셔야 합니다. 그래야 2b가 문자 2b인지 특수문자 코드인지를 구분하니까요.
% 와 안시코드... 다시 정리하면 이렇습니다.

list.asp에서 <ahref="movie.asp?name=movie&title=48%2b">영화</a> 로 보낸다면
movie.asp에서 <%=Request.QueryString("name")%>는 movie 라고 제대로 나오고,
<%= Request.QueryString("title")%>는48+1이라고찍혀 나오게 되지요..하하..

하이퍼링크위에다가 마우스를 올려놓으면 상태바에 위의 그림처럼 정보가 나타나는데 우리는 분명 title부분을 48%2b1이라고 썼는데 상태바에는 48+1로 우리가 원하던 대로 정보가 넘어감을 알수 있지요?  

일반적으로 이런 것들(+를 쓰려면 2b, 공백은 + )을 외우실 필요는 없습니다. 현명하신 분이라면 아무곳이나 유명한 검색엔진에서 우리가 알고픈 특수문자를 검색하시면 검색엔진은 친절하게도 보여주지요? 상태바나 아니면 위의 콤보박스에 말이예요.. 그것이 넘어갈때 어떻게 넘어가는지? 그걸 가져다가 우리도 쓰면 되겠지요?  

하지만, ASP 에서는 그러한 특수코드들을 걱정할 필요가 없습니다. 바로 Server.URLEncode라는 메소드가 위에 처럼 복잡하게 할 필요없이 빈 공백이든, + 든, 뭐든 잘 넘겨주거든요. 사용방법은 아래와 같아요...

<% string = "48 + 1" %>
<a href="movie.asp?name=movie&title=<%=Server.URLEncode(str)%>">

바로 URLEncode 는 이럴때 쓰는것이랍니다.. ^^

Application Object

Application 개체는 상당히 개념적입니다. 그래서 어렵게 느껴질 수 있지만 반드시 그 개념과 동작하는 것을 기억해야만 하는 중요한 개체입니다. 각오하십쇼.

Application이라는 말 자체에서 느껴지듯이 이 개체는 우리의 웹사이트(하나의 어플리케이션) 내를 통째로 지배하게 되는 개체입니다. 기존의 ASP 개체에는 속성과 메소드만이 존재했지만 이 어플리케이션 개체는 이벤트(Event)라는 것이 존재하는데요. 우리가 호출하여 사용할 수 있는 메소드같은 것이 아니라 자동으로 발생하는 사건(?)인 것입니다. Application 개체가 제공하는 이벤트에는  OnStart와 OnEnd가 있습니다.. 그리고, 이에 대한 자세한 이야기는 곧 이어질 것이랍니다.

일단 이 Application 개체를 설명하려면 그 전에 먼저 이야기를 해야하는 특수한 파일이 하나 있는데 그 파일의 이름은 Global.asa입니다. 거창하게 소개를 하면 이 파일은 우리의 웹 사이트(어플리케이션)을 전체적으로 지배하게 되는 파일입니다. 대단한 일을 하는 파일이지만 반드시 존재해야 하는 파일은 아니죠.

우리의 웹 사이트가 동작을 하는 시점과 끝나는 시점에 일어나기 바라는 어떠한 일들이 있다면, 그 일은 이 Global.asa의 파일 내에서 Application 개체의 이벤트를 사용함으로서 가능하게 됩니다.(벌써 어렵나요? 하지만 알고나면 그렇지도 않습니다)

기본적으로 global.asa는 존재하지 않습니다. 단, 인터데브라는 MS툴을 사용하여 사이트를 만들 경우는 기본적으로 이 global.asa를 만들어 주기는 하지요. 여러분도 일단은 이 global.asa 파일을 만들어 여러분의 사이트의 Root에 넣어주시기 바란답니다. 기냥 텍스트 파일을 하나 만드시구요. 그 파일의 이름과 확장자를 단지 global.asa 라고만 지정하시면 됩니다.(아마도 기본적으로라면 C:\inetpub\wwwroot 가 그 위치가 되겠네요)

파일안에는 뭐라고 내용을 넣냐구요? 아무것도 넣을 필요가 없습니다. 일단은요

아무 처리도 안 한 global.asa라면 여러분의 사이트에 그 어떤 문제도 일으키지 않을 것입니다. 그렇다면 어떤 처리를 한 global.asa는 어떤 영향을 미친다는 것인가요? 그렇습니다. 아마도 여러분은 천재가 아닌가 싶네요. 하나를 알려주면 열을 아시는 군요. 오오~~

기본적인 global.asa의 모습은 4개의 이벤트로 구성되어져 있습니다. 그렇다면 global.asa 란 무엇인가? 왜 필요한 것인가? 정확히 어디에 쓰이는가? 그것이 궁금합니다. 먼저 Global.asa에 대한 이야기를 들어보도록 합시다...

중요체크!!!   짠짠...  Global.asa에 대하여

global.asa는 상당히 까다로울 작업들을 녀석이 알아서 해결해 주는 착한 녀석입니다. 그 까다로울 작업이란 것은 어플리케이션이 시작되고 끝나는 시점과 세션이 시작되고 끝나는 시점을 체크하는 것이지요. 이 global.asa 가 없다면 어떻게 그러한 시점들을 우리가 체크할 수 있을지 막막하네요. 또한, 이 Global.asa는 우리의 웹 사이트를 들어오는 모든 방문자가 반드시 제일 처음 통과하는 관문입니다.(정확히는 사용자가 우리의 사이트를 방문하여 처음으로 ASP 페이지를 요청하는 순간이지요) 방문자가 우리의 사이트의 그 어떠한 ASP 페이지로라도 ASP 페이지를 첨 접근하는 순간 무조건 이 global.asa를 통과한 후 그 페이지로 자동으로 이동하게 됩니다. 그 누구도 피해갈 수가 없지요.

위의 그림이 그러한 모습을 표현하고 있는데요. 이것은 좀 억지성이 있어보이기는 하지만 이해하기에는 도움이 될 것이라 생각합니다. 사용자가 global.asa 가 존재한 웹 사이트로 입장하면서 처음으로 ASP 페이지를 요청할 경우 이 global.asa가 동작한다는 의미이니까요.. 

그렇다면, 퀴즈~~~!!!

만일, 사용자가 우리 사이트로 입장해서 첫 접근한 페이지가 default.htm 라면.. global.asa는 동작을 할까요? 안 할까요?

오오... 이런 오늘 이 강좌는 보시는 분들은 베리 지니어스 하신 분들뿐인가 봅니다. 그렇습니다. 동작하지 않습니다. global.asa는 ASP 페이지가 처음 요청될 경우에만 동작을 합니다. ^^  호호... 대단들 하시군요.. 저도 대단하죠? 아부하는 수준이 말입니다..히힛

다시 원래의 이야기로 돌아와서 이 global.asa는 그 기능들을 제공해 줍니다. 우리는 그 제공되는 시점에서 해야할 일들을 코딩해주기만 하면 되는 것이지요. Global.asa 에는 4개의 주요이벤트를 감지하는 책임이 있습니다. 그 4개의 이벤트라함은 Application_OnStart 과 Application_OnEnd 그리고 Session_OnStart 와 Session_OnEnd 입니다.우선 global.asa의 기본 소스를 보시겠습니다.


 

<SCRIPT language=VBScript RUNAT="Server">

Sub Application_OnStart
'어플리케이션이 시작할 때의 해야할 일을 코딩
End Sub

Sub Application_OnEnd
'어플리케이션이 끝날 때 해야할 일을 코딩
End sub

Sub Session_OnStart
'사용자마다 각각의 세션이 시작할 때의 해야할 일을 코딩
End Sub

Sub Session_OnEnd
'사용자마다 각각의 세션이 끝날 때의 해야할 일을 코딩
End Sub

</SCRIPT>

Global.asa 는 <SCRIPT language= VBscript RUNAT="Server"> 라는스크립트로 시작해서 </SCRIPT> 로 끝나게 됩니다. 이 안에다가 4개의 이벤트를 코딩하면 되는 것이지요. "Runat= Server"라 함은 이 스크립트는 서버에서 실행된다는 의미이다. ASP를 작성할 때 쓰는 <% %> 와 기능면에서 같다고 볼 수 있습니다만 위의 스크립트표시 대신에 <% %>를 사용하면 에러가 납니다. 주의하세요....

그럼 그 시점이라는 것이 언제냐? 그걸 알아야지만 알맞게 코딩을 넣을 수 있을 것이죠? 그렇죠?

먼저 Application_OnStart, 이것은 첫 사용자가 홈(내지는 가상) 디렉토리로에 최초로 웹 페이지(ASP페이지)를 요청했을 때 오로지 한 번만 발생하는 것으로, 서버가 스타트하기 시작하고 첫 사용자가 들어오면 그때 한 번 실행되고 다시는 실행되지 않습니다.

그 이후부터는 Session_OnStart 라는 녀석이 실행되게 되지요. 매 사용자가 들어올 때마다 이 Session_OnStart를 거치게 되는데, 이는 누구나 반드시 거칠 수밖에 없는 이벤트입니다. 세션이라는 것은 각각의 사용자의 연결자체를 의미한다고 보시면 됩니다. 기본적으로 세션은 20분간 지속되며, 사용자가 빠져나간지 20분이 지나면 Session_OnEnd가 실행되어 집니다. 그리고 가상 디렉토리에서 모든 사용자의 세션이 끝나게 되면 그때 Application_OnEnd가 실행되게 되는 것이지요. 허허.. 어렵나요? 어려웁게 들려야 정상입니다...  ^^

이해를 돕기 위해 예를 들어보도록 하겠다. 우리의 사이트가 이제 막 오픈을 시작했습니다. 그리고 얼마 지나지 않아 첫번째 방문자 A가 우리의 사이트를 들어오고(그 방문자는 우리 자신일 수도 있겠죠?), 그 순간 global.asa의 application_OnStart는 작동을 시작합니다. 그리고, Session_OnStart도 시작합니다.

첫번째 사용자 A가 들어온 후 5분이 지난 시점에 두번째 방문자가 들어왔다고 가정합니다. 이때 이 사용자에게도 Session_OnStart가 동작하게 됩니다. Session_OnStart 이벤트는 각각의 사용자에게 각각 적용되는 이벤트이기 때문이지요. 현재 우리의 사이트에는 2명의 사용자가 활동중인데, 시간이 흐른 뒤 첫번째 사용자가 우리의 사이트에서 즐거운 서핑을 마치고 나갔을 경우, 대부분 첫번째 사용자의 Session_OnEnd가 발생할 것으로 기대하지만 안타깝게도 그렇지는 않습니다.

Session_OnEnd 이벤트는 그 사용자의 세션이 끝나는 시점에서 발생하지, 그 사람이 우리의 사이트를 빠져나가는 시점에서 발생하는 것이 아닙니다. 서버는 사용자가 우리 사이트를 빠져나갔는지 아닌지 알 수가 없습니다. 서버가 각각의 사용자의 집을 쳐다보고 있다가... 그 사용자가 우리 사이트를 빠져나갔는지 아닌지를 지켜볼 수는 없는 노릇이잖아요? 사용자가 브라우저를 닫았는지, 사용자가 다른 사이트로 이동을 했는지 알길이 없습니다.

이것은 우리의 경우도 마찬가지입니다. 여러분의 친구와 통화를 하고 있다고 생각해 보세요.. 그 친구보구 "야야.. 이 사이트 죽인다 한번 들어가봐.. 지금" 이라고 했어요.. 그랬더니 친구는 "그래..지금 들어간다" 라고 말하죠...

그래서 내가 "들어갔냐. 메인에 서태지 사진 보이냐?" 라고 이야기 합니다. 그랬더니 친구는 "보인다"라고 이야기 하죠....여기까지는 좋습니다.. 내가 계속 서태지 이야기를 했더니만 친구는 조금 지루하기 시작했나 봅니다. 그러나, 지칠줄 모르고 저는 계속 이야기를 하죠...

"야야.. 그 사진을 누르고 본문으로 들어가봐. 재미있는 글이 있어".. 친구는 "응"하고 조용한 반응입니다. 내가 "재미있지?" 하니깐 친구는 "응" 이라고 말합니다.. 이런 "응"은 대부분 성의없는 "응"이라고들 부르지요.. 분쟁을 일으킬 수 있는 "응"이란 판단이 사정없이 들면서 의심스럽습니다.

"이 넘이 정말로 본문을 읽기는 한 걸까? 정말 본문 페이지로 들어가기는 했을까? 다른 사이트에서 만화를 보면서 건성으로 대답하는 것은 아닐까?" 해서 물어봅니다..."야야.. 너 지금 그 사이트에 있는거 맞어?" 대답해... 하지만, 더 이상 대답없는 친구....  과연 그 사이트에 남아있는 것인가? 아닌가?

비유가 어설프기는 했지만, 우리도 친구가 사이트에서 나갔는지 아닌지를 알 방법은 없습니다. 그 친구의 말을 해주지 않는다면요.. 하지만, 그 친구 거짓말을 했을 가능성이 크지요? 그래도 우리는 서버입장보다는 나은 것입니다.

서버는 사용자가 어떤 액션을 주지 않으면 하나도 제대로 판단할 수 있는 것이 없습니다.  ^^ 즉, 서버는 사용자가 어떤 페이지를 요청하게 되면 그 때, 이렇게 생각합니다. "아아.. 이 사용자는 지금 내 사이트에 들어와 있구나.." 라구요...

그리고, 시간이 흐릅니다.. 10분이 지나서 아까 그 사용자가 또 다른 페이지를 요청합니다. 그러면 서버는 이렇게 생각하지요 "아아.. 이 친구 아직도 있구나"

하지만, 1시간이 지나면? 2시간이 지나면? 아니면 그 친구가 브라우저를 닫고 내 사이트를 나갔다면? 여기서 주의할 것중에 하나는 인터넷이라는 특이한 연결입니다. 여러분이 태오 사이트를 보고 있는 지금 이 순간 여러분은 태오 사이트에 들어와있다고들 이야기하지만 사실은 그렇지 않습니다. 여러분은 태오사이트에 들어오고 나가고를 무지하게 반복하고 있는 겁니다.

여러분이 태오 사이트에 들어오는 시간은 지금 이 페이지를 로딩하는 그 몇초의 시간뿐 입니다. 페이지의 로딩이 완료되면 여러분의 브라우저와 서버와의 연결은 끊어집니다. 이 페이지의 로딩이 끝났고 여러분은 이 글을 읽고 계시죠? 그렇다면, 랜선을 뽑아버리거나 모뎀을 꺼버려보세요,. 그렇다고 이 페이지가 사라지나요? 그런 것은 아니죠? 여러분은 태오 사이트에서 여러분이 필요한 문서를 다운로드 받은 것이고 지금 이 순간 여러분은 인터넷의 연결없이 단지 여러분 로컬  하드에 다운로드된 HTML을 보고 있는 것입니다.

서버가 여러분을 인식하는 순간은 여러분이 페이지를 요청한 그 몇초 혹은 그보다도 안되는 찰라의 순간입니다.  ^^

해서, 서버는 각각의 사용자들이 입장하는 시점을 알 수가 있지만..(처음 페이지를 요청하는 시점이 바로 입장하는 시점이잖아요?) 나가는 시점은 알수가 없는 것이지ㅛ..

그렇다면, 그 사람이 우리의 사이트를 빠져나갔는지 체크할 방법이 전혀 없을까요? .

그래서 하나의 해결 방안으로, 사용자가 기본적으로 20분간 우리의 사이트에서 그 어떠한 액션도 하지 않으면 사이트를 빠져나갔다고 생각하고 그제서야 세션이 끊어지도록 하는 것이랍니다. 어떤 페이지를 요청한 뒤에 20분동안 다른 페이지의 요청이 없으면 서버는 "아아.. 그넘이 나간 것이야.. 내가 관심법으로 보았지"라고 한다는 것입니다. 즉, 첫번째 사용자의 Session_OnEnd를 동작한다는 것입니다.

곧 이어 두번째 사용자도 우리의 사이트를 떠난다고 가정합시다. 그 사람의 세션도 그 사람이 우리의 사이트를 떠난지 20분이 지나야 끊어집니다. 시간이 흘러 20분이 지났습니다. 이제 두번째 사용자의 세션도 끊어진다. 즉, Session_OnEnd가 동작하겠죠? 마지막 남아있던 세션이 끝나면 그때 Application_OnEnd는 작동한다고 말씀드렸습니다. 이해가 되나요?

더욱 이해를 용이하게 하고자 아래의 그림을 준비했슴다. 게다가 더욱 도움이 되고자 시간까지 표시했답니다.

자.. 그림과 함께 보아나갑시다...


Q> 우리의 웹 서버는 12:00 조금 전에 서비스를 시작했다고 가정했을 때,
12:00 사용자 A 사이트에 접속을 시도합니다. 이때 무슨 이벤트가 발생할까요?

A> Application_OnStart, Session_OnStart 가 발생합니다. 이 사용자는 우리 사이트가 서비스를 시작한 뒤 첨 들어오는 사용자이기에, 첫 문을 여는 사용자이기에 Application_OnStart를 일으키게 되는 것이지요.. 그리고, 자신의 Session_OnStart 도 발생시키겠지요?

Q> 12:05 두번째 사용자 B가 들어옵니다. 이 사용자는 어떤 이벤트를 발생시킬까요?

A> Session_OnStart 입니다. Application_OnStart는 이미 A 가 시작시켰으니깐 다시 시작시킬 필요가 없습니다.

Q> 14:00 첫번째 사용자였던 A 가 사이트를 나갑니다. 이 시간에 사용자는 어떤 이벤트를 발생시킬까요?

A> 아무 이벤트도 일어나지 않습니다. 사용자는 나갔지만 서버는 아직 이 사용자가 나갔다는 사실을 모릅니다. 사용자 A의 Sessin_OnEnd는 14:20 분에 일어나게 되는 것이지요

Q> 14:30 첫번째 사용자였던 B 가 사이트를 나갑니다. 이 시간에 사용자는 어떤 이벤트를 발생시킬까요?

A> 역시 아무 이벤트도 일어나지 않습니다. 사용자는 나갔지만 서버는 아직 이 사용자가 나갔다는 사실을 모릅니다. 사용자 B의 Sessin_OnEnd는 14:50 분에 일어나게 되구요. 이 사용자가 우리 사이트의 마지막 사용자이기에 Application_OnEnd도 일어나게 됩니다.

Q> 만일, 두번째 사용자 B가 나간 뒤 19분 59초가 지난 상태에서 이 두번째 사용자가 다시 들어오면 어떻게 될까요?

A> 그렇게 되면 그 두번째 사용자의 세션은 계속 유지되며, 이 사용자는 우리의 사이트에서 빠져나간 적이 없던 것처럼 생각이 되어질 것입니다. 사용자가 페이지 요청후 20분내에만 다시 페이지 요청이 들어오면 서버는 그 사용자는 우리 사이트에 계속 있었다고 가정을 하니까요.. 바보스럽기는 하지만요..  ^^

그리고, 앞으로도 최소한 20분 이상은 세션과 어플리케이션이 종료되지 않을 것입니다. 어플리케이션은 마지막 세션이 끝나는 시점에서 같이 끝나게 되기 때문이지요.

이러한 시점들을 체크해 주는 것이 바로 global.asa로, 그 시점들을 이 global.asa에서 체크해 주기 때문에 우리는 그 필요한 시점의 이벤트 함수에다가 코딩을 해주면 되는 것입니다.

global.asa에 대한 이야기를 듣고나니 이 Application개체가 가진 두 가지 이벤트가 어떤 일을 하는 것인지 다소 이해가 갔을 것입니다. Application개체가 가지는 또 다른 중요한 역할은 우리의 웹 사이트(우리의 웹 어플리케이션)에서 공유할 수 있는 전역변수로서의 역할입니다. 웹 사이트에 전반적으로 걸쳐 사용이 가능한 전역변수를 이 Application 개체를 통해서 만들 수가 있는데 그 방법은 다음과 같아요.

Application("변수이름")

너무나도 간단한가요? 그렇긴 하죠?. 만일 우리가 keyword 라는 이름으로 전역변수를 선언하고 싶고, 그 기본값은 1이라고 지정해 주고 싶다고 한다면 다음과 같이 선언하면 됩니다.

Application("keyword ") = 1

이렇게 선언이 되는 순간부터 이 Application("keyword ") 라는 것은 우리의 웹 사이트 내에서 1이라는 값을 가지게 됩니다. 그 어떤 ASP 페이지에서도 이 변수를 사용할 수가 있는 것이죠. 또한, 공유된 전역변수이기에 어느 ASP 페이지에서나 이 값을 바꿀 수가 있습니다. 한 번 테스트를 해 볼까요?

여러분의 가상 디렉토리나 웹 디렉토리에 다음과 같은 페이지를 하나 만들어 보세요. 아직 내공이 부족하신 분들은 다음 파일을 만들어서 C:\Inetpub\wwwroot 에 넣으시면 될 것입니다.  ^^

Application_1.asp

<% Application("variant") = 1 %>
<HTML>
<HEAD><title>Application 변수 테스트</title>
</HEAD>
<BODY>
<p>현재 Application("variant") 값은 <%=Application("variant")%> 입니다.</p>
<P>그리고, 지금 바로 이 값을 +1 합니다</P>
<% Application("variant") = Application("variant") + 1 %>
</BODY>
</HTML>

그러면 다음과 같은 결과화면이 나오겠지요? 페이지를 확인하기 위해서는 절대로 ASP 페이지를 더블클릭해서 실행하려하면 안되구여.. 일단, 브라우저를 띄우고 다음과 같이 URL을 입력해서 접근해야만 합니다. ASP 페이지는 반드시 그렇게 접근해야만 그를 실행시킬 수 있답니다.

http://localhost/Application_1.asp

localhost 라는 것은 자신서버를 자타내는 것이며, localhost 대신에 서버의 IP주소나, URL, 혹은 컴퓨터 이름을 대신 기입해주어도 문제는 없습니다. 만일, 여러분중에 어떤 분은 MySite 하는 가상 디렉토리를 가지고 있고, 그 디렉토리에 현재의 페이지를 저장했다면 다음처럼 접근해야 하겠죠?

http://localhost/MySite/Application_1.asp

그리고, 현재 이 페이지가 로딩되면서 서버에는 새롭게 Application("variant") 라는 변수가 만들어졌답니다. 그리고, 그 값이 2로 만들어져 있겠지요?

이렇게 Application 변수가 새롭게 만들어지게되면 이 변수는 Application이 종료할 때까지 서버에 존재하게 됩니다. ^^ 한번 만들어지면 말이죠....  그리고, 이 값은 현재의 웹 디렉토리내에서는 모두 공유해서 사용할 수가 있게됩니다. 이것을 확인하기 위해서 같은 디렉토리에 다른 ASP 페이지를 하나 더 만들어 보겠습니다. 자.. 다음과 같은 페이지를 만들어 보세요..  ^^

Application_2.asp

<HTML>
<HEAD><title>Application 변수 테스트</title>
</HEAD>
<BODY>
<p>현재 Application("variant") 값은 <%=Application("variant")%> 입니다.</p>
</BODY>
</HTML>

이 페이지를 실행하면 다음과 같은 결과가 나올 것입니다.

이미 Application_1.asp에 의해서 Application("variant") 값은 2가 되어져 있는 상태이었기에 Application_2.asp 에서는 그 값이 2로 나오는 것을 볼 수가 있지요? 이렇게 Application 변수는 값을 여러 페이지에서 공유해서 읽어올 수도, 저장할 수도 있습니다. 어떤 페이지에서든지간에 그 값을 읽고, 쓸 수 있다는 이야기이지요. ^^

이렇게 Application 변수는 사이트 전역에서 공유해서 사용할 수 있는 변수인 것이랍니다. 하지만, 그러다보니 문제가 하나 생길 수가 있습니다. 어떤 문제일까요?

그것은 동시에 두 사용자가 Application_1.asp 페이지로 접근할 경우에 발생할 수 있는 문제입니다. 만일 동시에 여러명이 Application_1.asp 페이지로 접근하다고 가정해 보세요. 그럴 경우에는 동시에 여러명이 Application("variant") = Application("variant") + 1 를 하려고 할 것이기에..  충돌이 날 수 있습니다..  Application("variant") 값을 동시에 바꾸려고 하니까요..  그럴수 있겠죠?

해서 Application 객체는 두개의 메소드를 또한 제공하고 있는데 그것은...

Lock : Application 개체에 락을 건다. 락을 건 사용자만이 Application 개체를 제어할 수 없다.
Unlock : Application 개체에 걸린 락을 풀어준다. 모든 이들이 다시 Application 개체에 접근이 가능하다

입니다.  ^^

해서, Application_1.asp 페이지처럼 Application 변수를 바꾸거나, 지정하는 코드의 앞뒤에는 다음처럼 락과 언락을 적절히 사용해서 조금이라도 먼저 페이지를 접근한 사람이 먼저 수정을 안전하게 할 수 있도록 하고, 그 사용자가 락을 풀어주면 그 다음 사용자가 다시금 데이터를 수정할 수 있도록 하는 것입니다.

Application.lock
Application("variant") = Application("variant") + 1
Application.unlock

락에 대한 이야기로 Application 에 대한 강좌도 정리할 시간이 온 것 같습니다. 이번 강좌는 이전 강좌에 비하면 그리 길지 않았지만 나름대로 중요한 이야기들을 나눈 것 같습니다. 사이트를 프로그래밍적으로 관리할 경우 이 Application 개체는 상당히 중요한 역할을 하기에 반드시 개념적으로 이해하고 있어야만 합니다. ^^ 꼭요..

그럼 수고하셨구요...  다음 표로 Application 객체의 메소드와 이벤트를 정리하고 이번 강좌를 마쳐보겠습니다. 감사합니다.

메소드 설명
Lock Application 개체에 락을 걸어 다른 사용자가 접근하지 못하게 한다.
락을 건 사용자만이 개체를 조절할 수 있다.
UnLock Application 개체에서 락을 해제한다
이벤트

설명

OnStart 웹사이트의 어플리케이션이 시작할 때 발생
OnEnd 웹사이트의 어플리케이션이 종료할 때 발생