0Pricing
C# Academy · 강의

캐시 정책과 무효화

캐시 수명과 태그를 제어합니다.

캐시 정책과 무효화은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

이름이 지정된 정책

모든 엔드포인트에서 캐시 설정을 반복하는 대신, 재사용 가능한 이름이 지정된 정책을 한 번 정의하고 이름으로 참조합니다.

builder.Services.AddOutputCache(options =>
{
    options.AddPolicy("Short", policy =>
        policy.Expire(TimeSpan.FromSeconds(10)));
    options.AddPolicy("Long", policy =>
        policy.Expire(TimeSpan.FromMinutes(10)));
});

이름이 지정된 정책 적용하기

엔드포인트를 캐싱할 때 정책의 이름으로 해당 정책을 참조합니다.

app.MapGet("/catalog", GetCatalog)
   .CacheOutput("Long");

캐시 태그

태그는 관련 캐시 항목을 그룹화하므로 함께 무효화할 수 있습니다. 정책에서 Tag를 사용하여 엔드포인트에 태그를 지정합니다.

app.MapGet("/products", GetProducts)
   .CacheOutput(policy => policy
        .Expire(TimeSpan.FromMinutes(5))
        .Tag("products"));

출력 캐시 저장소 인터페이스

무효화는 IOutputCacheStore를 통해 수행됩니다. 이를 주입하고 EvictByTagAsync를 호출하여 해당 태그가 붙은 모든 항목을 삭제합니다.

app.MapPost("/products", async (
    Product p, AppDb db, IOutputCacheStore cache, CancellationToken ct) =>
{
    db.Products.Add(p);
    await db.SaveChangesAsync(ct);
    await cache.EvictByTagAsync("products", ct);
    return Results.Created($"/products/{p.Id}", p);
});

쓰기 작업에서 무효화하는 이유

기본 데이터가 변경되는 순간 캐시된 목록은 오래된 데이터가 됩니다. 생성, 수정 또는 삭제가 발생할 때마다 관련 태그를 삭제하면 만료를 기다리지 않고 읽기 결과를 최신 상태로 유지할 수 있습니다.

// After any mutation:
await cache.EvictByTagAsync("products", ct);

리소스별 태그 지정

더 세밀한 단위로 태그를 지정하여 전체 컬렉션이 아니라 특정 항목의 캐시된 응답만 삭제합니다.

app.MapGet("/products/{id}", GetProduct)
   .CacheOutput(policy => policy.Tag("products"));
// Evict the single item's detail + the list together
await cache.EvictByTagAsync("products", ct);

정책에서 Vary-By 사용하기

완전한 캐싱 계약을 구성하려면 하나의 이름이 지정된 정책에서 만료, 태그 및 Vary-By 규칙을 결합합니다.

options.AddPolicy("ProductList", policy => policy
    .Expire(TimeSpan.FromMinutes(5))
    .Tag("products")
    .SetVaryByQuery("page", "size"));

사용자 지정 Vary-By 값

VaryByValue를 사용하면 요청에서 확인한 테넌트 식별자처럼 임의의 요청 데이터를 기준으로 캐시 키를 만들 수 있습니다.

policy.VaryByValue(context =>
    new KeyValuePair<string, string>(
        "tenant",
        context.Request.Headers["X-Tenant"].ToString()));

삭제와 만료 비교

항목이 캐시에서 제거되는 방법은 두 가지입니다.

  • 만료: Expire를 통한 시간 기반의 자동 제거입니다.
  • 삭제: 데이터가 변경될 때 EvictByTagAsync를 통한 명시적 제거입니다.

두 가지를 모두 사용하십시오. 짧은 만료 시간은 안전망으로, 삭제는 정확성을 위해 사용합니다.

// belt-and-suspenders: Expire(5min) + EvictByTag on write

잠금 및 캐시 쇄도 방지

출력 캐싱은 기본적으로 동시에 발생하는 캐시 누락을 통합합니다. 캐시되지 않은 엔드포인트에 많은 요청이 한꺼번에 도착하면 하나만 handler를 실행하고 나머지는 기다립니다. SetLocking(false)로 이 기능을 사용하지 않도록 설정할 수 있습니다.

policy.SetLocking(false); // allow concurrent regeneration

분산 출력 캐시

기본적으로 저장소는 메모리 내에서 인스턴스별로 동작합니다. 여러 서버를 사용하는 경우 레디스와 같은 분산 저장소를 연결하여 모든 인스턴스가 같은 캐시를 공유하고 무효화하도록 합니다.

// Register a distributed IOutputCacheStore implementation
// (e.g. a Redis-backed package) so EvictByTag works cluster-wide

빠른 확인

무효화에 대한 이해도를 테스트합니다.

복습

캐시 정책과 무효화를 학습했습니다.

  • 재사용 가능한 이름이 지정된 정책을 정의하고 이름으로 적용합니다.
  • 태그로 항목을 그룹화하고, 쓰기 작업 시 IOutputCacheStore.EvictByTagAsync로 해당 항목을 삭제합니다.
  • 만료(자동)와 삭제(명시적)를 결합합니다.
  • 여러 서버에 배포할 때는 분산 저장소를 사용합니다.

이로써 속도 제한 및 캐싱 과정이 끝납니다.

자주 묻는 질문

“캐시 정책과 무효화” 강의는 무료인가요?

네 — “캐시 정책과 무효화” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“캐시 정책과 무효화”에서 뭘 배우나요?

캐시 수명과 태그를 제어합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C# Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“캐시 정책과 무효화” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 요청 제한 알고리즘
  2. 요청 제한 미들웨어 구성
  3. 출력 캐싱 기초
  4. 캐시 정책과 무효화
← C# Academy(으)로 돌아가기