개발팁2016. 7. 26. 09:46

C# 어플리케이션, 보통 winform 형태의 어플리케이션에서
캐쉬를 만들고 처리하는 방법이다.

 

캐쉬는 데이터를 저장하고 꺼내쓰기 위해서 사용을 하는데,
데이터를 읽기 위해서 매번, 저장소에서 꺼내오는 것이 아니라,
저장소에서 읽어서 캐쉬에 저장을 해놓고, 캐쉬에서 꺼내쓴다면,
속도 향상과, 저장소에 대한 트래픽을 줄일수 있어 효율적으로 사용이 가능하다.

 

아래와 같은 방법으로 저장소에 대해서 자료를 가져오는 클래스를 정의하여 사용하면,
데이터를 가져다 쓰는 객체는 내부 구조에 상관없이 동일한 인터페이스로 사용할 수 있을것이다.


자료 클래스


- 자료읽기 요청
  1. 캐쉬에서 자료 읽기
     데이터가 없으면, 저장소에서 읽어옴
     캐쉬에 자료 저장
  2. 읽어온 자료 리턴

 

- 자료쓰기 요청
  1. 저장소에 자료 쓰기
  2. 캐쉬 삭제

 


저장소는 외부에서 변경되지 않는다는 보장이 되어야 한다.
외부에서 변경된다면, 캐쉬데이터와 저장소데이터간에 차이가 발생하게 된다.

실제로 Application Cache Object 를 아래와 같이 구현하였다.


 

    // Application 캐쉬 객체
    class AppCacheObject
    {
        private static HttpRuntime _httpRuntime;

        public static Cache Cache
        {
            get
            {
                EnsureHttpRuntime();
                return HttpRuntime.Cache;
            }
        }

        private static void EnsureHttpRuntime()
        {
            if (null == _httpRuntime)
            {
                try
                {
                    Monitor.Enter(typeof(AppCacheObject));
                    if (null == _httpRuntime)
                    {
                        _httpRuntime = new HttpRuntime();
                    }
                }
                finally
                {
                    Monitor.Exit(typeof(AppCacheObject));
                }
            }
        }

    } 

 

Cache 는 System.Web.Caching.Cache 의 객체이며, Get Property 로 사용한다.
System.Web 을 사용하기 때문에, System.Web.HttpRuntime 의 Cache 객체로 생성한다.

 

이는 Cache 객체에 대한 정의이며, 이를 이용하여,
캐쉬를 저장하는 SetCache
캐쉬를 조회하는 GetCache
캐쉬를 삭제하는 RemoveCache

 

여기서 한가지 중요한 것이, 캐쉬종류이다.
Absolute Expiration 과 Sliding Expiration 이라는것이 있다.

 

Absolute Expiration 은 지정된 만료시간이 지나면, 무조건 캐쉬가 삭제되는 것이고,
Sliding Expiration 은 동일하게 지정된 만료시간에 캐쉬가 삭제되지만, GetCache 를 할때마다 자동으로 만료시간이 연장이 된다.

 

일반적으로 로그인 처리를 하여, 로그인정보를 저장할때 Sliding Expiration Cache 를 사용하면,
지정된 시간이 지나면, 자동로그아웃이 되지만, 계속 작업을 한다면 (작업시마다 캐쉬를 사용하여 로그인정보를 확인) 로그인이 풀리지 않게 되는것이다.

 

실제로, AppCacheManager 라는 클래스로,
SetCache / GetCache / RemoveCache 와 슬라이딩 캐쉬를 구현한 것이다.
슬라딩캐쉬는 SetCache 에서만 지정해주면, GetCache / RemoveCache 는 동일하게 사용된다.

 

    // Copyright 헝그리개발자(https://bemeal2.tistory.com)
    // 소스는 자유롭게 사용가능합니다. Copyright 는 삭제하지 마세요.

    // Application 캐쉬
    public class AppCacheManager
    {
        // 인증용 캐쉬 저장 : 슬라이딩 만료 캐쉬 - minute 후에 만료되지만, GetCache 요청이 있으면, 만료시간이 연장됨
        public static bool SetSlidingCache(string name, object value, int minute)
        {
            bool bvalue = true;

            try
            {
                AppCacheObject.Cache.Add(name, value, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(minute), CacheItemPriority.Normal, null);
            }
            catch
            {
                bvalue = false;
            }

            return bvalue;
        }

        // 캐쉬 저장 : 절대 시간 만료 캐쉬 - minute 후에 만료
        public static bool SetCache(string name, object value, int minute)
        {
            bool bvalue = true;

            try
            {
                AppCacheObject.Cache.Add(name, value, null, DateTime.Now.AddMinutes(minute), System.Web.Caching.Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);
            }
            catch
            {
                bvalue = false;
            }

            return bvalue;
        }

        // 캐쉬 get
        public static Object GetCache(string name)
        {
            Object ovalue = new Object();

            try
            {
                ovalue = AppCacheObject.Cache.Get(name);
            }
            catch { }

            return ovalue;
        }

        // 캐쉬 제거
        public static Object RemoveCache(string name)
        {
            Object ovalue = new Object();

            try
            {
                ovalue = AppCacheObject.Cache.Remove(name);
            }
            catch { }

            return ovalue;
        }

    } 

 

 

 

 

이를 이용하여, AppCacheExample 을 실행해보면,
로그인정보를 저장하는 Sliding Cache 와 일반 정보를 저장하는 Absolute Cache 를 사용하고 있다.
각각 캐쉬 만료시간을 1분으로 하여,
GetCache 를 했을때, 만료되는지와 자동연장되는지를 확인할 수 있다.

 

 

 

 

AppCacheExample.zip
다운로드

 

Posted by 헝개