posted by 방랑군 2009. 9. 15. 13:26

 역시 궁금한거 해 놓으신 게 있어서...

감사...

 읽는 건 역시 나주에 ^^;;

참조 : http://blog.naver.com/kkwangjjang/100065860275


ASP.NET에서는 페이지를 cache할수 있는 기능이 있다는 사실은 모두 알것이다.

갑자기 궁금해졌다.

이 cache가 어떻게 동작하는지...

그래서 Test를  해보기로 했따.

 

OUtputCache 지시자를 쓰면 해당 페이지가 모두 Doration 만큼 캐쉬되어 져있다가 그 이후에 한번 refresh 되어진다.

이때, cache에서 제외될 부분만 Substitution Control로 처리하면 해당 부분만 cache되지 않고 페이지에 접근할 떄 마다 새롭게 갱신된다.

 

페이지 이벤트를 모두 걸고 실행해보았다.

캐쉬되어 있는 동안에는 새로고침을 해도 OnPreInit, OnInit, OnPreLoad, OnLoad, OnPreRender 이벤트 모두 일어나지 않았다.

캐쉬가 만료될때만 해당 이벤트들이 모두 실행되고 있었다.

Substitution 컨트롤의 callback Method로 지정된 놈만 계속 실행되고 있었다.

파란 부분이 Substitution 컨트롤 부분이다. 이부분만 캐쉬되지 않고 매번 갱신 되어진다.

눈으로 바뀌는것을 확인하기 위해 각 이벤트에 날짜를 프리트 하도록 해보았다. 파란 부분만 갱신되고 있음이 확인된다.

그렇다면 웹의 메인페이지 같은곳에서도 위와 같은 기능을 사용하면 되겠구나 싶어졌다.

 

UserControl을 이용해서 웹페이지를 조각해서 해당 UserContorl만 cache를 해주면 되지 않을까..싶은 마음에 UserContorl조각들을 만들고

한개의 페이지에서 그 조각들을 가져다가 써보기로 결심했다.!

 

A, B를 C에서 가져가다 쓰는 test를 해보았다. 여러가지 case로 해보기로 했다.

aspx페이지에는 서버코드가 존재하지 않고 cs페이지의 pageLoad이벤트에서 현재 시간을 찍는 test를 했다.

 

첫번째

A, B, C모두 캐쉬모드로 선언한다.

A, B의 Duration 을 C의 Duration 보다 작게 준다.

A, B의 Duration 과 관계없이 C의 duration 에 따라 동작한다. 즉, A,B가 10초마다 갱신되도록 설정이 되어 있다고 해도 C가 15초마다 갱신되도록 설정되어 있다면, A.B도 15초마다 갱신되는 것이다.

 

두번째

A, B, C모두 캐쉬모드로 선언한다.

A, B의 Duration 을 C의 Duration 보다 크게 준다.

이때 이상한 현상이 발생하게 된다. 화면에서 A,B가 나타나지 않는 시간이 있게된다.

 

처음엔 이해 할수없는 현상이였다.ㅜㅜ

그러나 사용자 컨트롤이 없이 test했을때가 떠올랐다.

일단 캐쉬가적용되면 해당 시간동안은 Page 및 UserControl의 이벤트가 발생하지 않는다.

그런데 test코드는 onLoad 이벤트에 존재한다. 캐쉬가 적용된 기간을 살펴보자.

C(A, B를 담고 있는 page)의 기간이 A,B의 캐쉬기간보다 짧다. 따라서 C가 갱신되어도, A,B의 캐쉬 만료기간이 되지 않아서, A,B의 내부 이벤트가일어나지 않게 되는것.

따라서 해당 이벤트에서 일어나고있는 액션은 일어나지 않는다. 그리고 C는 캐쉬가 만료되어서 새로 페이지 이벤트를 일으킨다.

그사이에 시간에는 C는 A,B를 담아서 그려내었던 캐쉬가 만료되어서 페이지에 A,B에 관한 내용을 그려낼수없는것이다. (아 참으로 오묘하도다!!!)

그런데 이해 할 수 없는 부분이 있다. aspx 페이지에 onLoad event에 있던 서버코드를 코딩하면 잘나온다. (사실 이부분을 아직 잘 이해 못하겠다ㅡ.ㅡa)

aspx 페이지에 서버코드를 넣지 않고, 저렇게 쓰려면...UserControl의 어떤 이벤트에 매칭을 시켜야 하는것일까..ㅜㅜ

 

세번째

A, B 만 캐쉬모드로 선언한다.

C는 캐쉬모드로 선언하지 않는다.

이렇게 되면, 처음 페이지를 로드할때는 A,B,C가 모두 실행된다. 그렇지만 다시 페이지를 로드하게되면 C만 실행된다.

(A,B는 캐쉬모드로 선언되어져 있으므로, 페이지 이벤트가 발생하지 않는다!!!)

이렇게 되면 A,B 의 캐쉬가 만료되는 시간에만 잠깐씩 A,B의 내용을 볼수있고, 나머지 시간에는 볼수없게 되는것이다.

C는 캐쉬모드가 아니므로!

 

기억해야 할것은..

반드시 페이지에서 캐쉬모드로 선언된 사용자 컨트롤을 사용할 경우, 그 페이지를 캐쉬모드로 선언해야 한다는 것이다!

세번째 같은 오류를 줄이기 위해서라면..!!

[출처] ASP.NET 페이지 CacheTest|작성자 꽝짱

'IT > 기본에충실' 카테고리의 다른 글

Serialize  (0) 2009.10.06
값, 참조 타입  (0) 2009.09.30
[C#] pdb 파일  (0) 2009.09.15
[ASP.NET] Transfer, Redirect, Excute..  (0) 2009.09.15
기본... 여기는...  (0) 2009.09.15