다음을 통해 공유


상태 관리

팁 (조언)

이 콘텐츠는 .NET Docs 또는 오프라인으로 읽을 수 있는 다운로드 가능한 무료 PDF로 제공되는 Azure용 ASP NET Web Forms 개발자용 Blazor 전자책에서 발췌한 내용입니다.

Blazor-for-ASP-NET-Web-Forms-Developers eBook 커버 썸네일.

상태 관리는 ViewState, 세션 상태, 애플리케이션 상태 및 포스트백 기능을 통해 지원되는 Web Forms 애플리케이션의 주요 개념입니다. 프레임워크의 이러한 상태 저장 기능은 애플리케이션에 필요한 상태 관리를 숨기고 애플리케이션 개발자가 해당 기능을 제공하는 데 집중할 수 있도록 하는 데 도움이 됩니다. ASP.NET Core 및 Blazor를 사용하면 이러한 기능 중 일부가 재배치되었으며 일부는 완전히 제거되었습니다. 이 장에서는 Blazor의 새 기능을 사용하여 상태를 유지하고 동일한 기능을 제공하는 방법을 검토합니다.

ViewState를 사용하여 상태 관리 요청

Web Forms 애플리케이션에서 상태 관리에 대해 논의할 때 많은 개발자는 ViewState를 즉시 생각할 것입니다. Web Forms에서 ViewState는 브라우저로 인코딩된 큰 텍스트 블록을 앞뒤로 전송하여 HTTP 요청 간의 콘텐츠 상태를 관리합니다. ViewState 필드는 많은 요소가 포함된 페이지의 콘텐츠로 인해 과부하가 발생할 수 있으며, 잠재적으로 크기가 몇 메가바이트까지 확장될 수 있습니다.

Blazor Server를 사용하면 앱이 서버와의 지속적인 연결을 유지 관리합니다. 회로라고 하는 앱의 상태는 연결이 활성으로 간주되는 동안 서버 메모리에 유지됩니다. 상태는 사용자가 앱 또는 앱의 특정 페이지에서 벗어나는 경우에만 삭제됩니다. 활성 구성 요소의 모든 멤버는 서버와의 상호 작용 간에 사용할 수 있습니다.

이 기능의 몇 가지 장점은 다음과 같습니다.

  • 구성 요소 상태는 쉽게 사용할 수 있으며 상호 작용 간에 다시 작성되지 않습니다.
  • 상태는 브라우저로 전송되지 않습니다.

그러나 메모리 내 구성 요소 상태 지속성에는 다음과 같은 몇 가지 단점이 있습니다.

  • 요청 간에 서버가 다시 시작되면 상태가 손실됩니다.
  • 애플리케이션 웹 서버 부하 분산 솔루션은 동일한 브라우저의 모든 요청이 동일한 서버로 반환되도록 고정 세션을 포함해야 합니다. 요청이 다른 서버로 전송되면 상태가 손실됩니다.
  • 서버의 구성 요소 상태를 지속하면 웹 서버에서 메모리가 부족해질 수 있습니다.

위의 이유로 서버의 메모리에 상주하는 구성 요소의 상태만 사용하지 마세요. 애플리케이션에는 요청 간의 데이터에 대한 일부 백업 데이터 저장소도 포함되어야 합니다. 이 전략의 몇 가지 간단한 예는 다음과 같습니다.

  • 쇼핑 카트 애플리케이션에서 카트에 추가된 새 항목의 콘텐츠를 데이터베이스 레코드에 유지합니다. 서버의 상태가 손실된 경우 데이터베이스 레코드에서 다시 구성할 수 있습니다.
  • 여러 부분으로 구성된 웹 양식에서 사용자는 애플리케이션이 각 요청 간의 값을 기억할 것으로 예상합니다. 여러 부분으로 구성된 양식이 완료될 때 최종 양식 응답 구조로 가져오고 어셈블할 수 있도록 각 사용자의 게시물 사이의 데이터를 데이터 저장소에 씁니다.

Blazor 앱에서 상태를 관리하는 방법에 대한 자세한 내용은 ASP.NET Core Blazor 상태 관리를 참조하세요.

세션을 사용하여 상태 유지 관리

