본문 바로가기
[개발] 이야기

Cache ASP.NET에서 쉽게 웹페이지 캐싱을 적용해 보자

by 헤이나우
반응형

캐싱을 설명하기 전에 캐쉬란 무엇일까요.

캐쉬는 CPU로 부터의 입출력 속도를 빠르게 하기 위해서(CPU는 다른 저장소보다 몇배의 빠른 속도를 갖고 있습니다.) 임시 저장소를 두어 입출력 속도를 빠르게 하는 것인데 웹에서 이러한 캐쉬 기능을 쓸수 있습니다. 자주 쓰이는 웹 데이터를 하드디스크에 두어 반복적인 데이터의 입출력 속도를 향샹 시킬 수 있습니다.

   

즉, 사용자가 데이터 요청시 데이터 처리 과정(속도 저하와 부하를 유발하는 여러가지 데이터 처리 프로세스 및 데이터 연동 작업)없이 바로 사용할 수 있게 하는 것.

   

출력 캐싱과 데이터 캐싱에 대해 알아 보겠습니다.

   

출력캐싱

출력 캐싱이란 페이지 처리 결과를 출력 캐시에 저장하는 캐싱 기법입니다.

   

먼저 사용자가 웹페이지를 요청했을때 ASP.NET의 반환 과정을 알아 보겠습니다/

최초 요청시.

사용자가 페이지를 최초 요청하게 되면 파서(Parser)에 의해서 .aspx페이지 구문을 분석하는 파싱(Parsing)작업이 일어나고 컴파일러에 의해 개발자의 코드를 중간언어(IL, Intermediate Language)로 만드는 컴파일 작업이 일어 납니다. 생성된 중간 언어는 어셈블리 캐시(Assembly Cache)라는 곳에 저장되며 메모리에 올려진 중간 언어는 CLR(Common Language Runtime, 공용언어 런타임)에 의해 실행된 후 그 결과가 사용자에게 웹 페이지 형식으로 렌더링 됩니다.

   

정리하자면 사용자 요청->Parser에 의해 aspx분석->컴파일러에 의해 IL생성->Assembly Cache에 저장->CLR에 의해 실행된 결과가 다시 사용자에게 반환.

   

최초 요청후 다시 요청 시

Paser와 컴파일러의 작업이 제외 되고 Assembly Cache에있는 중간언어를 CLR에 의해 반환됩니다.

   

출력 캐싱를 사용 시

모든 과정이 무시되고 사용자는 출력 캐시에 저장된 내용을 바로 사용자에게 서비스 합니다. 이처럼 출력 캐싱을 사용하면 페이지 처리 과정을 모두 생략할 수 있기 때문에 그만큼 웹사이트의 성능을 높일 수 있습니다.

   

출력 캐싱은 전체 페이지 캐싱, 데이터 캐싱으로 나뉠 수 있는데 먼저 전체 페이지 캐싱에 대해서 알아 보겠습니다.

   

   


WinForm 상단에 페이지만 아래에 위와 같은 구문을 삽입합니다. OutputCache는 캐싱을 하겠다는 의미고 Duration은 캐싱을 몇초간 할것인지 초 단위로 나오게 됩니다. VaryByParam에 입력된 변수의 값에 따라서 전체 페이지 캐싱이 각각 이루어 지게 합니다.

   

   

   

윈폼에 라벨을 삽입하고 페이지 로드시 현재 시간을 출력하게 했습니다. 아무리 F5를 눌러도 10초가 지나지 않으면 시간이 변하지 않은 것을 알 수 있습니다.

   

부분 캐싱 사용하기.

부분 캐싱은 두 가지 종류가 있는데 첫 번째는, 전체 페이지를 캐싱에 사용하고 부분적인 곳만 동적으로 사용하는 것과, 전체페이지를 동적으로 사용하고 부분적으로 동적으로 사용하는 것이 있습니다.

   

