다음을 통해 공유


ASP.NET 응용 프로그램 상태 개요

업데이트: 2007년 11월

응용 프로그램 상태는 ASP.NET 응용 프로그램의 모든 클래스에서 사용할 수 있는 데이터 리포지토리입니다. 응용 프로그램 상태는 서버의 메모리에 저장되고 데이터베이스에서 정보를 저장하거나 가져오는 것보다 실행 속도가 빠릅니다. 단일 사용자 세션에만 해당되는 세션 상태와 달리 응용 프로그램 상태는 모든 사용자 및 세션에 적용됩니다. 따라서 사용자에 따라 변경되지 않고 자주 사용되는 소량의 데이터를 저장할 때 응용 프로그램 상태가 유용합니다. 데이터를 사용자 단위로 저장하는 데 대한 내용은 ASP.NET 세션 상태 개요ASP.NET 프로필 속성 개요를 참조하십시오.

응용 프로그램 상태 사용

응용 프로그램 상태는 HttpApplicationState 클래스의 인스턴스에 저장됩니다. 이 클래스는 개체의 키-값 사전을 노출합니다.

HttpApplicationState 인스턴스는 사용자가 응용 프로그램의 URL 리소스에 처음으로 액세스할 때 만들어집니다. 일반적으로 HttpApplicationState 클래스는 HttpContext 클래스의 Application 속성을 통해 액세스됩니다.

두 가지 방법을 사용하여 응용 프로그램 상태를 사용할 수 있습니다. 먼저 코드를 통해 Contents 컬렉션에서 직접 값을 추가, 액세스 또는 제거할 수 있습니다. 응용 프로그램이 실행되는 동안에는 언제든지 HttpApplicationState 클래스에 액세스할 수 있습니다. 그러나 응용 프로그램을 시작할 때 응용 프로그램 상태 데이터를 로드하면 유용할 경우가 많습니다. 이렇게 하려면 응용 프로그램 상태를 Application_Start 메서드에 로드하는 코드를 Global.asax 파일에 추가합니다. 자세한 내용은 IIS 5.0 및 6.0의 ASP.NET 응용 프로그램 수명 주기 개요를 참조하십시오.

웹 응용 프로그램의 Global.asax 파일에서 <object > 선언을 통해 StaticObjects 컬렉션에 개체를 추가할 수도 있습니다. 그러면 이 방법으로 정의된 응용 프로그램 상태를 응용 프로그램의 모든 위치에서 코드를 통해 액세스할 수 있습니다. 다음 예제에서는 응용 프로그램 상태 값에 대한 개체 선언을 보여 줍니다.

<object  scope="application" ID="MyInfo" 
    PROGID="MSWC.MYINFO">
</object>

Global.asax 파일에서만 StaticObjects 컬렉션에 개체를 추가할 수 있습니다. 코드를 통해 직접 개체를 추가하려고 하면 이 컬렉션에서 NotSupportedException을 throw합니다.

응용 프로그램 상태에 저장된 개체의 멤버에 액세스하는 경우 Application 컬렉션을 참조할 필요가 없습니다. 다음 코드 예제에서는 응용 프로그램 상태의 StaticObjects 컬렉션에 정의된 개체의 멤버를 참조하는 방법을 보여 줍니다.

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    Label1.Text = MyInfo.Title
End Sub
protected void Page_Load(Object sender, EventArgs e)
    Label1.Text = MyInfo.Title;
End Sub

응용 프로그램 상태 고려 사항

응용 프로그램 상태를 사용하는 경우 다음과 같은 중요한 문제를 고려해야 합니다.

  • 리소스   응용 프로그램 상태는 메모리에 저장되므로 데이터를 디스크 또는 데이터베이스에 저장하는 경우에 비해 속도가 매우 빠릅니다. 그러나 큰 데이터 블록을 응용 프로그램 상태에 저장하면 서버 메모리가 꽉 찰 수 있으므로 서버에서 메모리를 디스크에 페이징할 수 있습니다. 응용 프로그램 상태를 사용하는 대신 ASP.NET 캐시 메커니즘을 사용하여 많은 양의 응용 프로그램 데이터를 저장할 수 있습니다. 또한 ASP.NET 캐시에서는 데이터를 메모리에 저장하므로 매우 빠릅니다. 그러나 ASP.NET에서는 캐시를 능동적으로 관리하고 메모리가 부족하면 항목을 제거합니다. 자세한 내용은 ASP.NET 캐싱 개요를 참조하십시오.

  • 휘발성   응용 프로그램 상태는 서버 메모리에 저장되므로 응용 프로그램이 중지 또는 다시 시작될 때마다 손실됩니다. 예를 들어 휘발성이 아닌 저장소 매체(예: 데이터베이스)에 응용 프로그램 상태 값을 기록하지 않은 경우에는 Web.config 파일이 변경되면 응용 프로그램이 다시 시작되고 모든 응용 프로그램 상태가 손실됩니다.

  • 확장성   응용 프로그램 상태는 웹 팜에서처럼 같은 응용 프로그램을 제공하는 여러 서버 간에 또는 웹 가든에서처럼 같은 서버에서 같은 응용 프로그램을 제공하는 여러 작업자 프로세스 간에 공유되지 않습니다. 따라서 응용 프로그램에서는 서로 다른 서버 또는 프로세스 간에 같은 응용 프로그램 상태 데이터가 포함된 응용 프로그램 상태를 사용할 수 없습니다. 다중 프로세서 또는 다중 서버 환경에서 응용 프로그램을 실행할 경우에는 응용 프로그램에서 일관되게 유지해야 하는 데이터에 대해 확장성이 높은 옵션(예: 데이터베이스)을 사용하는 것이 좋습니다.

  • 동시성   응용 프로그램 상태는 자유 스레드 형식이므로 여러 스레드에서 동시에 응용 프로그램 상태 데이터에 액세스할 수 있습니다. 따라서 응용 프로그램 상태 데이터를 업데이트할 경우에는 기본으로 제공되는 동기화 기능을 포함하여 스레드로부터 안전한 방식으로 작업을 수행해야 합니다. LockUnLock 메서드를 사용하면 한 번에 하나의 소스에서만 쓸 수 있도록 데이터를 잠가 데이터 무결성을 유지할 수 있습니다. 또한 Global.asax 파일의 Application_Start 메서드에서 응용 프로그램 상태 값을 초기화하여 동시성 문제가 발생할 가능성을 줄일 수도 있습니다. 자세한 내용은 IIS 5.0 및 6.0의 ASP.NET 응용 프로그램 수명 주기 개요를 참조하십시오.

참고 항목

작업

방법: 응용 프로그램 상태에 값 저장

방법: 응용 프로그램 상태에서 값 읽기

개념

ASP.NET 상태 관리 개요

기타 리소스

ASP.NET 상태 관리의 새로운 기능