C# Minimal API: 응답 캐싱

발행: (2025년 12월 19일 오전 06:02 GMT+9)
3 min read
원문: Dev.to

Source: Dev.to

응답 캐싱

응답 캐싱은 클라이언트나 프록시가 웹 서버에 보내는 요청 수를 줄여줍니다. 또한 웹 서버가 응답을 생성하기 위해 수행해야 하는 작업량도 감소시킵니다. 응답 캐싱은 헤더에 설정됩니다. (Microsoft Docs)

응답 캐싱은 Cache‑Control 헤더를 사용하여 구성되며, 이를 통해 응답을 클라이언트 또는 중간 경로(예: 프록시)에서 캐시할 수 있습니다.

Minimal API에서의 응답 캐싱

ASP.NET Core MVC에서는 일반적으로 ResponseCache 특성과 UseResponseCaching 미들웨어를 함께 사용하여 응답 캐싱을 구성하지만, 이는 순수히 MVC 개념에 해당합니다.

Minimal API에서는 요청이 처리된 후 Cache‑Control 헤더를 설정하는 endpoint filter를 추가함으로써 유사한 동작을 구현할 수 있습니다.

RouteHandlerBuilder 캐싱 확장

다음 확장 메서드는 Minimal API 엔드포인트에 응답 캐싱을 간단히 적용할 수 있는 방법을 제공합니다. 엔드포인트 필터는 엔드포인트가 요청을 처리한 뒤 실행되어 지정된 최대 연령(max age)과 함께 Cache‑Control 헤더를 설정합니다.

public static class HttpResponseCachingConfiguration
{
    private const int TenMinutes = 60 * 10;
    private const int Hour = 60 * 60;

    public static RouteHandlerBuilder AddResponseCacheTenMinutesHeader(this RouteHandlerBuilder routeHandlerBuilder)
        => routeHandlerBuilder.AddResponseCacheHeader(TenMinutes);

    public static RouteHandlerBuilder AddResponseCacheHourHeader(this RouteHandlerBuilder routeHandlerBuilder)
        => routeHandlerBuilder.AddResponseCacheHeader(Hour);

    public static RouteHandlerBuilder AddResponseCacheHeader(this RouteHandlerBuilder routeHandlerBuilder, int maxAgeInSeconds)
        => routeHandlerBuilder.AddEndpointFilter(async (context, next) =>
        {
            if (context.HttpContext.Response.StatusCode == StatusCodes.Status200OK)
            {
                context.HttpContext.Response.Headers.CacheControl = $"public,max-age={maxAgeInSeconds}";
            }
            return await next(context);
        });
}

확장 사용 예시

app.MapGet("/weatherforecast", () =>
{
    var forecast = Enumerable.Range(1, 5).Select(index =>
        new WeatherForecast(
            DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
            Random.Shared.Next(-20, 55),
            summaries[Random.Shared.Next(summaries.Length)]
        ))
        .ToArray();
    return forecast;
})
.AddResponseCacheHourHeader()
.WithName("GetWeatherForecast");

Note: 브라우저나 프록시에서 클라이언트‑사이드 캐싱을 사용하려면 캐싱이 활성화되어 있어야 합니다. 한 번 캐시되면, 클라이언트 또는 프록시는 적절한 경우 자동으로 캐시된 응답을 제공합니다.

Important: 인증이 필요하거나 사용자별로 다른 데이터를 반환하는 엔드포인트에 대해 공개 응답 캐싱을 사용하지 마세요.

사용 시점

응답이 정적이고, 공개이며, 브라우저나 프록시가 안전하게 캐시할 수 있는 경우에 응답 캐싱을 사용합니다.

Back to Blog

관련 글

더 보기 »

.NET에서 NuGet 패키지 사용 마스터하기

NuGet은 실제로 무엇인가요? NuGet을 .NET의 Amazon이나 Mercado Libre라고 생각해 보세요. 가구의 모든 나사를 직접 만들지 않고, 가게에 주문하듯이요. - 패키지…

LINQ 식에서 다중 열거

다중 열거는 LINQ 쿼리가 IEnumerable 컬렉션을 생성하고 이를 여러 번 반복할 때 발생합니다. 이는 특히 성능 문제를 일으킬 수 있습니다.