캐시 기능을 사용하여 빈번한 참조 데이터를 빠르게 사용할 수 있도록 한다. 기본적으로 Dotnet의 MemoryCache를 통해 구현이 되어 있으며, 다른 캐시 시스템으로도 교체할 수 있습니다.
예제
publicclassSampleAppController:AppController{privatereadonlyICacheManager _cacheManager;publicSampleAppController(ICacheManager cacheManager) { _cacheManager = cacheManager; } // 아이템 가져오기publicItemGetItem(int id) { //캐시에서 값을 먼저 찾고, 없으면 데이터베이스에서 가져온다.return _cacheManager .GetCache<int,Sample>("MySampleCache") .Get(id, () =>"Sample DB value") asItem; }}
위 예제에서의 ICacheManager를 삽입하고 MySampleCache라는 캐시를 가져옵니다. 캐시 이름은 대소 문자를 구분하므로 "MyCache"와 "MYCACHE"는 다른 캐시값을 관리하게 됩니다.
엔티티 캐싱
Axs의 캐시 시스템은 일반용이지만 엔티티를 캐시하려는 경우 도움이 될 수 있는 EntityCache 기본 클래스가 있습니다. 데이터베이스에서 반복적으로 쿼리하지 않도록 해당 ID로 엔티티를 가져오고 이를 Id로 캐시하려는 경우 기본 클래스를 사용할 수 있습니다. 다음과 같은 Sample 엔티티가 있다고 가정합니다 :
publicclassSample:Entity{publicstring Name { get; set; }publicint Age { get; set; }}
우리가 Id를 알고 있는 동안 사람들의 이름을 자주 얻고 싶다고 가정 합니다. 먼저 캐시 항목을 저장 할 클래스를 만듭니다.
[AutoMapFrom(typeof(Sample))]publicclassSampleCacheItem{publicstring Name { get; set; }}
간단히 ISampleCache를 주입(injected)하고 캐시 항목을 얻은 다음 Name 속성을 얻었습니다.
확인
SampleAppController를 통한 확인
SampleAppController.cs 파일에서 GetSampeByCache1, GetSampeByCache2 메서드를 통해 확인 가능하다.
#regionICacheManager 사용publicSampleDtoGetSampeByCache(int id){ //캐시에서 값을 먼저 찾고, 없으면 데이터베이스에서 가져온다.var sample = _cacheManager .GetCache("MySampleCacheName") .Get<string,Sample>(id.ToString(), () =>_sampleRepository.FirstOrDefault(x =>x.Id== id));returnObjectMapper.Map<SampleDto>(sample);}#endregion
Swagger를 통한 확인
아래 코드를 통해서 유지 시간 조절 가능합니다.
// 모든 캐시에 대해서 구성 변경Configuration.Caching.ConfigureAll(cache =>{ // 캐시 만료 시간을 2시간으로 지정cache.DefaultSlidingExpireTime=TimeSpan.FromHours(2);});//특정 캐시에 대해서만 구성 변경Configuration.Caching.Configure("MyCache", cache =>{ // MyCache 이름을 가지는 캐시의 만료 시간을 8시간으로 지정cache.DefaultSlidingExpireTime=TimeSpan.FromHours(8);});
GetSampleByCache1을 Swagger에서 호출해서 확인할 수 있다.
파라메터를 1로 입력하고 'Execute' 버튼을 누르면 데이터를 가져온다. 이때 가져온 데이터와, 데이터베이스에서 직접 수정하여도 같은 데이터를 가져오면 캐시 기능이 정상적으로 동작하는 것을 확인 할 수 있다. (기본 60분 유지 됨)