캐시 기능을 사용하여 빈번한 참조 데이터를 빠르게 사용할 수 있도록 한다. 기본적으로 Dotnet의 MemoryCache를 통해 구현이 되어 있으며, 다른 캐시 시스템으로도 교체할 수 있습니다.
예제
public class SampleAppController : AppController
{
private readonly ICacheManager _cacheManager;
public SampleAppController(ICacheManager cacheManager)
{
_cacheManager = cacheManager;
}
// 아이템 가져오기
public Item GetItem(int id)
{
//캐시에서 값을 먼저 찾고, 없으면 데이터베이스에서 가져온다.
return _cacheManager
.GetCache<int, Sample>("MySampleCache")
.Get(id, () => "Sample DB value") as Item;
}
}
위 예제에서의 ICacheManager를 삽입하고 MySampleCache라는 캐시를 가져옵니다. 캐시 이름은 대소 문자를 구분하므로 "MyCache"와 "MYCACHE"는 다른 캐시값을 관리하게 됩니다.
엔티티 캐싱
Axs의 캐시 시스템은 일반용이지만 엔티티를 캐시하려는 경우 도움이 될 수 있는 EntityCache 기본 클래스가 있습니다. 데이터베이스에서 반복적으로 쿼리하지 않도록 해당 ID로 엔티티를 가져오고 이를 Id로 캐시하려는 경우 기본 클래스를 사용할 수 있습니다. 다음과 같은 Sample 엔티티가 있다고 가정합니다 :
public class Sample : Entity
{
public string Name { get; set; }
public int Age { get; set; }
}
우리가 Id를 알고 있는 동안 사람들의 이름을 자주 얻고 싶다고 가정 합니다. 먼저 캐시 항목을 저장 할 클래스를 만듭니다.
[AutoMapFrom(typeof(Sample))]
public class SampleCacheItem
{
public string Name { get; set; }
}
필수는 아니지만 캐시 클래스에 대한 인터페이스를 정의 할 수 있습니다.
public interface ISampleCache : IEntityCache<SampleCacheItem>
{
}
마지막으로 Sample 엔터티를 캐시하는 캐시 클래스를 만들 수 있습니다.
public class SampleCache : EntityCache<Sample, SampleCacheItem>, ISampleCache, ITransient
{
public PersonCache(ICacheManager cacheManager, IRepository<Sample> repository)
: base(cacheManager, repository)
{
}
}
이제 사용자 캐시를 사용할 준비가 되었습니다.
사용자의 샘플명이 필요할 때마다 샘플의 Id를 사용하여 캐시에서 가져올 수 있습니다. 다음은 샘플 캐시를 사용하는 예제 클래스입니다.
public class SampleAppController : ITransient
{
private readonly ISampleCache _sampleCache;
public SampleAppController(ISampleCache sampleCache)
{
_sampleCache = sampleCache;
}
public string GetUserSampleById(int id)
{
//_sampleCache.Get(id).Name;
return _sampleCache[id].Name;
}
}
간단히 ISampleCache를 주입(injected)하고 캐시 항목을 얻은 다음 Name 속성을 얻었습니다.
확인
SampleAppController를 통한 확인
SampleAppController.cs 파일에서 GetSampeByCache1, GetSampeByCache2 메서드를 통해 확인 가능하다.
#region ICacheManager 사용
public SampleDto GetSampeByCache(int id)
{
//캐시에서 값을 먼저 찾고, 없으면 데이터베이스에서 가져온다.
var sample = _cacheManager
.GetCache("MySampleCacheName")
.Get<string, Sample>(id.ToString(), () => _sampleRepository.FirstOrDefault(x => x.Id == id));
return ObjectMapper.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);
});
Custom SampleCache 사용을 SampleAppController를 통한 확인
기본 제공된 캐시 매니저 대신에 사용자 정의 캐시를 사용할 수 있다.
기본 클래스 선언
public interface ISampleCache : IEntityCache<SampleCacheItem>
{
}
public class SampleCache : EntityCache<Sample, SampleCacheItem>, ISampleCache, ITransient
{
public SampleCache(ICacheManager cacheManager, IRepository<Sample, int> repository, string cacheName = null)
: base(cacheManager, repository, cacheName)
{
}
}
SampleAppController에서 아래 코드처럼 사용하면 됩니다.
public string GetUserNameById(int id)
{
return _sampleCache[id]?.Name; //또는 _sampleCache.Get(id).Name;
}
Custom SampleCache 클래스 사용을 스웨거에서 확인
/api/services/app/Sample/GetUserNameById을 스웨거를 통해서 호출해서 값을 확인할 수 있습니다.
결과 값
다중 테넌트를 지원하는 Custom SampleCache 사용을 SampleAppController를 통한 확인
SampleCache는 다중 테넌트를 지원하지 않는 클래스로서 다른 테넌트에서도 키만 같으면 같은 값을 가져올 수 있습니다. 그래서 다중 테넌트를 지원하는 캐시를 사용하면 같은 키라도 다른 값으로 리턴이 됩니다.
다중 테넌트를 지원 하는 기본 클래스 선언
public interface ISampleTenantCache : IMultiTenancyEntityCache<SampleCacheItem>
{
}
public class SampleTenantCache : MayHaveTenantEntityCache<Sample, SampleCacheItem>, ISampleTenantCache, ITransient
{
public SampleTenantCache(ICacheManager cacheManager, IUnitOfWorkManager unitOfWorkManager, IRepository<Sample, int> repository, string cacheName = null) : base(cacheManager, unitOfWorkManager, repository, cacheName)
{
}
}
SampleAppController에서 아래 코드처럼 사용하면 됩니다.
public string GetUserNameByIdTenant(int id)
{
return _sampleTenantCache[id]?.Name; //또는 _sampleTenantCache.Get(id).Name;
}
다중 테넌트를 지원하는 Custom SampleCache 클래스 사용을 스웨거에서 확인
GetSampleByCache1을 Swagger에서 호출해서 확인할 수 있다.
파라메터를 1로 입력하고 'Execute' 버튼을 누르면 데이터를 가져온다. 이때 가져온 데이터와, 데이터베이스에서 직접 수정하여도 같은 데이터를 가져오면 캐시 기능이 정상적으로 동작하는 것을 확인 할 수 있다. (기본 60분 유지 됨)