ASP.NET 페이지의 부분 캐싱
업데이트: 2007년 11월
일부 경우에는 각 요청에 대해 페이지의 일부를 변경해야 하기 때문에 전체 페이지를 캐시하는 것은 비 실용적인 경우가 있습니다. 이러한 경우에는 페이지의 일부만 캐시할 수 있습니다. 이를 위해서는 컨트롤 캐싱과 캐시 후 대체의 두 가지 옵션이 있습니다.
부분 캐싱으로도 알려진 컨트롤 캐싱을 사용하면 캐시된 콘텐츠를 포함하도록 사용자 정의 컨트롤을 만든 다음 사용자 정의 컨트롤을 캐시할 수 있도록 만들어서 페이지 출력의 일부를 캐시할 수 있습니다. 이렇게 하면 전체 페이지를 다시 만들 때마다 페이지의 특정 콘텐츠를 캐시할 수 있습니다. 예를 들어 주식 정보와 같이 주로 동적 콘텐츠를 표시하지만 주간 요약과 같이 정적인 섹션도 있는 페이지를 만드는 경우 사용자 정의 컨트롤에 정적 섹션을 만들어 해당 사용자 정의 컨트롤이 캐시되도록 구성할 수 있습니다.
캐시 후 대체는 이와 반대입니다. 페이지가 캐시되지만 페이지 내의 일부가 동적이어서 캐시되어서는 안 됩니다. 예를 들어 뉴스 기사 페이지와 같이 설정된 기간 동안 완전히 정적인 페이지를 만드는 경우 전체 페이지를 캐시하도록 설정할 수 있습니다. 하지만 회전하는 광고 배너가 추가된 페이지를 캐시하면 페이지를 새로 요청하더라도 광고가 다른 광고로 변경되지 않을 것입니다. 하지만 캐시 후 대체를 사용하면 페이지를 캐시하지만 특정 부분을 캐시할 수 없도록 표시할 수 있습니다. 예제에서는 광고 배너를 캐시할 수 없음으로 표시합니다. 그러면 광고 배너가 각 페이지 요청에 대해 동적으로 만들어진 다음 캐시된 페이지 출력에 추가됩니다. 캐시 후 대체에 대한 자세한 내용은 캐시된 페이지의 일부를 동적으로 업데이트를 참조하십시오.
컨트롤 캐싱
콘텐츠를 캐시하기 위해 사용자 정의 컨트롤을 만들면 항목을 만드는 데 프로세서 시간을 소요하는 페이지 부분(예: 데이터베이스 쿼리)을 페이지의 다른 부분과 구분할 수 있습니다. 서버 리소스가 거의 필요하지 않은 페이지 부분은 각 요청에 대해 동적으로 생성할 수 있습니다.
캐시할 페이지 부분을 식별하고 이러한 각 부분을 포함하는 사용자 정의 컨트롤을 만들었다면 사용자 정의 컨트롤에 대한 캐싱 정책을 결정해야 합니다. 이러한 정책은 @ OutputCache 지시문을 사용하거나 사용자 정의 컨트롤에 대한 코드에서 PartialCachingAttribute 클래스를 사용하여 선언적으로 설정할 수 있습니다.
예를 들어 다음 지시문을 사용자 정의 컨트롤 파일(.ascx 파일)의 맨 위에 포함시키면 컨트롤 버전이 출력 캐시에 120초간 저장됩니다.
<%@ OutputCache Duration="120" VaryByParam="None" %>
코드에서 캐싱 매개 변수를 설정하려면 사용자 정의 컨트롤의 클래스 선언에서 특성을 사용할 수 있습니다. 예를 들어 클래스 선언의 메타 데이터에서 다음 특성을 포함시키면 출력 캐시의 콘텐츠 버전이 120초간 저장됩니다.
[PartialCaching(120)]
public partial class CachedControl : System.Web.UI.UserControl
{
// Class Code
}
<PartialCaching(120)> _
Partial Class CachedControl
Inherits System.Web.UI.UserControl
' Class Code
End Class
페이지 출력에 설정할 수 있는 특성에 대한 자세한 내용은 @ OutputCache 항목을 참조하십시오. 사용자 정의 컨트롤 개발 방법에 대한 자세한 내용은 ASP.NET 웹 서버 컨트롤 개요를 참조하십시오.
참고: |
---|
페이지에서 사용자 정의 컨트롤을 중첩할 수 있으므로 출력 캐시에 배치된 사용자 정의 컨트롤을 중첩할 수도 있습니다. 페이지와 중첩된 사용자 정의 컨트롤에 대해 서로 다른 캐시 설정을 지정할 수 있습니다. |
캐시된 사용자 정의 컨트롤을 프로그래밍 방식으로 참조
캐시할 수 있는 사용자 정의 컨트롤을 선언적으로 만들 때는 사용자 정의 컨트롤의 인스턴스를 프로그래밍 방식으로 참조할 수 있도록 ID 특성을 포함시킬 수 있습니다. 하지만 코드에서 사용자 정의 컨트롤을 참조하기 전에 출력 캐시에 사용자 정의 컨트롤이 있는지 확인해야 합니다. 캐시된 사용자 정의 컨트롤은 첫 번째 요청에 대해서만 동적으로 생성됩니다. 이후의 요청은 지정된 시간이 만료될 때까지 출력 캐시로부터 충족됩니다. 사용자 정의 컨트롤이 인스턴스화된 것을 확인한 후 포함하는 페이지에서 사용자 정의 컨트롤을 프로그래밍 방식으로 조작할 수 있습니다. 예를 들어 사용자 정의 컨트롤에 SampleUserControl의 ID를 선언적으로 할당하면 다음 코드를 사용하여 해당 컨트롤이 있는지 확인할 수 있습니다.
protected void Page_Load(object sender, EventArgs e)
{
if (SampleUserControl != null)
// Place code manipulating SampleUserControl here.
}
Protected Sub Page_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
If SampleUserControl <> Nothing Then
' Place code manipulating SampleUserControl here.
End If
End Sub
페이지 및 사용자 정의 컨트롤을 다른 기간으로 캐싱
페이지 및 페이지의 사용자 정의 컨트롤에 대해 출력 캐싱 기간 값을 다르게 설정할 수 있습니다. 페이지 출력 캐싱 기간이 사용자 정의 컨트롤의 출력 캐싱 기간보다 긴 경우 페이지 출력 캐싱 기간이 우선합니다. 예를 들어 페이지 출력 캐싱을 100초로 설정하고 사용자 정의 컨트롤 출력 캐싱을 50초로 설정하면 사용자 정의 컨트롤이 짧게 설정되었더라도 사용자 정의 컨트롤을 포함하여 전체 페이지가 출력 캐시에 100초 동안 저장됩니다.
다음 코드 예제에서는 사용자 정의 컨트롤보다 페이지의 캐시 기간이 더 긴 경우의 효과를 보여 줍니다. 페이지는 100초 동안 캐시되도록 구성됩니다.
<%@ Page language="C#" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc01.ascx" %>
<%@ OutputCache duration="100" varybyparam="none" %>
<SampleControl:Time /><br /> <br /> <br />
This page was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString();
Response.Write(t); %>
<%@ Page language="VB" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc01.ascx" %>
<%@ OutputCache duration="100" varybyparam="none" %>
<SampleControl:Time /><br /> <br /> <br />
This page was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>
다음 코드 예제에서는 페이지에 포함된 사용자 정의 컨트롤을 보여 줍니다. 컨트롤에 대한 캐싱 기간은 50초로 설정됩니다.
<% @Control language="C#" %>
<% @OutputCache duration="50" varybyparam="none" %>
This user control was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString();
Response.Write(t); %>
<% @Control language="VB" %>
<% @OutputCache duration="50" varybyparam="none" %>
This user control was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>
페이지 출력 캐싱 기간이 사용자 정의 컨트롤 출력 캐싱 기간보다 짧을 경우 페이지의 나머지 부분이 요청에 따라 다시 생성되더라도 사용자 정의 컨트롤은 기간이 만료될 때까지 캐시됩니다. 예를 들어 페이지 출력 캐싱을 50초로 설정하고 사용자 정의 컨트롤 출력 캐싱을 100초로 설정하면 사용자 정의 컨트롤은 페이지의 나머지 부분이 두 번씩 만료될 때마다 한 번씩 만료됩니다.
다음 코드에서는 페이지의 출력 캐싱 기간 보다 캐싱 기간이 긴 사용자 정의 컨트롤이 포함된 페이지의 태그를 보여 줍니다. 페이지는 50초 동안 캐시되도록 구성됩니다.
<%@ Page language="C#" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc2.ascx" %>
<%@ OutputCache duration="50" varybyparam="none" %>
<SampleControl:Time /><br /> <br /> <br />
This page was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString();
Response.Write(t); %>
<%@ Page language="VB" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="Uc2.ascx" %>
<%@ OutputCache duration="50" varybyparam="none" %>
<SampleControl:Time /><br /> <br /> <br />
This page was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>
다음 코드에서는 페이지에 포함된 사용자 정의 컨트롤을 보여 줍니다. 컨트롤에 대한 캐싱 기간은 100초로 설정됩니다.
<% @Control language="C#" %>
<% @OutputCache duration="100" varybyparam="none" %>
This user control was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString();
Response.Write(t); %>
<% @Control language="VB" %>
<% @OutputCache duration="100" varybyparam="none" %>
This user control was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>