캐시 정책과 무효화
캐시 수명과 태그를 제어합니다.
캐시 정책과 무효화은(는) 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 요청 제한 알고리즘
- 요청 제한 미들웨어 구성
- 출력 캐싱 기초
- 캐시 정책과 무효화