ASP.NET의 캐시 구성 개체 만들기

Steven A. Smith
ASPAlliance.com
2003년 9월
적용 대상:
Microsoft ASP.NET
요약: CacheConfig 도우미 클래스에서 ASP.NET 응용 프로그램에 적용할 캐싱 정책을 개선하고 캐시된 데이터의 재사용을 개선하며 코드의 줄 수를 현저히 줄여 캐싱을 구현할 수 있는 방법을 적절한 예와 함께 상세히 설명합니다. 이 기사는 ASP.NET Caching: Techniques and Best Practices 기사를 토대로 작성된 것입니다.
CacheConfigDemo.msi를 다운로드하십시오.

목차

소개
구성
처음 사용
기본 메서드: DeCache
사용법: 데이터 액세스 계층에 캐시 지원 추가
요약
리소스

소개

이 기사와 함께 ASP.NET Caching: Techniques and Best Practices를 읽어 보십시오. 이 기사는 해당 기사 내용, 특히 기사에 포함된 유용한 정보를 토대로 작성되었습니다. 이 기사에서는 Microsoft ASP.NET에 있는 Cache 개체에 대해 래퍼를 제공하는 도우미인 CacheConfig 클래스의 내부 구성에 대해 설명합니다. 이 클래스는 ASP.NET 응용 프로그램에서 수행되는 일반적인 캐시 작업 대부분에 사용할 수 있는 매우 간단한 메서드 하나를 보여 줍니다. CacheConfig 클래스를 사용하면 구성 설정을 전환하여 캐싱을 사용하거나 사용하지 않도록 설정하고 구성 설정을 통해 모든 캐시 항목과 해당 캐시 기간을 관리하며 이전 기사에서 설명한 최적의 방법을 사용하여 한 줄의 코드로 캐시에 액세스할 수 있습니다.

구성

CacheConfig는 web.config 파일에서 구성 가능한 모든 설정을 읽습니다. 코드 샘플 1에서와 같이 특정 섹션과 그 섹션의 각 키 값은 모두 정적 문자열인 기본값으로 정의되어 있습니다.
코드 샘플 1. 구성 섹션 및 키 이름
protected static string cacheSettingsConfigName = "CacheSettings";protected static string EnableCachingKey = "EnableCaching";protected static string RequireKeyDefinitionInConfigKey =   "RequireKeyDefinitionInConfig";protected static string DefaultCacheDurationUnitsKey =   "DefaultCacheDurationUnits";protected static string DefaultCacheDurationValueKey =   "DefaultCacheDurationValue";
기본적으로 모든 CacheConfig 구성 설정은 "CacheSettings"라는 사용자 지정 구성 섹션에 저장됩니다. 이 섹션은 기본 제공된 AppSettings 구성 섹션과 같이 간단한 NameValueCollection으로 정의됩니다. 코드 샘플 2에서와 같이 web.config에서 이 새로운 구성 섹션을 정의해야 합니다.
코드 샘플 2. web.config의 CacheSettings 구성 섹션 정의
<configSections><section name="CacheSettings"   type="System.Configuration.NameValueFileSectionHandler, System,   Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"   /></configSections>
The <configSections> 요소는 web.config 구성 요소의 첫 번째 요소여야 합니다.
web.config에서 이 섹션이 정의되고 적절한 키가 추가되면 이 섹션을 통해 응용 프로그램에서의 CacheConfig 클래스 동작이 관리됩니다. 코드 샘플 3은 샘플 CacheSettings 섹션을 보여 줍니다.
코드 샘플 3. CacheSettings 키 및 값
<CacheSettings><!-- true/false --><add key="EnableCaching" value="true" /><!-- true/false --><add key="RequireKeyDefinitionInConfig" value="true" /><!-- 시/분/초  --><add key="DefaultCacheDurationUnits" value="seconds" /><!-- 정수 --><add key="DefaultCacheDurationValue" value="30" /><!-- 캐시 키 및 기간 - 기본값을 사용하려면 "default"를 사용합니다. 그렇지 않으면 정수가 사용됩니다. --><add key="AuthorsDataTable" value="default" /><add key="AuthorsDataTableByState" value="10" /></CacheSettings>
처음에 나오는 네 개의 키는 CacheConfig의 동작에 많은 영향을 줍니다. 마지막 키는 CacheConfig를 사용하여 캐시에 저장된 모든 개체의 캐시 키 이름과 캐시 기간을 정의합니다. 표 1에서는 첫 번째 구성 값의 결과를 설명합니다.
표 1. 구성 설정 및 결과
설정설명
EnableCachingTrue/False 값을 가집니다. false일 경우 CacheConfig가 사용되지 않으므로 Cache에서 항목을 읽거나 작성할 수 없습니다.
RequireKeyDefinitionInConfigTrue/False 값을 가집니다. true일 경우 CacheConfig에 키가 제공되었지만 web.config에 표시되지 않으면 예외가 발생합니다.
DefaultCacheDurationUnits"초", "분" 또는 "시" 값이 설정됩니다. 다음 섹션에 지정된 기간 값의 단위를 정의하며 기간이 지정되지 않고 캐시에 추가된 항목에 대해 기본 캐시 기간으로 사용됩니다.
DefaultCacheDurationValue(정수) 값을 가집니다. DefaultCacheDurationUnits에 정의된 단위를 사용하여 항목이 캐시에 저장될 기간을 지정하며, 기간을 지정하지 않고 캐시에 추가한 항목에 대해서는 기본 캐시 기간을 사용합니다.
이 클래스는 CacheConfig 클래스의 1.0 버전이므로 지원되는 기능이 매우 단순합니다. 앞으로 이 클래스의 기능이 확장되면 다른 종류의 중요한 종속성에 대한 지원이 추가될 것입니다. 예를 들어 파일의 경우 현재 설정이 저장되는 방식대로 파일 경로가 구성에 저장됩니다. 캐시를 사용하는 경우 대부분 Microsoft SQL Server에서 가져온 데이터를 캐시하므로 적어도 SQL 테이블 캐시 무효화에 대해 기본 제공된 지원을 ASP.NET의 캐시 API에 사용할 수 있을 때까지는 시간 기반 캐싱이면 충분합니다.

