연습: ASP.NET의 응용 프로그램 데이터 캐싱

캐싱을 사용하면 빠른 액세스를 위해 데이터를 메모리에 저장할 수 있습니다. 응용 프로그램에서는 캐시에 액세스할 수 있으며 데이터에 액세스할 때마다 원래 소스에서 데이터를 가져올 필요가 없습니다. 이로 인해 데이터 쿼리를 반복적으로 수행하지 않아도 되므로 성능과 안정성이 향상됩니다. 또한 캐싱을 사용하면 데이터 소스를 일시적으로 사용할 수 없는 경우에도 데이터를 사용할 수 있습니다.

.NET Framework에서는 ASP.NET 응용 프로그램에서 캐싱 기능을 사용할 수 있도록 해 주는 클래스를 제공합니다. 이러한 클래스는 System.Runtime.Caching 네임스페이스에 정의됩니다.

참고참고

System.Runtime.Caching 네임스페이스는 .NET Framework 4에서 새로 추가되었습니다. 이 네임스페이스는 모든 .NET Framework 응용 프로그램에서 캐싱을 사용할 수 있도록 합니다.

이 연습에서는 .NET Framework에서 사용할 수 있는 캐싱 기능을 ASP.NET 응용 프로그램의 일부로 사용하는 방법을 보여 줍니다. 이 연습에서는 텍스트 파일의 내용을 캐시합니다.

이 연습에서 수행할 작업은 다음과 같습니다.

  • ASP.NET 웹 사이트 만들기

  • .NET Framework 4에 대한 참조 추가

  • 파일의 내용을 캐시하는 캐시 엔트리 추가

  • 캐시 엔트리에 대한 제거 정책 제공

  • 캐시된 파일의 경로를 모니터링하고 모니터링된 항목의 변경 내용을 캐시에 알리기

이 연습을 완료하려면 다음과 같은 요건이 필요합니다.

  • Microsoft Visual Studio 2010

  • 적은 양의 텍스트가 포함된 텍스트 파일. 이 텍스트 파일의 내용을 웹 페이지에 표시합니다.

먼저 ASP.NET 웹 사이트를 만듭니다.

주의 정보주의

이 연습에서는 웹 사이트 프로젝트를 사용합니다. 대신 웹 응용 프로그램 프로젝트를 사용할 수도 있습니다. 이러한 웹 프로젝트 형식 간의 차이점에 대한 자세한 내용은 웹 응용 프로그램 프로젝트와 웹 사이트 프로젝트 비교를 참조하십시오.

ASP.NET 웹 사이트를 만들려면

  1. Visual Studio 2010을 시작합니다.

  2. 파일 메뉴에서 새 웹 사이트를 클릭합니다. 이 옵션이 없으면 새로 만들기를 클릭한 다음 웹 사이트를 클릭합니다.

    새 웹 사이트 대화 상자가 나타납니다.

  3. 설치된 템플릿에서 Visual Basic 또는 C#을 클릭한 다음 ASP.NET 웹 사이트를 선택합니다.

  4. 웹 위치 상자에서 파일 시스템을 선택한 다음 웹 사이트의 페이지를 보관할 폴더의 이름을 입력합니다. 예를 들어 폴더 이름으로 C:\Websites\AppCaching을 입력하고 확인을 클릭합니다.

    Visual Studio에서 레이아웃(마스터 페이지, Default.aspx 및 About.aspx 콘텐츠 페이지, CSS 스타일시트), Ajax(클라이언트 스크립트 파일) 및 인증(ASP.NET 멤버 자격)을 위한 미리 빌드된 기능이 포함된 웹 프로젝트를 만듭니다. 새 페이지가 만들어지면 기본적으로 Visual Web Developer에서 소스 뷰에 페이지를 표시합니다. 여기에서 페이지의 HTML 요소를 볼 수 있습니다.

다음 단계에서는 사용할 텍스트 파일을 현재 웹 사이트 프로젝트에 추가합니다.

프로젝트에 텍스트 파일을 추가하려면

  1. 솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭한 다음 기존 항목 추가를 클릭합니다.

  2. 기존 항목 추가 대화 상자에서 이 연습에 사용할 텍스트 파일을 선택하고 추가를 클릭합니다.

ASP.NET 응용 프로그램에서 System.Runtime.Caching 네임스페이스를 사용하려면 이 네임스페이스에 대한 참조를 추가해야 합니다.

웹 사이트에 참조를 추가하려면

  1. 솔루션 탐색기에서 웹 사이트의 이름을 마우스 오른쪽 단추로 클릭한 다음 새 참조 추가를 클릭합니다.

  2. .NET 탭에서 System.Runtime.Caching을 선택하고 확인을 클릭합니다.

