ASP 강의 시리즈 (9) 개체 범위 설정
저자:Eve Cole
업데이트 시간:2009-05-30 19:59:07
개체의 범위에 따라 개체를 사용할 수 있는 스크립트가 결정됩니다. 기본적으로 개체 인스턴스를 만들면 개체에는 페이지 범위가 있습니다. 동일한 ASP 페이지 내의 모든 스크립트 명령은 페이지 범위 개체를 사용할 수 있습니다. 개체는 ASP 페이지가 클라이언트로 다시 전송될 때 해제됩니다. 대부분의 개체에 대해 권장되는 범위는 페이지 범위입니다. 다른 페이지의 스크립트에서 사용할 수 있도록 개체의 범위를 변경할 수 있습니다. 이 항목에서는 페이지 범위 개체를 사용하는 방법과 개체 범위를 변경하는 방법에 대해 설명합니다.
페이지 범위 개체 사용 ASP 페이지에서 Server.CreateObject를 사용하여 만든 개체는 페이지 수명 동안 존재합니다. 개체는 페이지에 대한 모든 스크립트 명령에 액세스할 수 있으며 ASP가 페이지 처리를 마치면 해제됩니다. 따라서 개체에는 페이지의 범위 또는 수명이 있습니다.
Visual Basic 또는 VBScript로 프로그래밍할 때 ASP가 페이지 처리를 완료할 때까지 개체를 해제하지 않도록 주의하십시오. 예를 들어, 다음 명령문은 개체 변수에 Nothing 값을 할당하여 개체를 해제하는 데 자주 사용됩니다.
myObj = 아무것도 설정하지 않음
ASP 페이지에 이 문을 포함하면 myObj를 사용하려고 하면 예상된 오류 코드가 반환됩니다. 그러나 내부적으로 ASP는 개체가 해제된 후에도 개체에 대한 참조를 계속 유지합니다. 스크립트에서 개체를 사용할 수 없으면 ASP가 페이지 처리를 완료할 때까지 개체의 리소스가 해제되지 않습니다. 마찬가지로, 다른 개체 인스턴스를 만들고 이를 이미 사용된 개체 변수에 할당하여 개체를 해제하는 경우 ASP는 원래 개체 인스턴스에 대한 참조를 유지합니다. 대부분의 스크립트에서는 여러 개체를 생성해도 문제가 발생하지 않을 수 있지만 개체가 데이터베이스 연결과 같은 공유 리소스를 사용하는 경우 문제가 발생할 수 있습니다.
개체에는 페이지 범위가 있으므로 수동으로 개체를 해제하는 데 의존하지 마십시오. 예를 들어, 다음 루프는 1001개의 연결 개체를 생성하여 대규모 SQL 서버에 대한 대부분의 연결을 열 수 있습니다.
<%
I = 0 ~ 1000인 경우
Conn = Server.CreateObject("ADODB.Connection") 설정
Conn.Open "연결 문자열"
다음
%>
일반적으로 루프 내부에 객체를 생성하지 않도록 노력해야 합니다. 불가피한 경우 개체에서 사용하는 리소스를 수동으로 해제해야 합니다. Connection 개체가 한 번만 생성되고 데이터 리소스에 대한 물리적 연결이 각 루프에서 열리고 닫히면 위 예제가 정상적으로 작동합니다.
<%
Conn = Server.CreateObject("ADODB.Connection") 설정
I = 0 ~ 1000인 경우
Conn.Open "연결 문자열"
연결 닫기
다음
%>
개체에 세션 범위 제공 응용 프로그램에서는 새 세션마다 세션 범위 개체가 생성되고 세션이 끝난 후 해제됩니다. 따라서 각 활성 세션마다 하나의 개체가 있습니다. 세션 범위는 여러 스크립트에서 호출되는 개체에 사용되지만 하나의 사용자 세션에만 영향을 미칩니다. 필요한 경우에만 객체 세션 범위를 제공할 수 있습니다. 세션 범위를 사용해야 하는 경우 개체를 제공하는 구성 요소의 스레딩 모델을 이해해야 합니다. 이는 개체의 성능 및 보안 환경에 영향을 미치기 때문입니다. 자세한 내용은 이 항목의 "고급 정보: 성능 문제"를 참조하세요.
개체 세션 범위를 제공하려면 Global.asa 파일의 <OBJECT> 태그를 사용하거나 ASP 페이지에서 Server.CreateObject 메서드를 사용하여 ASP 세션 내장 개체에 개체를 저장하세요. 범위가 지정된 개체. 도메인 개체 인스턴스입니다.
Global.asa 파일에서는 RUNAT 속성(Sever로 설정되어야 함)과 SCOPE 속성(Session으로 설정되어야 함)을 확장하는 ;OBJECT> 태그를 사용할 수 있습니다. 다음 예에서는 Ad Rotator 개체의 세션 범위 인스턴스를 만듭니다.
<OBJECT RUNAT=서버 범위=세션 ID=MyAd PROGID="MSWC.Adrotator">
</OBJECT>
Session 개체에 개체를 저장하면 응용 프로그램의 모든 페이지에서 해당 개체에 액세스할 수 있습니다. 다음 문은 이전 예에서 <OBJECT> 태그로 생성된 개체 인스턴스를 사용합니다.
<%= MyAd.GetAdvertisement("addata.txt") %>
ASP 페이지에서는 Server.CreateObject 메서드를 사용하여 Session 기본 제공 개체에 개체를 저장할 수도 있습니다. 다음 예에서는 Session 개체에 Ad Rotator 개체의 인스턴스를 저장합니다.
<% Set Session("MyAd") = Server.CreateObject("MSWC.Adrotator") %>
광고를 표시하려면 먼저 Session 개체에 저장된 Ad Rotator 개체의 인스턴스를 가져온 다음 개체를 표시하는 메서드를 호출해야 합니다.
<% MyAd 설정 = 세션("MyAd") %>
<%= MyAd.GetAdvertisement("addata.txt") %>
ASP는 .asp 파일의 스크립트 명령에 의해 참조될 때까지 <OBJECT> 태그로 선언된 개체의 인스턴스를 만들지 않습니다. Server.CreateObject 메서드는 즉시 개체의 인스턴스를 만듭니다. 따라서 세션 범위 개체의 경우 Server.CreateObject 속성보다 <OBJECT> 태그를 사용하는 것이 더 좋습니다.
객체 응용 범위 지정
애플리케이션 범위 개체는 애플리케이션이 시작될 때 생성되는 개체의 단일 인스턴스입니다. 이 개체는 모든 클라이언트 요청에서 공유됩니다. 드문 경우지만 개체 응용 프로그램 범위를 제공해야 합니다. 카운터 등과 같은 일부 유틸리티 개체에는 응용 프로그램 범위가 필요할 수 있습니다. 그러나 일반적으로 다음 섹션에 제안된 대안을 사용할 수 있습니다. 또한 스레딩 모델은 성능 및 개체 안전 환경에 영향을 미칩니다(이 항목의 "고급 정보: 성능 문제" 참조).
개체 응용 프로그램 범위를 제공하고 이를 ASP 응용 프로그램 기본 제공 개체에 저장하려면 Global.asa 파일에서 <OBJECT> 태그를 사용하거나 ASP 페이지 개체 인스턴스에서 Server.CreateObject 메서드를 사용하여 응용 프로그램 범위를 만들 수 있습니다. .
Global.asa 파일에서는 RUNAT 속성(Sever로 설정되어야 함)과 SCOPE 속성(Session으로 설정되어야 함)을 확장하는 ;OBJECT> 태그를 사용할 수 있습니다. ASP 페이지에서는 Server.CreateObject를 사용하여 응용 프로그램 기본 제공 개체에 개체 인스턴스를 저장할 수 있습니다. <OBJECT> 태그와 Server.CreateObject를 사용하는 예는 이전 섹션인 "객체에 세션 범위 제공"을 참조하세요.
세션 및 애플리케이션 범위에 대한 대안 필요한 경우에만 객체 세션 또는 애플리케이션 범위를 제공하십시오. 왜냐하면 이러한 개체는 세션이나 응용 프로그램이 종료될 때까지 남아 있기 때문입니다. 다른 방법으로 더 유용할 수 있는 메모리나 데이터베이스 연결과 같은 리소스를 소비합니다. 또한 구성 요소의 스레딩 모델은 해당 구성 요소에서 만드는 개체, 특히 세션 또는 응용 프로그램 범위가 있는 개체의 성능에 영향을 미칩니다.
대부분의 경우 애플리케이션 또는 세션 범위 개체를 생성하는 것보다 더 나은 접근 방식은 세션 또는 애플리케이션 범위 변수를 사용하여 페이지 수준에서 생성된 개체에 정보를 전달하는 것입니다. 예를 들어 ADO 연결 개체 세션 또는 응용 프로그램 범위를 제공하지 마십시오. 생성된 연결은 스크립트가 더 이상 ODBC 연결 공유를 사용하지 않는 동안 오랫동안 열려 있기 때문입니다. 그러나 ODBC 연결 문자열을 세션 또는 응용 프로그램 기본 제공 개체에 저장하고 웹 페이지에 생성된 연결 개체 인스턴스에서 문자열을 얻을 수 있습니다. 이렇게 하면 자주 사용하는 정보를 세션이나 애플리케이션 네임스페이스에 저장할 수 있지만 필요한 경우에만 해당 정보를 사용하여 개체를 만들 수 있습니다.
사용자 정의 JScript 개체 새 개체의 속성과 메서드를 만들고 초기화하는 생성자를 정의하여 고유한 JScript 개체를 만들 수 있습니다. 스크립트가 new 연산자를 사용하여 생성자를 호출하면 개체의 인스턴스가 생성됩니다. ASP 스크립트는 페이지 범위가 있을 때 제대로 작동하는 사용자 정의 개체를 지원합니다. 그러나 사용자 정의 JScript 개체에 응용 프로그램 또는 세션 범위가 지정되면 개체의 기능에 영향을 미칠 수 있습니다. 특히 개체에 세션 또는 응용 프로그램 범위가 있는 경우 다른 페이지의 스크립트는 개체의 속성을 얻을 수 있지만 해당 메서드를 호출할 수는 없습니다.
고급 정보: 성능 문제 구성 요소의 스레딩 모델은 웹 사이트의 성능에 영향을 미칠 수 있습니다. 일반적으로 둘 다로 표시된 개체는 모든 ASP 스크립트, 특히 세션 및 응용 프로그램 개체에 사용하는 것이 좋습니다. 단일 스레드 객체는 더 이상 사용되지 않습니다.
사용하는 개체의 스레딩 모델을 항상 제어할 수는 없으므로 다음 지침을 따르면 최적의 성능을 달성하는 데 도움이 될 수 있습니다.
페이지 범위 개체. 둘 다 또는 아파트로 표시된 개체는 최고의 성능을 제공합니다.
애플리케이션 범위 객체. 일반적으로 Application 개체에 개체를 배치하지 않아야 합니다. 애플리케이션 범위 개체를 사용해야 하는 경우 FreeThreadedMarshaler와 결합된 Both 태그 개체에서 최상의 성능을 얻을 수 있습니다. <OBJECT> 태그를 사용하거나 Server.CreateObject 메서드를 사용하여 Application 개체에 Single, Free 또는 Both 태그가 있는 개체를 저장할 수 있습니다. 아파트 스레드 개체에는 <OBJECT> 태그를 사용해야 합니다.
세션 범위 개체. 둘 다로 표시된 개체는 최상의 성능을 제공합니다. 단일 스레드 또는 아파트 스레드 개체를 사용하면 웹 서버가 한 스레드의 세션을 잠그게 됩니다. 자유 스레드 개체는 세션을 잠그지 않지만 빠르게 실행되지는 않습니다. Session 개체에서는 <OBJECT> 태그나 Server.CreateObject 메서드를 사용하여 개체를 저장할 수 있습니다.
SDK 문서를 설치한 경우 스레딩 모델과 그것이 의미하는 구성 요소 성능에 대한 자세한 정보를 얻을 수 있습니다. (SDK 문서는 Windows 95 이상에서는 사용할 수 없습니다.)