처음 사용

CacheConfig는 Microsoft Visual Basic에서 공유되는 완전히 정적인 클래스이므로 직접 인스턴스화할 수 없습니다. 대신 이 클래스의 메서드가 직접 사용됩니다. 그러나 해당 메서드 중 하나를 처음으로 호출할 때마다 호출되는 생성자가 있습니다. 이 정적 생성자는 다음과 같은 작업을 수행합니다.
  • CacheSettings 구성 섹션을 로컬 NameValueCollection으로 로드합니다.
  • 구성 설정에 따라 로컬 EnableCaching 변수를 설정합니다.
  • 구성 설정에 따라 로컬 RequireKeyDefinition 변수를 설정합니다.
  • 구성 설정에 따라 로컬 DefaultCacheDuration TimeSpan을 설정합니다.
  • 캐싱에 필요한 HttpContext를 사용할 수 있는지 확인하고 사용할 수 없는 경우 EnableCaching을 false로 설정하여 디자인 타임이나 Windows Forms 응용 프로그램에서 데이터 액세스 계층을 호출할 때 오류가 발생하지 않게 합니다.
이 정적 생성자는 CacheConfig가 처음으로 참조될 때 한 번만 호출됩니다. 그러나 모든 설정이 web.config에 저장된 후에는 업데이트가 있을 경우 전체 응용 프로그램이 다시 시작되어 다음에 CacheConfig가 호출되면 정적 생성자가 다시 한 번 실행되고 최신 값이 검색됩니다.

기본 메서드: DeCache

여기서는 DeCache 메서드만 호출합니다. DeCache는 제공된 키의 캐시에서 값을 추출합니다. 캐시에 값이 없으면 DeCache가 콜백으로 제공된 메서드를 사용하여 캐시를 다시 채우고 이 메서드의 결과를 반환합니다. CacheConfig를 사용하여 EnCache() 메서드로 캐시에 간단히 항목을 추가할 수도 있지만 이 기능은 거의 사용되지 않습니다.
캐시되는 데이터 형식마다 별도의 DeCache 메서드가 필요합니다. 이 기사와 함께 제공된 CacheConfig 버전 1.0은 DataTable 개체만 지원합니다. 강력한 형식 검사를 위해 최대의 유연성이 요구되지만 이를 위해 많은 중복 코드가 필요한 경우 이 클래스를 사용하면 확장이 용이하여 System.Object 등의 다른 개체를 추가할 수 있습니다. C#에서 일반적인 기능을 지원하면 많은 코드를 중복해서 작성하지 않아도 되므로 이 도구의 새로운 버전은 매우 유용합니다.
DeCacheDataTable() 메서드는 다음과 같이 여러 개의 오버로드를 지원합니다.
(string key, GetDataTableCallback callback) - 캐시가 비어 있을 경우 최소한 키와 대리자로 캐시를 채워야 합니다.
(string key, GetDataTableCallback callback, object[] callbackArguments) - 콜백 메서드용 매개 변수 배열을 포함합니다.
(string key, GetDataTableCallback callback, object[] callbackArguments, TimeSpan cacheDuration) - 이 키에 대해 web.config에 지정의 내용을 다시 정의할 기간을 포함합니다.
(string key, GetDataTableCallback callback, object[] callbackArguments, TimeSpan cacheDuration, bool IgnoreCache) - IgnoreCache가 없을 경우 false로 처리됩니다. 이 메서드를 true로 설정하면 처음의 원본에서 추출한 값인 캐시가 무시됩니다.
GetDataTableCallback 대리자는 다음과 같이 정의됩니다.
public delegate DataTable GetDataTableCallback(object[] args);
대부분의 경우 데이터 원본에서 데이터를 추출하는 데 사용되는 기존의 메서드는 object[] args 서명을 사용하지 않기 때문에 대개 이 서명을 사용하여 새로운 private 또는 protected 메서드를 만들고 기존의 메서드에서 이 메서드로 호출합니다. 다음은 이러한 메서드의 사용 예를 보여 줍니다.