전체페이지를 동적 페이지로 구성하고 부분적으로 캐싱사용하기.

부분캐싱을 사요하기 위해서는 일단 사용자 저정의 컨트롤을 사용하고 아래와 같이 코드를 추가합니다.

   

코드 레벨

   

   

그리고 aspx페이지에 사용자 정의 컨트롤을 추가 합니다.

   

코드 레벨은 label1에 로드된 시간을 캐싱 페이지와 동일하게 label1에 추가 합니다.

   

결과

   

   

   

F5를 눌르면 사용자 정의 컨트롤 시간은 10초 단위로 갱신 되지만 전체 페이지는 동적으로 로딩이 된다는 것을 확인 할 수 있다.

   

캐시후 대체 기능

Substitution 컨트롤을 사용하여 선언적으로 구현

Substitution API를 사용하여 프로그래밍 방식으로 구현

AdRotator컨트롤을 사용하여 암시적으로 구현

AdRotator컨트롤은 캐시 후 대체 기능이 내부적으로 이미 구현되어 있기 때문에 부모 페이지의 캐싱 여부에 관계없이 각 요청에 대해 고유한 광고를 렌더링 하며, 개발자가 특별히 캐시 후 대체 기능을 위해 설정해야 할 사항은 없습니다.

   

Subsitution컨트롤을 사용해서 캐시 후 대체 기능 구현을 알아 보겠습니다.

선언부에 캐싱 사용 코드를 넣어 줍니다.

   

Subsitution 컨트롤을 넣어 줍니다

   

   

Method를 구현해야 하는데 메서드 이름은 GetCurrentDate로 하겠습니다.

   

주의 할 점이 있는데 Substitution의 메서드를 구현할 때는 꼭 static으로 선언해야 됩니다. 페이지 로딩시 static으로 선언하지 않을시 메서드를 찾지 못합니다.

   

결과를 보시면 전체 페이지는 캐싱이지만 Substitution컨트롤만 동적으로 구성된 것을 확인 할 수 있습니다.

   

데이터 캐싱

데이터 캐싱은 사용자가 생성한 데이터 자체를 저장하는 캐싱 기법이며 응용 프로그램 캐싱이라고도 합니다. 데이터 캐시에 저장된 데이터는 웹 사이트 전체에서 사용될 수 있습니다. 데이터 캐싱은 다음과 같은 방법으로 이루어 집니다.

   

Cache["Name"] = myName; myName을 데이터 캐시에 저장합니다.

MyName = Cache["Name"]; 데이터 캐시에 저장된 내용을 참조합니다.

   

데이터 캐시의 중요한 것은 필요할대 언제든 참조 가능하다는 것 입니다.
 

예제

   

   

우선 텍스트박스 1개와 버튼 2개를 생성하여 텍스트 박스에 쓴 글자를 캐시에 저장하고 페이지를 이동하여 저장된 캐시를 사용해 보겠습니다.

위와 같이 디자인 하시고 아래와 같이 코드를 적어 줍니다.

   

   

버튼 2개에 클릭 이벤트를 잡은 다음에 데이터 캐시 사용하기 버튼은 Cache를 이용해 Data인덱서에 TextBox의 내용을 입력 합니다. 페이지 이동 버튼은 저장된 캐시의 내용을 출력할 페이지로 이동 합니다.

   

CacheOutPut.aspx의 디자인을 다음과 같이 하고 데이터 캐시 사용하기 버튼에 클릭 이벤트를 잡습니다.

   

클릭 이벤트의 코드를 다음과 같이 입력합니다

   

결과

   

아무 글씨나 적은 다음에 데이터 캐시 사용하기 버튼을 클릭 합니다. 그리고 페이지 이동으로 페이지를 이동 시킵니다.

   

   

   

데이터 캐시 사용하기 버튼을 클릭하면 저장된 캐시가 출력 되는 것을 확인 할 수 있습니다.

   

