ASP.NET Core MVC의 캐시 태그 도우미

작성자: Peter Kellner

캐시 태그 도우미는 ASP.NET Core 앱의 콘텐츠를 내부 ASP.NET Core 캐시 공급자에 캐시하여 성능을 개선하는 기능을 제공합니다.

태그 도우미에 대한 개요는 ASP.NET Core의 태그 도우미를 참조하세요.

다음 Razor 태그는 현재 날짜를 캐시합니다.

<cache>@DateTime.Now</cache>

이 태그 도우미를 포함하고 있는 페이지에 대한 첫 번째 요청은 현재 날짜를 표시합니다. 추가적인 요청은 캐시가 만료될 때까지(기본값 20분) 또는 캐시된 날짜가 캐시에서 제거될 때까지 캐시된 값을 표시합니다.

캐시 태그 도우미 특성

사용

특성 유형 예제 기본값
부울 true: false true

enabled는 캐시 태그 도우미로 묶인 콘텐츠가 캐시되었는지 확인합니다. 기본값은 true입니다. false로 설정하면 렌더링된 출력이 캐시되지 않습니다.

예시:

<cache enabled="true">
    Current Time Inside Cache Tag Helper: @DateTime.Now
</cache>

expires-on

특성 유형 예시
DateTimeOffset @new DateTime(2025,1,29,17,02,0)

expires-on은 캐시된 항목의 절대 만료 날짜를 설정합니다.

다음 예제는 2025년 1월 29일 오후 5시 2분이 될 때까지 캐시 태그 도우미의 콘텐츠를 캐시합니다.

<cache expires-on="@new DateTime(2025,1,29,17,02,0)">
    Current Time Inside Cache Tag Helper: @DateTime.Now
</cache>

expires-after

특성 유형 예시 기본값
TimeSpan @TimeSpan.FromSeconds(120) 20분

expires-after는 콘텐츠를 캐시할 첫 번째 요청 시간부터 시간 길이를 설정합니다.

예시:

<cache expires-after="@TimeSpan.FromSeconds(120)">
    Current Time Inside Cache Tag Helper: @DateTime.Now
</cache>

Razor 보기 엔진은 기본 expires-after 값을 20분으로 설정합니다.

expires-sliding

특성 유형 예시
TimeSpan @TimeSpan.FromSeconds(60)

캐시 항목 값이 액세스되지 않는 경우 캐시 항목을 제거해야 하는 시간을 설정합니다.

예시:

<cache expires-sliding="@TimeSpan.FromSeconds(60)">
    Current Time Inside Cache Tag Helper: @DateTime.Now
</cache>

vary-by-header

특성 유형 예제
문자열 User-Agent: User-Agent,content-encoding

vary-by-header는 값이 변경될 때 캐시 새로 고침을 트리거할 쉼표로 구분된 헤더 값 목록을 허용합니다.

다음 예제에서는 헤더 값 User-Agent를 모니터링합니다. 이 예제는 웹 서버에 제공된 모든 User-Agent에 대한 콘텐츠를 캐시합니다.

<cache vary-by-header="User-Agent">
    Current Time Inside Cache Tag Helper: @DateTime.Now
</cache>

vary-by-query

특성 유형 예제
문자열 Make: Make,Model

vary-by-query는 나열된 키 값이 변경될 때 캐시 새로 고침을 트리거하는 쿼리 문자열(Query)에 쉼표로 구분된 Keys 목록을 허용합니다.

다음 예제에서는 MakeModel 값을 모니터링합니다. 이 예제는 웹 서버에 제공된 서로 다른 모든 MakeModel마다 콘텐츠를 캐시합니다.

<cache vary-by-query="Make,Model">
    Current Time Inside Cache Tag Helper: @DateTime.Now
</cache>

vary-by-route

특성 유형 예제
문자열 Make: Make,Model

vary-by-route는 경로 데이터 매개 변수 값이 변경될 때 캐시 새로 고침을 트리거할 쉼표로 구분된 경로 매개 변수 이름 목록을 허용합니다.

예시:

:

routes.MapRoute(
    name: "default",
    template: "{controller=Home}/{action=Index}/{Make?}/{Model?}");