Web Forms 개발자는 사전 개체를 사용하여 현재 작동하는 사용자 Microsoft.AspNetCore.Http.ISession 에 대한 정보를 유지할 수 있습니다. 문자열 키가 Session있는 개체를 쉽게 추가할 수 있으며, 나중에 사용자가 애플리케이션과 상호 작용하는 동안 해당 개체를 사용할 수 있습니다. HTTP와의 상호 작용 관리를 제거하기 위해 개체를 Session 사용하면 상태를 쉽게 유지할 수 있습니다.

.NET Framework Session 개체의 서명은 ASP.NET Core Session 개체와 동일하지 않습니다. 새 세션 상태 기능을 마이그레이션하고 사용하기로 결정하기 전에 새 ASP.NET Core 세션에 대한 설명서를 고려합니다.

세션은 ASP.NET Core 및 Blazor Server에서 사용할 수 있지만 데이터 리포지토리에 데이터를 적절하게 저장하기 위해 사용하지 않도록 권장됩니다. 방문자가 개인 정보 보호 문제로 인해 애플리케이션에서 HTTP 쿠키 사용을 거부하는 경우에도 세션 상태가 작동하지 않습니다.

ASP.NET Core 및 세션 상태에 대한 구성은 ASP.NET Core 문서의 세션 및 상태 관리에서 사용할 수 있습니다.

애플리케이션 상태

Web Forms 프레임워크의 개체는 Application 애플리케이션 범위 구성 및 상태와 상호 작용하기 위한 대규모 요청 간 리포지토리를 제공합니다. 애플리케이션 상태는 요청을 하는 사용자에 관계없이 모든 요청에서 참조할 수 있는 다양한 애플리케이션 구성 속성을 저장하는 데 이상적인 위치였습니다. 개체의 Application 문제는 여러 서버에서 데이터가 유지되지 않는다는 점입니다. 다시 시작 사이에 애플리케이션 개체의 상태가 손실되었습니다.

마찬가지로 Session여러 서버 인스턴스에서 액세스할 수 있는 영구 백업 저장소로 데이터를 이동하는 것이 좋습니다. 요청 및 사용자 간에 액세스할 수 있는 휘발성 데이터가 있는 경우 이 정보 또는 상호 작용이 필요한 구성 요소에 삽입할 수 있는 싱글톤 서비스에 쉽게 저장할 수 있습니다.

애플리케이션 상태 및 사용량을 유지하기 위한 개체의 생성은 다음 구현과 유사할 수 있습니다.

public class MyApplicationState
{
    public int VisitorCounter { get; private set; } = 0;

    public void IncrementCounter() => VisitorCounter += 1;
}
app.AddSingleton<MyApplicationState>();
@inject MyApplicationState AppState

<label>Total Visitors: @AppState.VisitorCounter</label>

개체는 MyApplicationState 서버에서 한 번만 만들어지고 값 VisitorCounter 이 페치되고 구성 요소의 레이블에 출력됩니다. VisitorCounter 내구성 및 확장성을 위해 백업 데이터 저장소에서 값을 유지 및 검색해야 합니다.

브라우저에서

나중에 사용할 수 있도록 애플리케이션 데이터를 사용자 디바이스에 클라이언트 쪽에 저장할 수도 있습니다. 사용자 브라우저의 서로 다른 범위에서 데이터의 지속성을 허용하는 두 가지 브라우저 기능이 있습니다.

  • localStorage - 사용자의 전체 브라우저로 범위가 지정됩니다. 페이지가 다시 로드되거나 브라우저가 닫히고 다시 열리거나 동일한 URL로 다른 탭이 열리면 브라우저에서 동일한 localStorage 탭이 제공됩니다.
  • sessionStorage - 사용자의 현재 브라우저 탭으로 범위가 지정됩니다. 탭이 다시 로드되면 상태가 유지됩니다. 그러나 사용자가 애플리케이션에 대한 다른 탭을 열거나 브라우저를 닫고 다시 열면 상태가 손실됩니다.

이러한 기능과 상호 작용하는 몇 가지 사용자 지정 JavaScript 코드를 작성하거나 이 기능을 제공하는 여러 NuGet 패키지를 사용할 수 있습니다. 이러한 패키지 중 하나는 Microsoft.AspNetCore.ProtectedBrowserStorage입니다.

이 패키지를 사용하여 localStoragesessionStorage와 상호 작용하는 방법에 대한 지침은 Blazor 상태 관리 문서를 참조하세요.