/// <summary>
        /// Header에 ContentType, Cache 설정을 수행합니다.
        /// </summary>
        /// <param name="context"></param>
        /// <param name="filename"></param>
        private static void SetRepsonseHeaders(HttpContext context, string filename)
        {
            context.Response.Clear();
            context.Response.ContentType = WebTool.GetMime(filename);

            context.Response.Cache.SetExpires(DateTime.Now.ToUniversalTime().AddYears(1));
            context.Response.Cache.SetMaxAge(new TimeSpan(365, 0, 0, 0));

            // NOTE : HTTPS 에서 동작하기 위해
            context.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
            context.Response.Cache.SetCacheability(HttpCacheability.Public);
        }
        /// <summary>
        /// HttpHandler의 작업의 메인 메소드입니다. 재정의 하여 원하는 기능을 수행하되, 제일 첫번째에 부모 클래스의 메소들를 호출해주어야 합니다.
        /// </summary>
        /// <param name="context"></param>
        protected override void DoProcessRequest(HttpContext context)
        {
            base.DoProcessRequest(context);

            if (IsDebugEnabled)
            {
                log.Debug("정적 파일 (Static File) 요청 처리를 시작합니다...");
            }

            ParseRequestParams(context);

            // file not found!!!
            var physicalPath = context.Server.MapPath(WebTool.GetScriptPath(_virtualPath));

            if (physicalPath.FileExists() == false)
            {
                ResponseFileNotFound(context, _virtualPath);
                // context.Response.End();
                return;
            }

            // if requested file already exist in cache, send file from cache
            //
            if (WriteFromCache(context, _cacheKey, CacheDuration, CompressionKind) == false)
            {
                _contentType = WebTool.GetMime(physicalPath);

                var readTask = ReadFile(context, physicalPath);

                _isCompressed = CanCompression;

                var fileExt = physicalPath.ExtractFileExt();

                // 이미지 파일이거나, 압축이 필요없는 파일은 압축하지 않습니다.
                if (_contentType.Contains("image") || WebTool.NoCompressionFileExtensions.Any(fileExt.Contains))
                {
                    if (IsDebugEnabled)
                    {
                        log.Debug("이미지 파일등 이미 압축된 상태의 파일은 압축하지 않습니다.... physicalFile=[{0}]", physicalPath);
                    }

                    _isCompressed = false;
                }

                byte[] readBytes = readTask.Result;

                if (_isCompressed && readBytes.Length < CompressionThreshold)
                {
                    if (IsDebugEnabled)
                    {
                        log.Debug("전송할 데이타의 크기가 기본 Threadhold [{0}] bytes 보다 작아 압축을 하지 않습니다. Content-Length=[{1}] bytes",
                                  CompressionThreshold, readBytes.Length);
                    }
                    _isCompressed = false;
                }

                // 결론적으로 압축이 필요하다면 압축을 합니다.
                //
                if (_isCompressed)
                {
                    readBytes = Compressor.Compress(readBytes);
                }

                var cacheItem = new CacheItem(readBytes, _isCompressed, _contentType);

                SaveToCache(context, _cacheKey, cacheItem, CacheDuration);
                WriteBytes(context, cacheItem, CacheDuration, CompressionKind);
            }

            // context.Response.End();

            if (IsDebugEnabled)
            {
                log.Debug("정적 파일 (Static File) 요청 처리를 완료했습니다!!! file=[{0}]", _virtualPath);
            }
        }