KeiStory

반응형

ASP.NET Core ResponseCache 활용하기

 

API 요청으로 데이터가 반환되는 경우 특정 키 기준으로 동일한 데이터가 반환된다면 ResponseCache를 활용하면 응답 데이터를 캐싱하여 서버 부하를 줄일 수 있습니다. 이를 활용하는 방법을 알아봅니다.

1. ASP.NET Core 웹 API 프로젝트를 생성합니다.

 

2. api 확인을 위해 Swashbuckle.AspNetCore  nuget package 를 설치합니다.

 

3. Program.cs 에서 Swagger 설정 및 ResponseCache 를 사용하도록 설정합니다.

using Microsoft.OpenApi.Models;

namespace WebApiCacheTest
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.
            builder.Services.AddControllers();

            // Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
            builder.Services.AddOpenApi();

            // ResponseCaching 설정
            builder.Services.AddResponseCaching(options =>
            {
                // 캐시할 수 있는 응답 본문의 최대 크기를 100MB로 설정
                options.MaximumBodySize = 100 * 1024 * 1024; // 100MB
                // 전체 응답 캐시의 최대 크기
                options.SizeLimit = 50 * 1024 * 1024; // 50MB
                // URL 경로의 대소문자 구분 여부
                options.UseCaseSensitivePaths = true;
            });

            // Swagger 서비스 등록
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo
                {
                    Title = "Caching API 예제",
                    Version = "v1",
                    Description = "Response Cache와 Memory Cache 예제를 보여주는 API"
                });
            });

            var app = builder.Build();

            // Swagger 미들웨어 설정
            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "Caching API v1");
                c.RoutePrefix = string.Empty; // 루트 URL에서 Swagger UI 제공
                c.DisplayRequestDuration(); // 요청 지속 시간 표시
            });

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.MapOpenApi();
            }

            app.UseHttpsRedirection();

            app.UseAuthorization();
            
			// ResponseCaching 설정
            app.UseResponseCaching();

            app.MapControllers();

            app.Run();
        }
    }
}

 

4. API 를 작성합니다.

using Microsoft.AspNetCore.Mvc;

namespace WebApiCacheTest.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class TestController : ControllerBase
    {
        [HttpGet("GetData/{key}")]
        [ResponseCache(Duration = 30, Location = ResponseCacheLocation.Any, VaryByQueryKeys = new[] { "key" })]
        public IActionResult GetWithResponseCache(string key)
        {
            return Ok(new
            {
                key = key,
                message = $"Response Cache Test for key: {key}",
                timestamp = DateTime.Now.ToString()
            });
        }
}

 

  • Duration = 30 : 응답을 30초 동안 캐싱하도록 설정합니다.
  • Location = ResponseCacheLocation.Any : 캐싱 위치 설정합니다.
    ResponseCacheLocation.Any 는 캐싱이 서버에서 관리되어 클라이언트가 달라도 같은 값으로 반환됩니다.
    ResponseCacheLocation.Client 는 캐싱이 Client 에서 관리되어 동일한 클라이언트인 경우 같은 값이 반환되나 다른 클라이언트들은 다른 값을 반환합니다.
  • VaryByQueryKeys = new[] { "key" } : 쿼리 문자열의 key 값이 다르면 별도의 캐시 항목으로 저장됩니다.

실행결과

Any 로 설정되어 있어 동일한 데이터가 반환됩니다.

오른쪽 응답 헤더를 보면 아래와 같은데

 

 age: 1 
 cache-control: public,max-age=30 
 content-length: 95 
 content-type: application/json; charset=utf-8 
 date: Tue,25 Feb 2025 14:02:58 GMT 
 server: Kestrel 

이는  cache-control 을 보면 알 수 있듯이 캐싱된 데이터가 반환된 것임을 알수 있습니다.

 

728x90
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band