캐시 프로필

캐시 프로필을 사용하면 응용 프로그램의 Web.Config파일에 캐시 설정을 만든 다음 개별 페이지에서 이러한 설정을 참조 할 수 있습니다. 이렇게 하면 한번에 여러 페이지에서 캐시 설정을 적용할 수 있으므로 캐시 설정을 일괄적으로 수정해야 할 경우 매우 유용하게 사용할 수 있습니다.

   

Web.Config에 다음과 같은 내용을 입력 합니다.

   

이제 다음과 같은 구문을 이용해서 어느 페이지에서든지 미리 셋팅해 놓은 캐시 프로필을 이용할 수 있습니다.

   

   

   

SQL Cache Dependency

SQL 캐시 종속성은 캐시를 SQL Server데이터베이스의 테이블에 종속 시키는 기능을 말 합니다. 그러므로 테이블에 특정 변화(Insert, Update, Delete)가 발생하면 종속성이 지정된 캐시는 자동으로 무효화(Invalidation)되고 다시 새로운 캐시를 구성합니다. 자주 조회되고 추가되는 내용은 오히려 해가 되며 그 내용이 자주 바뀌지 않는 데이터에 지정하게 되면 속도 향상을 할 수 있습니다.

   

aspnet_regsql.exe도구를 통해 SQL캐시 종속성을 사용하도록 데이터베이스와 테이블을 설정 합니다.

SQL캐시 종속성을 사용하기 위해 Web.config파일에 관련 요소와 특성을 선언합니다.

@OutputCache지시문의 SqlDependency특성을 지정합니다.

   

예제

우선 데이터 베이스에 테스트용 테이블을 만듭니다.

   

   

총 3개의 열을 가지고 있고 간단하게 입력 시간과 캐쉬 연습 테이블입니다. 라는 content를 입력합니다.

   

   

간단하게 그리드뷰와 SqlDataSource를 이용해 데이터를 바인딩 한 후에

결과를 확인해 보겠습니다.

   

데이터의 결과가 브라우져에 잘 뜨네요~

   

INSERT문을 이용해서 데이터베이스에 입력을 하면 브라우져에 바로 데이터가 뜨는것을 확인 할 수 있습니다. 이는 브라우져가 새로고침 할 시에 데이터베이스에 접근을 하여 항상 데이터를 조회하여 출력하는 형태로 시스템에 부담을 줄 수 있습니다. 잘 사용하지 않는 데이터 경우에는 SQL server캐쉬를 이용해서 데이터의 접근 빈드를 낮쳐줄 수 있습니다.

   

우선 SQL 캐시 종속성을 이용하려면 비쥬얼 명령 프롬프트를 실행하여 다음과 같은 설정을 합니다.

   

   

SQL 캐시 종속성을 사용하도록 데이터베이스 설정을 바꿔준 후 사용할 테이블을 추가 시킵니다.

   

   

web.config에 위와 같은 caching을 추가 해 줍니다. connectionStringName은 SqlDataSource name속성과 동일해야 합니다.

pollTime 특성은 SQL캐시 종속성을 지정한 테이블에 변화가 발생했는지를 조사(poll)하는 시간 간격(Interval)을 millisecond로 지정합니다. 기본값은 60000이며 이는 1분입니다. 시간간격을 잘 조절하는 것이 아주 중요하겠죠! 많은 시행착오를 하면서 적당한 시간을 찾아 주는 것이 중요하다고 생각합니다.

   

Page지시문 하단에 위와 같은 OuputCache를 추가 해줍니다. 이제 모든 설정이 끝났습니다.

   

실행해 보면 Insert문을 이용하여 데이터를 삽입해도 일정시간 동안 캐쉬된 데이터만 출력 하는 것을 확인할 수 있습니다.

이상으로 캐싱 포스트를 마치겠습니다.

 

반응형

댓글