Axs Document
  • AXS Framework
  • 1. Common structures
    • 의존성 관계 설정 - Dependency Injection
    • 캐싱 - Caching
    • 로깅 - Logging
    • 세션 - Session
    • 다중 테넌트 - Multi Tenancy
    • 모듈 시스템 - Module System
    • 객체 매핑 - Object To Object Mapping
    • 메일 연동 - Mail System
  • 2. Domain Layer
    • 엔티티 - Entities
    • 저장소 - Repositories
    • 도메인 서비스 - Domain Services
    • 작업 단위 - Unit Of Work
  • 3. Application Layer
    • 애플리케이션 컨트롤러 - Application Controller
    • DTO - Data Transfer Objects
    • DTO 객체의 유효성 체크 - Validating Data Transfer Objects
    • 인증 - Authorization
    • 감사 로그 - Audit Logging
    • 엔티티 기록 - Entity History
  • 4. Object Relational Mapping
    • EntityFramework 통합
    • Dapper 통합
  • 5. Background Services
    • 백그라운드 작업과 워커
  • 6. Presentation Layer
    • 에러 핸들링
Powered by GitBook
On this page
  1. 1. Common structures

캐싱 - Caching

Previous의존성 관계 설정 - Dependency InjectionNext로깅 - Logging

Last updated 1 year ago

Caching

설명

캐시 기능을 사용하여 빈번한 참조 데이터를 빠르게 사용할 수 있도록 한다. 기본적으로 Dotnet의 를 통해 구현이 되어 있으며, 다른 캐시 시스템으로도 교체할 수 있습니다.

예제

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; 
    }
}

확인

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 클래스 사용을 스웨거에서 확인

간단히 ISampleCache를 주입()하고 캐시 항목을 얻은 다음 Name 속성을 얻었습니다.

GetSampleByCache1을 Swagger에서 호출해서 확인할 수 있다. 파라메터를 1로 입력하고 'Execute' 버튼을 누르면 데이터를 가져온다. 이때 가져온 데이터와, 데이터베이스에서 직접 수정하여도 같은 데이터를 가져오면 캐시 기능이 정상적으로 동작하는 것을 확인 할 수 있다. (기본 60분 유지 됨)

injected
MemoryCache
Memory Caching
picture 5
picture 7
picture 8
picture 9
picture 10
picture 13