사용법: 데이터 액세스 계층에 캐시 지원 추가

Pubs 데이터베이스의 작성자를 나열하는 데 사용할 웹 양식 하나와 Pubs에서 이러한 작성자를 쿼리하는 데 사용할 데이터 액세스 클래스 하나로 구성된 매우 간단한 웹 응용 프로그램을 샘플 응용 프로그램으로 다운로드할 수 있습니다. 데이터 액세스 클래스 Author.cs는 Microsoft Data Access Application Block을 사용하여 데이터 액세스에 필요한 코드를 최소화합니다. 캐싱 지원을 추가하기 전에 이 클래스는 두 가지 메서드인 ListAuthors()ListAuthors(string state)로 구성됩니다. 각각의 메서드는 Authors 테이블 내용과 함께 DataTable을 반환합니다. Authors 테이블 내용은 상태 열의 값으로 필터링됩니다. 코드 샘플 4는 캐시 지원을 추가하기 전의 ListAuthors() 메서드를 보여 줍니다.
코드 샘플 4. 캐싱 지원이 없는 간단한 데이터 액세스 메서드
public static DataTable ListAuthors(){   return SqlHelper.ExecuteDataset(ConnectionString,       CommandType.Text,       "SELECT * FROM Authors").Tables[0];}
CacheConfig를 사용하여 이 메서드에 캐싱 지원을 추가하려면 먼저 GetDataTableCalllback 대리자 서명과 일치하는 새로운 오버로드를 만들어야 합니다. 즉, DataTable이 반환되고 개체 배열이 유일한 매개 변수로 사용되어야 합니다. 코드 샘플 5에서와 같이 실제 데이터 액세스 코드를 이 새로운 메서드로 옮깁니다.
코드 샘플 5. 대리자와 일치하는 메서드로 실제 데이터 액세스 코드 이동
protected static DataTable ListAuthors(object[] args){   return SqlHelper.ExecuteDataset(ConnectionString,      CommandType.Text,      "SELECT * FROM Authors").Tables[0];}
새로운 메서드가 만들어지면 원래의 메서드를 변경하여 CacheConfig.DeCache() 메서드를 사용하고 이 메서드로 새로운 ListAuthors(object[]) 메서드를 참조하는 콜백을 보냅니다. 코드 샘플 6은 새로운 버전의 ListAuthors()를 보여 줍니다.
코드 샘플 6. 캐싱 지원을 포함하도록 수정된 ListAuthors()
public static DataTable ListAuthors(){   GetDataTableCallback callback = new GetDataTableCallback(Author.ListAuthors);   return CacheConfig.DeCacheDataTable("AuthorsDataTable", callback, new SqlParameter[]{null});}
제공된 샘플 코드에는 ListAuthors()에서 상태별 필터링을 지원할 수 있도록 하는 다른 오버로드가 있습니다. 이 오버로드는 SQL을 약간 변경하고 보호된 메서드로 보내진 매개 변수 배열을 사용하여 보호된 메서드 사용을 공유합니다.

요약

ASP.NET 응용 프로그램에서 CacheConfig를 참조하고 지원되는 모든 캐싱 작업에 이 클래스를 사용하면 캐싱 정책을 더 효과적으로 제어할 수 있을 뿐 아니라 최적의 방법으로 캐시를 참조할 수 있습니다. 현재 폼에서는 절대 만료가 지정된 DataTable 개체로 제한되지만 CacheConfig 클래스는 쉽게 확장되어 정의하려는 종속성을 사용하여 캐시해야 할 모든 형식의 serializable 개체를 캡슐화합니다.

리소스

저자 소개

Microsoft ASP.NET MVP인 Steven A. Smith는 ASPAlliance.com의 사장이자 소유자입니다. 또한 .NET 중심 교육 기관인 ASPSmith Ltd의 소유자이자 대표 강사로, MSDN 및 AspNetPRO 잡지에 실리는 기사뿐 아니라 ASP.NET Developer's Cookbook과 ASP.NET By Example 두 권의 책을 저술한 바 있습니다. 또한 매년 열리는 여러 회의에서 강연을 맡고 있고 INETA 강연자 협회와 ASPInsiders의 회원이며, 경영학 석사 및 컴퓨터 과학 기술 학사 학위를 소지하고 있습니다.
전자 메일(ssmith@aspalliance.com)을 통해 저자와 연락할 수 있습니다.
Posted by 퓨전마법사
,