본문 바로가기

WEB/ASP.NET

[ASP.NET 공부] ASP.NET 상태 관리 (Global.asax, HttpCookie) - 짱우의 코딩일기 - 티스토리

반응형

  'ASP.NET & Core를 다루는 기술'이라는 책을 통해서 ASP.NET 공부를 하기 시작했다. 아직 많이 읽어보질 못해 평가하기는 좀 그렇지만 예제랑 설명이 적절하게 섞여서 나온 책인 것 같다. 위의 책을 바탕으로 공부한 내용을 글로 쓰려한다.


ASP.NET 상태 관리

  ASP.NET의 상태 관리는 응용 프로그램을 제작할 때 필요한 데이터를 임시 또는 반영구적으로 서버 또는 클라이언트에 보관하고 사용하는 방법을 말한다.

Copy of 데이터베이스를 사용하지 않고 간단하게 데이터를 저장하는 기능

개체명 설명
HttpCookie (Cookies) 클라이언트 측 웹 브라우저에 간단한 데이터를 보관해 서버 성능을 향상시킬 수 있는 쿠키 개체를 생성한다.
Cache 클라이언트 측 메모리에 데이터를 보관해 응답 속도를 향상시킬 수 있는 캐시 개체를 생성한다.
ViewState 해당 웹 페이지 내에서만 어떤 정보를 임시로 보관하고자 할 때 가장 최적화된 방법을 제공한다.
Application 전체 웹 사이트 내에서 공유되어야 할 항목을 저장하는 데 사용된다.
Session 전체 웹 사이트 내에서 현재 사용자에게만 제공되는 항목을 저장하는 데 사용된다.
QueryString 현재 페이지에서 다음 페이지로 간단한 정보를 전달할 때 사용한다.

실습 ( 현재 접속자 수 표시 카운터 만들기 )

  실습을 위해 전역 응용 프로그램 클래스인 'Global.asax', 웹 폼 'FrmCounter.aspx'를 만들어 준다.

Global.asax

  'Global.asax' 파일은 Application과 Session 레벨 이벤트를 제공하며 주요 이벤트 설명은 다음과 같다.

  • Application_Start : 웹 프로젝트 가동 후 처음으로 사용자가 방문했을 때 발생한다.
  • Application_End : 웹 프로젝트 가동 후 마지막 사용자가 나간 후 발생한다. 일반적으로 마지막 사용자의 최종 요청이 끝나고 20분 후에 발생한다.
  • Session_Start : 각각의 사용자가 방문할 때 발생한다.
  • Session_End : 각각의 사용자가 나가고 20분 후에 발생한다.
protected void Application_Start(object sender, EventArgs e)
{
    // [1] 사이트 통계 1 / 3
    Application["CurrentVisit"] = 0; // 현재 사용자
}

protected void Session_Start(object sender, EventArgs e)
{
    // [2] 사이트 통계 2 / 3
    Application.Lock();
    Application["CurrentVisit"] = Convert.ToInt32(Application["CurrentVisit"]) + 1; // 현재 사용자
    Application.UnLock();
}

protected void Session_End(object sender, EventArgs e)
{
    // [3] 사이트 통계 3 / 3
    Application.Lock();
    Application["CurrentVisit"] = (int)Application["CurrentVisit"] - 1; // 현재 사용자
    Application.UnLock();
}

FrmCounter.aspx

... 생략 ...

<div>
    현재 : <asp:Label ID="lblNow" runat="server"></asp:Label> <br />
</div>

... 생략 ...

FrmCounter.aspx.cs

... 생략 ...

protected void Page_Load(object sender, EventArgs e)
{
    // 현재 접속자 수 표시
    lblNow.Text = Application["CurrentVisit"].ToString();
}

... 생략 ...

  다음과 같이 Global.asax 파일은 루트경로에 만들어줘야 한다. 따로 디렉토리를 만들어서 실행한다해서 같은 디렉토리 내에 위치시키는 것이 아니다. 만약 같은 디렉토리 내에 위치시키면 Global.asax 파일은 실행되지 않는다.

 

 

 

 

  FrmCounter.aspx 페이지를 실행한 후 웹 브라우저 창을 하나 더 띄운 다음 같은 경로로 접속하게 되면 카운터가 작동을 한다.

  만약 웹 브라우저를 새로 띄우지 않고 새로 고침 버튼을 누르거나, 새 탭을 띄우면 같은 세션의 웹 브라우저로 인식하기때문에 카운터가 올라가지 않는다.

캐싱을 사용한 웹 페이지 성능 향상 기법

  ASP.NET에서는 자주 바뀌지 않는 페이지에 대한 내용을 서버 측 캐시에 저장하고 있다가 클라이언트의 요청이 들어오면 바로 출력시킨다. 응답 속도를 개선할 수 있는 기법으로 이를 캐싱(Caching)이라고 한다.

실습 ( 캐싱을 이용한 웹 페이지 성능 향상 )

  실습을 위해 웹 폼 사용자 정의 컨트롤인 'FrmCachingWebUserControl.ascx'와 웹 폼인 'FrmCaching.aspx'를 생성한다.

FrmCachingWebUserControl.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="FrmCachingWebUserControl.ascx.cs" Inherits="ASP_Practice.Day0128.Caching.FrmCachingWebUserControl" %>

<<%@ OutputCache Duration="5" VaryByParam="None"  %>

현재 시간(웹 폼 사용자 정의 컨트롤) :
    <asp:Label ID="lblTimeWebUserControl" runat="server" Text="Label"></asp:Label>

FrmCachingWebUserControl.ascx.cs

... 생략 ...

protected void Page_Load(object sender, EventArgs e)
{
    // 현재 시간 출력 : 5초에 한 번씩만 출력
    lblTimeWebUserControl.Text = DateTime.Now.ToString();
}

... 생략 ...

FrmCaching.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FrmCaching.aspx.cs" Inherits="ASP_Practice.Day0128.Caching.FrmCaching" %>

<%@ Register Src="~/Day0128/Caching/FrmCachingWebUserControl.ascx" TagPrefix="uc1" TagName="FrmCachingWebUserControl" %>


<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            현재 시간(웹 폼) :
                <asp:Label ID="lblTimeWebForms" runat="server" Text="Label"></asp:Label>
            <hr />
            <uc1:FrmCachingWebUserControl runat="server" id="FrmCachingWebUserControl" />
        </div>
    </form>
</body>
</html>

  FrmCaching.aspx 페이지를 열고 코드 화면에 FrmCachingWebUserControl.ascx 파일을 드래그 해주면 저절로 Register 지시문이 생성된다. 물론 직접 코드를 입력해도 상관은 없다.

FrmCaching.aspx.cs

... 생략 ...

protected void Page_Load(object sender, EventArgs e)
{
    // 현재 시간 출력 : 매번 바로 출력
    lblTimeWebForms.Text = DateTime.Now.ToString();
}

... 생략 ...

  다음 화면처럼 웹 브라우저를 새로고침을 해도 '현재 시간 (웹 폼 사용자 정의 컨트롤)'에 해당되는 시간은 5초에 한 번씩만 값에 변화가 있다. '현재 시간(웹 폼)' 같은 경우에는 새로고침 할 때마다 값의 변화가 있다. 위와 같은 방법으로 자주 바뀌지 않는 페이지를 매번 실행하지 않고 서버 측 메모리에 저장하고 있다가 바로 출력시켜 주는 방식을 사용해 웹 페이지의 성능을 향상시킬 수 있다.

반응형