[.NET Core] 인메모리 캐싱

Repository에서 Cache에 값이 있으면 Cache에서 값을 조회하도록 데코레이터 패턴을 사용하여 코드를 작성한다.

1. 조회 할 모델 작성

public class MyModel
{
   ...
}

2. Repository 인터페이스 작성

public interface IMyModelRepository 
{
    public MyModel GetMyModel(long id);
}

3. Repository 구현체 작성

public class MyModelRepository : IMyModelRepository 
{
    public MyModel GetMyModel(long id) 
    {
        return dbSets.FromSql(..).FirstOrDefault();
    }
}

4. 데코레이터 작성

public class CachedMyModelDecorator : IMyModelRepository
{
    private readonly IMyModelRepository myModelRepository;
    private readonly IMemoryCache cache;
    private MemoryCacheEntryOptions cacheOptions;
    
    public CachedMyModelDecorator(IMyModelRepository myModelRepository, IMemoryCache cache)
    {
        this.myModelRepository = mallRepository;
        this.cache = cache;

        cacheOptions = new MemoryCacheEntryOptions()
            .SetAbsoluteExpiration(TimeSpan.FromDays(1));
    }
    
    public MyModel GetMyModel(long id) 
    {
        var value = cache.Get<MyModel>(id);
        if (value == null)
        {
            value = myModelRepository.GetMyModel(id);
            cache.Set(id, value, cacheOptions);
        }

        return value;
    }
}

5. ASP.NET Core 서비스 등록

서비스에 캐시 사용을 등록하고 각 Repository를 등록한다.

...
    services.AddMemoryCache();
    services.AddScoped<MyModelRepository>();
    services.AddScoped<IMyModelRepository, CachedMyModelDecorator>((provider) => 
    {
        return new CachedMyModelDecorator(provider.GetService<MyModelRepository>(),
            provider.GetService<IMemoryCache>());
    });
...

6. Decorator를 주입 받아 사용.