다음 단계에서는 페이지에 Button 및 Label 컨트롤을 추가합니다. 또한 단추의 Click 이벤트에 대한 이벤트 처리기를 만듭니다. 뒷부분에서는 이 단추를 클릭하면 캐시된 텍스트가 Label 컨트롤에 표시되도록 하는 코드를 추가합니다.

페이지에 컨트롤을 추가하려면

  1. Default.aspx 페이지를 열거나 이 페이지로 전환합니다.

  2. 도구 상자표준 탭에서 Button 컨트롤을 Default.aspx 페이지로 끌어옵니다.

  3. 속성 창에서 Button 컨트롤의 Text 속성을 '캐시에서 가져오기'로 설정합니다. 기본 ID 속성을 허용합니다.

  4. 도구 상자표준 탭에서 Label 컨트롤을 페이지로 끌어옵니다. 기본 ID 속성을 허용합니다.

다음에는 아래 작업을 수행하는 코드를 추가합니다.

  • 캐시 클래스의 인스턴스 만들기(캐시 개체 인스턴스화)

  • 캐시에서 HostFileChangeMonitor 개체를 사용하여 텍스트 파일의 변경 내용을 모니터링하도록 지정

  • 텍스트 파일을 읽고 파일 내용을 캐시 엔트리로 캐시

  • 캐시된 텍스트 파일의 내용 표시