:

<cache vary-by-route="Make,Model">
    Current Time Inside Cache Tag Helper: @DateTime.Now
</cache>
특성 유형 예제
문자열 .AspNetCore.Identity.Application: .AspNetCore.Identity.Application,HairColor

vary-by-cookie는 cookie 값이 변경될 때 캐시 새로 고침을 트리거할 쉼표로 구분된 cookie 이름 목록을 허용합니다.

다음 예제는 ASP.NET Core Identity와 연결된 cookie를 모니터링합니다. 사용자가 인증되면 Identitycookie의 변경으로 인해 캐시 새로 고침이 트리거됩니다.

<cache vary-by-cookie=".AspNetCore.Identity.Application">
    Current Time Inside Cache Tag Helper: @DateTime.Now
</cache>

vary-by-user

특성 유형 예제 기본값
부울 true: false true

vary-by-user는 로그인한 사용자(또는 컨텍스트 보안 주체)가 변경되면 캐시를 다시 설정해야 하는지 여부를 지정합니다. 현재 사용자를 요청 컨텍스트 보안 주체라고도 하며 @User.Identity.Name을 참조하여 Razor 보기에서 확인할 수 있습니다.

다음 예에서는 현재 로그인한 사용자를 모니터링하여 캐시 새로 고침을 트리거합니다.

<cache vary-by-user="true">
    Current Time Inside Cache Tag Helper: @DateTime.Now
</cache>

이 특성을 사용하면 로그인 및 로그아웃 주기 동안 콘텐츠를 캐시에 유지합니다. 값이 true로 설정되면 인증 주기가 인증된 사용자에 대한 캐시를 무효화시킵니다. 사용자가 인증될 때 새로운 고유 cookie 값이 생성되므로 캐시가 무효화됩니다. cookie가 없거나 cookie가 만료된 경우 캐시는 익명 상태로 유지됩니다. 사용자가 인증되지 않으면 캐시가 유지됩니다.

vary-by

특성 유형 예시
문자열 @Model

vary-by는 캐시되는 데이터의 사용자 지정을 허용합니다. 특성의 문자열 값에서 참조하는 개체가 변경되면 캐시 태그 도우미의 콘텐츠가 갱신됩니다. 흔히 모델 값들의 문자열 연결을 이 특성에 할당합니다. 사실상 이는 연결된 값들 중 하나를 업데이트하면 캐시가 무효화되는 시나리오로 이어집니다.

다음 예제에서는 보기를 렌더링하는 컨트롤러 메서드가 두 경로 매개 변수 myParam1myParam2의 정수 값을 합산하고, 합계를 단일 모델 속성으로 반환합니다. 이 합계가 변경되면 캐시 태그 도우미의 콘텐츠가 다시 렌더링 및 캐시됩니다.

작업:

public IActionResult Index(string myParam1, string myParam2, string myParam3)
{
    int num1;
    int num2;
    int.TryParse(myParam1, out num1);
    int.TryParse(myParam2, out num2);
    return View(viewName, num1 + num2);
}

:

<cache vary-by="@Model">
    Current Time Inside Cache Tag Helper: @DateTime.Now
</cache>

우선순위

특성 유형 예제 기본값
CacheItemPriority Normal

priority는 기본 제공 캐시 공급자에게 캐시 제거 지침을 제공합니다. 웹 서버는 메모리가 부족할 경우 가장 먼저 Low 캐시 항목을 제거합니다.

예시:

<cache priority="High">
    Current Time Inside Cache Tag Helper: @DateTime.Now
</cache>

priority 특성은 특정 수준의 캐시 보존을 보장하지 않습니다. CacheItemPriority는 권장 사항일 뿐입니다. 이 특성을 NeverRemove로 설정하더라도 캐시된 항목이 항상 보존된다고 보장할 수 없습니다. 자세한 내용은 추가 리소스 섹션의 항목을 참조하세요.

캐시 태그 도우미는 메모리 캐시 서비스에 따라 달라집니다. 서비스가 추가되지 않은 경우 캐시 태그 도우미가 서비스를 추가합니다.

추가 리소스