posted by 방랑군 2012. 1. 8. 00:42

출처 :  http://blog.loveciel.kr/23 


 안녕하세요 ^^ 간만에 글을 쓰는 Ciel 입니다.

웹사이트를 구축하고 , 그 사이트를 서비스 하는데 있어서 가장 비용이 많이 드는 작업이 

바로 데이터 바인딩인데 , 반복적인 데이터 바인딩을 피해서, 더 적은 비용으로 

더 빠른 사이트를 운영하기 위해 사용하는 방법이 바로 웹사이트 캐싱입니다.

이번 시간에는 실무에서 사용되는 캐싱 기법중 몇가지를 소개하고자 합니다.


제가 이번에 소개해 드릴 캐싱 전략은 두가지로써, 둘다 실무에 빈번히 쓰이는 기법입니다.




좌측에 보이는 WebRequest는 대규모 사이트에 주로 적합한 방식이지만 , 빈번히 데이타의 내용이 바뀔때는 

그다지 효율적이지 않을수 있습니다.  그에 비해 Cache 를 이용하는방식은 간편하지만 ,  WebRequest 방식보다는

다소 비용이 더 소비 됩니다. 이 두가지 기법을 소개하고 , 두가지의 장단점을 살펴보도록 하겠습니다.





1.WebRequest Stream 을 이용한 캐싱 



첫번째로 소개해 드릴 기법은 WebRequest 객체를 사용해서 캐싱을 구현하는 기법입니다.

이 기법은 데이터 바인딩이 된 페이지의 html 파일을 저장하고 , 기본 호출시에 , 저장된 html 파일을 출력함으로써 , 

반복적인 데이터 바인딩을 피하는 기법입니다.

이 기법은 주로 자료의 양이 많은 포털 사이트등의 메인 페이지에서 널리 사용됩니다.

이 기법을 도식화 하면 다음과 같습니다. 

WebRequest 객체는 HttpRequest 를 수행할 객체를 생성합니다.

그후, 이 객체를 HttpResponse 객체를 이용해 HttpRequest 가 수행된 리턴값을 받아 옵니다.

즉 , Http 통신을 객체를 이용하여 내부적으로 행하는것인데 , 이 방법을 통해서 , 

결과 페이지 Html 을 GetResponseStream()으로 받아와서 저장하면, 모든 준비가 끝난겁니다.^^

다음번 호출부터는 저장된 페이지를 호출함으로써 , 데이터 바인딩을 행하지 않는 완벽한 클론 페이지를 만들수 있게 되는것이죠.

다음은 구현 부분입니다.

설명은 좀 길고 어떻게 보면 난해할수도 있는데(OTL) 코드는 허무하리라 만큼 간단합니다 ^^


1. Request 객체 생성 
2. 생성된 객체로 호출한 결과값 전달받음 
3. 전달받은 객체의 Stream 을 저장


3단계만 기억하면 간단합니다.

그러나 이 기법도 단점이 존재합니다. 웹사이트를 통째로 저장하기 때문에 , ViewState 의 변경상태를 저장하기가 힘들고, 

이는 ASP.NET 의 최대 장점인 ViewState 를 사용하기 힘들다는 헛점으로 이어지게 됩니다.

또,파일 핸들링 자체가 어느정도 비용이 큰 작업이기 때문에 빈번히 파일을 쓸수 없고 , 

이는 일반 게시판 같이 빈번하게 바뀌는 게시물에 대응하기가 힘들다는 단점으로 요약될수 있습니다.

그렇기 때문에 이 기법은, 사용자 게시물이 메인 페이지에 없고  운영자의 취향대로 대문 페이지를 구성해야 하는 

대형 서비스 사이트에 어울리는 기법이라고 할수 있겠습니다.





2. HttpRuntime.Cache


두번째 소개해드릴 기법은 ASP.NET개발을 해보셨다면 누구나 들어보셨을만한 기법인 HttpRuntime.Cache 입니다.

이 객체는 어떠한 닷넷 객체도 캐싱이 가능함으로써 , 상당한 유연함을 지니고 있습니다. 

사용방법도 아주 간단하죠. 그러나 서버자원을 계속해서 사용함으로써, 어느정도 메모리를 

지속적으로 점유해야 하는 리스크를 안고 있습니다.

이 객체를 사용하기에 적합한 예는 , 호출이 빈번하며 , 데이터의 내용이 잘 바뀌지 않는 경우 입니다. 

그리고 만료 시간을 정해줌으로써, 주기적으로 데이터를 가져오거나 , CacheDependency 를 이용해서 Cache를 

Runtime 시에 컨트롤 할수 있습니다. 


다음 코드는 Cache를 이용해서 데이터 테이블을 바인딩 하는 예제를 보여줍니다.


위와 같이 캐쉬를 설정하고 , 캐쉬디펜던시를 설정하게 되면 , 캐쉬디펜던시에 따라서 , 캐쉬가 삭제되게 됩니다.



캐쉬의 장점은 닷넷의 어떠한 객체도 캐싱이 가능하다는점입니다. 

그러나 서버의 리소스를 계속해서 점유하게 되고 , 서비스를 하는 사람 입장에서 , 

이 캐쉬를 지우는것외에 변조가 힘들게 됨으로써 , 이전에 보여드린 WebRequest방식보다는 

다소 유연함이 떨어진다고도 할수 있겠습니다.

 

 

 

마무리.

서비스 하는 사이트가 커짐에 따라 신경써야 할 부분도 많아지고 , 

웹서버의 한계를 극복하기 위한 여러 기법들도 점차로 발전하고 있는 지금 , 

이번에 소개해드린  캐싱 전략은 현재 서비스 하는 사이트의 유지비용을 줄여주는데 

어느정도 힌트가 되어줄수 있다고 생각합니다.

두가지 캐싱기법에 대해 잘 숙지하시고 적재적소에 활용하신다면

사이트 유지에 있어서 큰 이득을 보실수 있을거 같습니다. ^^