캐시 개체를 만들려면

  1. Default.aspx.cs 또는 Default.aspx.vb 파일에서 이벤트 처리기를 만드는 단추를 두 번 클릭합니다.

  2. 파일 맨 위의 클래스 선언 앞에 다음 Imports(Visual Basic의 경우) 및 using(C#의 경우) 문을 추가합니다.

    [Visual Basic]

    Imports System.Runtime.Caching
    Imports System.IO
    

    [C#]

    using System.Runtime.Caching;
    using System.IO;
    
  3. 이벤트 처리기에 다음 코드를 추가하여 캐시를 인스턴스화합니다.

    [Visual Basic]

    Dim cache As ObjectCache = MemoryCache.Default
    

    [C#]

    ObjectCache cache = MemoryCache.Default;
    

    ObjectCache 는 메모리 내 캐시 개체를 구현하기 위한 메서드를 제공하는 기본 클래스입니다.

    참고참고

    ASP.NET 4에서 캐싱은 ObjectCache 클래스를 사용하여 구현됩니다.

  4. filecontents라는 캐시 엔트리의 내용을 읽는 다음 코드를 추가합니다.

    [Visual Basic]

    Dim fileContents As String = TryCast(cache("filecontents"), String)
    

    [C#]

    string fileContents = cache["filecontents"] as string;
    
  5. filecontents라는 캐시 엔트리가 있는지 여부를 확인하는 다음 코드를 추가합니다.

    [Visual Basic]

    If fileContents Is Nothing Then
    
    End If
    

    [C#]

    if (fileContents == null)
    {
    
    }
    

    지정한 캐시 엔트리가 없으면 텍스트 파일을 읽고 이를 캐시에 캐시 엔트리로 추가해야 합니다.

  6. if/then 블록에 다음 코드를 추가하여 캐시가 10초 후 만료되도록 지정하는 새 CacheItemPolicy 개체를 만듭니다.

    [Visual Basic]

    Dim policy As New CacheItemPolicy()
    policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0)
    

    [C#]

    CacheItemPolicy policy = new CacheItemPolicy();
    policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0);
    

    제거 또는 만료 정보를 제공하지 않을 경우 기본값은 InfiniteAbsoluteExpiration입니다. 즉 캐시의 항목이 절대 시간에 따라 만료되지 않습니다. 대신 메모리가 부족할 때만 항목이 만료됩니다. 가장 좋은 방법은 항상 절대 또는 상대(siding) 만료를 명시적으로 제공하는 것입니다. 이 연습에서는 절대 만료 시간으로 10초를 사용합니다.

  7. if/then 블록 내에 있는 이전 단계에서 추가한 코드 뒤에 다음 코드를 추가하여 모니터링할 파일 경로의 컬렉션을 만들고 컬렉션에 텍스트 파일의 경로를 추가합니다.

    [Visual Basic]

    Dim filePaths As New List(Of String)()
    Dim cachedFilePath As String = Server.MapPath("~") & _
            "\cacheText.txt"
    filePaths.Add(cachedFilePath)
    

    [C#]

    List<string> filePaths = new List<string>();
    string cachedFilePath = Server.MapPath("~") + "\\cacheText.txt";
    filePaths.Add(cachedFilePath);
    

    HttpServerUtilityMapPath() 메서드는 현재 웹 사이트의 루트 경로를 반환합니다.

  8. 이전 단계에서 추가한 코드 뒤에 다음 코드를 추가하여 캐시 엔트리에 대한 변경 모니터의 컬렉션에 새 HostFileChangeMonitor 개체를 추가합니다.

    [Visual Basic]

    policy.ChangeMonitors.Add(New HostFileChangeMonitor(filePaths))
    

    [C#]

    policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths));
    

HostFileChangeMonitor 개체는 텍스트 파일의 경로를 모니터링하고 변경 내용이 있으면 캐시에 알립니다. 이 예제의 캐시 엔트리는 파일 내용이 변경될 경우 자동으로 만료됩니다.

  1. 이전 단계에서 추가한 코드 뒤에 텍스트 파일의 내용을 읽는 다음 코드를 추가합니다.

    fileContents = File.ReadAllText(cachedFilePath) & vbCrLf & DateTime.Now.ToString()
    

    fileContents = File.ReadAllText(cachedFilePath) + "\n" + DateTime.Now; 
    

    캐시 엔트리가 만료되는 시기를 확인하기 쉽도록 날짜 및 시간 타임스탬프가 추가됩니다.

  2. 이전 단계에서 추가한 코드 뒤에 파일 내용을 캐시 엔트리에 CacheItem 인스턴스로 삽입하는 다음 코드를 추가합니다.

    [Visual Basic]

    cache.Set("filecontents", fileContents, policy)
    

    [C#]

    cache.Set("filecontents", fileContents, policy);
    

    Set 메서드의 매개 변수로 CacheItemPolicy 개체를 전달하여 캐시 엔트리를 제거할 방법에 대한 정보를 제공합니다.

  3. if/then 블록 뒤에 캐시된 파일 내용을 Label 컨트롤에 표시하는 다음 코드를 추가합니다.

    [Visual Basic]

    Label1.Text = fileContents
    

    [C#]

    Label1.Text = fileContents;
    

이제 응용 프로그램을 테스트할 수 있습니다.

ASP.NET 웹 사이트에서 캐싱을 테스트하려면

  1. Ctrl+F5를 눌러 응용 프로그램을 실행합니다.

  2. 캐시에서 가져오기를 클릭합니다.

    텍스트 파일의 캐시된 내용이 레이블에 표시됩니다. 파일 끝 부분의 타임스탬프를 확인합니다.

  3. 캐시에서 가져오기를 다시 클릭합니다.

    타임스탬프가 변경되지 않았습니다. 이는 캐시된 내용이 표시되었음을 나타냅니다.

  4. 10초 이상 기다렸다가 캐시에서 가져오기를 다시 클릭합니다.

    이번에는 새 타임스탬프가 표시됩니다. 이는 정책에 따라 캐시가 10초 후 만료되고 새 캐시 내용이 표시되었음을 나타냅니다.

  5. 텍스트 편집기에서 웹 사이트 프로젝트에 추가한 텍스트 파일을 엽니다. 아직 아무 것도 변경하면 안 됩니다.

  6. 캐시에서 가져오기를 다시 클릭합니다.

    타임스탬프를 다시 확인합니다.

  7. 텍스트 파일을 변경한 다음 파일을 저장합니다.

  8. 캐시에서 가져오기를 다시 클릭합니다.

    이번에는 타임스탬프가 즉시 변경됩니다. 이는 변경 후 즉시 호스트 파일 변경 모니터가 캐시 항목을 제거했음을 나타냅니다.

    참고참고

    파일을 변경할 시간이 더 필요한 경우 제거 시간을 20초 이상으로 늘릴 수 있습니다.

이 연습을 마치면 웹 사이트의 코드가 다음과 같이 작성됩니다.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Runtime.Caching;
using System.IO;

public partial class _Default : System.Web.UI.Page
{


    protected void Button1_Click1(object sender, EventArgs e)
    {
        ObjectCache cache = MemoryCache.Default;
        string fileContents = cache["filecontents"] as string;

        if (fileContents == null)
        {
            CacheItemPolicy policy = new CacheItemPolicy();
            policy.AbsoluteExpiration =
                DateTimeOffset.Now.AddSeconds(10.0);

            List<string> filePaths = new List<string>();
            string cachedFilePath = Server.MapPath("~") +
                "\\cacheText.txt";

            filePaths.Add(cachedFilePath);

            policy.ChangeMonitors.Add(new
                HostFileChangeMonitor(filePaths));

            // Fetch the file contents.
            fileContents = File.ReadAllText(cachedFilePath) + "\n"
                + DateTime.Now.ToString();

            cache.Set("filecontents", fileContents, policy);

        }

        Label1.Text = fileContents;
    }
}


ASP.NET에서는 여러 개의 캐시 구현을 사용하여 데이터를 캐시할 수 있습니다. 자세한 내용은 ASP.NET 응용 프로그램에서 여러 캐시 개체를 사용하여 응용 프로그램 데이터 캐시를 참조하십시오.

표시: