연습 - Redis의 캐시 데이터
이 연습에서는 아웃도어 장비 소매업체를 위해 부분적으로 완성된 클라우드 네이티브 앱에 캐싱을 추가합니다. AppHost 프로젝트에 Redis를 추가한 다음 WebApp 프로젝트에서 출력 캐싱을 구현하고 Catalog.API 프로젝트에서 분산 캐싱을 구현합니다.
필수 구성 요소 설치
.NET Aspire의 필수 조건은 다음과 같습니다.
- .NET 8
- Visual Studio 2022 Preview
- Docker Desktop
- Visual Studio의 .NET Aspire 워크로드
이러한 패키지가 이미 설치되어 있는 경우 앞으로 건너뛰어 Redis Cache 작업을 시작할 수 있습니다.
.NET 8 설치
이 .NET 8 링크를 따라가서 운영 체제에 맞는 올바른 설치 프로그램을 선택합니다. 예를 들어, Windows 11과 최신 프로세서를 사용하는 경우 Windows용 x64 .NET 8 SDK를 선택합니다.
다운로드가 완료되면 설치 프로그램을 실행하고 지침을 따릅니다. 터미널 창에서 다음 명령을 실행하여 설치가 성공했는지 확인합니다.
dotnet --version
설치한 .NET SDK의 버전 번호가 표시되어야 합니다. 예시:
8.0.300-preview.24203.14
Visual Studio 2022 Preview 설치
이 Visual Studio 2022 미리 보기 링크를 따라가서 미리 보기 다운로드를 선택합니다. 다운로드가 완료되면 설치 프로그램을 실행하고 지침을 따릅니다.
Docker Desktop 설치
이 Docker Desktop 링크를 따라가서 운영 체제에 맞는 올바른 설치 프로그램을 선택합니다. 다운로드가 완료되면 설치 프로그램을 실행하고 지침을 따릅니다. 최고의 성능과 호환성을 위해서는 WSL 2 백 엔드를 사용합니다.
Docker Desktop 애플리케이션을 열고 서비스 계약에 동의합니다.
Visual Studio에서 .NET Aspire 워크로드 설치
.NET CLI를 사용하여 .NET Aspire 워크로드를 설치합니다.
터미널을 엽니다.
다음 명령을 사용하여 .NET 워크로드를 업데이트합니다.
dotnet workload update
워크로드가 성공적으로 업데이트되었다는 메시지가 표시됩니다.
No workloads installed for this feature band. To update workloads installed with earlier SDK versions, include the --from-previous-sdk option. Updated advertising manifest microsoft.net.sdk.ios. Updated advertising manifest microsoft.net.workload.mono.toolchain.net6. Updated advertising manifest microsoft.net.sdk.android. Updated advertising manifest microsoft.net.workload.emscripten.net7. Updated advertising manifest microsoft.net.workload.emscripten.net6. Updated advertising manifest microsoft.net.sdk.macos. Updated advertising manifest microsoft.net.workload.emscripten.current. Updated advertising manifest microsoft.net.workload.mono.toolchain.current. Updated advertising manifest microsoft.net.sdk.maui. Updated advertising manifest microsoft.net.workload.mono.toolchain.net7. Updated advertising manifest microsoft.net.sdk.maccatalyst. Updated advertising manifest microsoft.net.sdk.tvos. Updated advertising manifest microsoft.net.sdk.aspire. No workloads installed for this feature band. To update workloads installed with earlier SDK versions, include the --from-previous-sdk option. Successfully updated workload(s): .
다음 명령을 사용하여 .NET Aspire 워크로드를 설치합니다.
dotnet workload install aspire
Aspire 워크로드가 설치되었다는 메시지가 표시됩니다.
Installing Aspire.Hosting.Sdk.Msi.x64 ...... Done Installing Aspire.ProjectTemplates.Msi.x64 ..... Done Installing Aspire.Hosting.Orchestration.win-x64.Msi.x64 ............. Done Installing Aspire.Hosting.Msi.x64 ..... Done Installing Aspire.Dashboard.Sdk.win-x64.Msi.x64 ....... Done Successfully installed workload(s) aspire.
다음 명령을 사용하여 .NET Aspire 워크로드가 설치되었는지 확인합니다.
dotnet workload list
그러면
aspire
워크로드의 세부 정보가 표시됩니다.Installed Workload Id Manifest Version Installation Source --------------------------------------------------------------------------------------------- aspire 8.0.0/8.0.100 SDK 8.0.300-preview.24203, VS 17.10.34902.84 Use `dotnet workload search` to find additional workloads to install.
샘플 앱 복제 및 수정
git
를 사용하여 .NET Aspire로 빌드된 샘플 앱을 가져옵니다. 앱에 아직 캐싱이 설정되어 있지 않은 경우:
명령줄에서 코드 작업을 할 수 있는 폴더를 선택합니다.
다음 명령을 실행하여 Northern Mountains eShop 샘플 애플리케이션을 복제합니다.
git clone -b aspire-cache https://github.com/MicrosoftDocs/mslearn-aspire-starter
Visual Studio를 시작한 다음 프로젝트 또는 솔루션 열기를 선택합니다.
eShop을 복제한 폴더로 이동하여 시작 폴더를 열고 eShop.rediscache.sln 파일을 선택한 다음 열기를 선택합니다.
솔루션 탐색기에서 WebApp/Components/Pages를 찾은 다음 Catalog.razor를 두 번 클릭합니다.
다음 코드 줄을 찾습니다.
<SectionContent SectionName="page-header-subtitle">Start the season with the latest in clothing and equipment.</SectionContent>
이 줄을 다음 코드로 바꿉니다.
<SectionContent SectionName="page-header-subtitle">Start the season with the latest in clothing and equipment. It's @DateTime.Now</SectionContent>
앱을 시작하려면 F5를 누르거나 디버그>디버깅 시작을 선택합니다.
Docker Desktop 시작 대화 상자가 나타나면 예를 선택합니다.
eShop .NET Aspire 대시보드가 나타나면 webapp 리소스에 대해 다음 엔드포인트 중 하나를 선택합니다.
엔드포인트가 Northern Mountains 홈페이지를 표시합니다. 서버의 시간 포함:
F5를 눌러 페이지를 새로 고칩니다. 페이지가 캐싱되지 않았으므로 새로 고칠 때마다 초가 변하는 한 시간이 변경 내용을 표시했습니다.
.NET Aspire 대시보드를 표시하는 브라우저 탭으로 변경한 다음 왼쪽 탐색 레이아웃에서 Traces를 선택합니다.
webapp: GET / 추적이 홈페이지에 대한 요청입니다. 이러한 요청에 대한 일반적인 기간을 적어 두고, 그 중 하나에 대해 세부 정보 열에서 보기를 선택합니다.
타임라인 보기에서 webapp은 여러 마이크로 서비스를 호출하여 응답을 생성합니다.
Northern Mountains 홈페이지와 .NET Aspire 대시보드를 종료합니다.
Visual Studio에서 디버깅을 중지하려면 SHIFT - F5를 누르거나 디버그 > 디버깅 중지를 선택합니다.
서비스 지원 캐싱 추가
이제 홈페이지가 캐싱 없이 어떻게 작동하는지 살펴보았으므로 출력 캐싱을 추가하여 응답성이 향상되는지 확인해 보겠습니다. 먼저 출력 캐싱 구성 요소를 AppHost 프로젝트에 추가합니다.
Visual Studio의 솔루션 탐색기에서 eShop.AppHost 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가를 선택한 다음 .NET Aspire 패키지를 선택합니다.
검색 텍스트 상자의 기존 텍스트 끝에 Redis를 입력합니다.
Aspire.Hosting.Redis 패키지를 선택합니다.
버전 목록에서 최신 8.0.0 버전을 선택한 다음 설치를 선택합니다.
변경 내용 미리 보기 대화 상자가 표시되면 적용을 선택합니다.
라이선스 동의 대화 상자에서 동의함을 선택합니다.
솔루션 탐색기에서 AppHost 프로젝트를 확장한 다음 Program.cs를 두 번 클릭합니다.
다음 코드 줄을 찾습니다.
// Databases var postgres = builder.AddPostgres("postgres").WithPgAdmin(); var catalogDb = postgres.AddDatabase("CatalogDB");
해당 줄 바로 뒤에 다음 코드를 추가합니다.
// Cache var redis = builder.AddRedis("cache");
.NET Aspire 오케스트레이션에 Catalog API 프로젝트를 추가하는 다음 코드 줄을 찾습니다.
var catalogApi = builder.AddProject<Catalog_API>("catalog-api") .WithReference(catalogDb);
Redis Cache를 Catalog API 프로젝트에 전달하려면 해당 코드를 다음 줄로 바꿉다.
var catalogApi = builder.AddProject<Catalog_API>("catalog-api") .WithReference(catalogDb) .WithReference(redis);
참고 항목
Catalog API의 캐시를 사용하여 분산 캐싱을 수행합니다.
.NET Aspire 오케스트레이션에 WebApp 프로젝트를 추가하는 다음 코드 줄을 찾습니다.
builder.AddProject<WebApp>("webapp") .WithReference(catalogApi);
Redis Cache를 WebApp 프로젝트에 전달하려면 해당 코드를 다음 줄로 바꿉다.
builder.AddProject<WebApp>("webapp") .WithReference(catalogApi) .WithReference(redis);
참고 항목
WebApp의 캐시를 사용하여 출력 캐싱을 수행합니다.
Program.cs 파일을 저장하려면 CTRL - S를 누르거나 파일 > Program.cs 저장을 선택합니다.
WebApp 프로젝트에서 출력 캐싱 사용
이제 WebApp에서 Redis Cache를 사용하여 홈페이지 출력을 캐시해 보겠습니다.
Visual Studio의 솔루션 탐색기에서 WebApp 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가를 선택한 다음 .NET Aspire 패키지를 선택합니다.
검색 텍스트 상자의 기존 텍스트 끝에 Redis를 입력합니다.
Aspire.StackExchange.Redis.OutputCaching 패키지를 선택합니다.
버전 목록에서 최신 8.0.0 버전을 선택한 다음 설치를 선택합니다.
변경 내용 미리 보기 대화 상자가 표시되면 적용을 선택합니다.
라이선스 동의 대화 상자에서 동의함을 선택합니다.
설치가 완료되면 솔루션 탐색기에서 WebApp을 확장한 다음 Program.cs를 두 번 클릭합니다.
다음 코드 줄을 찾습니다.
var builder = WebApplication.CreateBuilder(args);
해당 줄 바로 뒤에 출력 캐시를 프로젝트에 추가하려면 이 코드를 추가합니다.
builder.AddRedisOutputCache("cache");
다음 코드 줄을 찾습니다.
var app = builder.Build();
해당 줄 바로 뒤에 캐싱 미들웨어를 요청 파이프라인에 추가하려면 이 코드를 추가합니다.
app.UseOutputCache();
솔루션 탐색기에서 WebApp > 구성 요소 > 페이지를 확장한 다음 Catalog.razor를 두 번 클릭합니다.
다음 코드 줄을 찾습니다.
@attribute [StreamRendering]
해당 줄 바로 뒤에 홈페이지를 캐시하려면 다음 코드를 추가합니다.
@attribute [Microsoft.AspNetCore.OutputCaching.OutputCache(Duration = 10)]
출력 캐싱 테스트
이제 Northern Mountains 홈페이지에서 출력 캐싱이 구현되었습니다. 테스트를 수행해 봅시다.
Visual Studio에서 앱을 시작하려면 F5를 누르거나 디버그 > 디버깅 시작을 선택합니다.
eShop .NET Aspire 대시보드가 나타나면 webapp 리소스에 대해 다음 엔드포인트 중 하나를 선택합니다.
엔드포인트가 서버의 시간을 포함하여 North Mountains 홈페이지를 표시합니다.
F5를 눌러 페이지를 새로 고칩니다. 페이지가 10초 동안 캐시되었으므로 표시된 시간은 캐시된 요청 후 10초가 지난 경우에만 바뀝니다.
.NET Aspire 대시보드를 표시하는 브라우저 탭으로 변경한 다음 왼쪽 탐색 레이아웃에서 Traces를 선택합니다.
webapp: GET / 추적이 홈페이지에 대한 요청입니다. 캐시에서 충족할 수 없는 홈페이지에 대한 일부 요청은 이전에 확인한 기간과 비슷한 타이밍을 가집니다. 하지만 캐시에서 반환하는 다른 요청은 훨씬 더 짧은 기간을 가집니다.
짧은 요청 중 하나에 대해 세부 정보 열에서 보기를 선택합니다. Redis Cache에서 요청을 가져온 것을 확인하세요.
Northern Mountains 홈페이지와 .NET Aspire 대시보드를 종료합니다.
Visual Studio에서 디버깅을 중지하려면 SHIFT - F5를 누르거나 디버그 > 디버깅 중지를 선택합니다.
분산 캐싱 사용
Redis를 사용하여 Catalog.API 프로젝트에서 분산 캐싱을 수행할 수도 있습니다.
Visual Studio의 솔루션 탐색기에서 Catalog.API 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가를 선택한 다음 .NET Aspire 패키지를 선택합니다.
검색 텍스트 상자의 기존 텍스트 끝에 Redis를 입력합니다.
Aspire.StackExchange.Redis.DistributedCaching 패키지를 선택합니다.
버전 목록에서 최신 8.0.0 버전을 선택한 다음 설치를 선택합니다.
변경 내용 미리 보기 대화 상자가 표시되면 적용을 선택합니다.
라이선스 동의 대화 상자에서 동의함을 선택합니다.
설치가 완료되면 솔루션 탐색기에서 Catalog.API를 확장한 다음 Program.cs를 두 번 클릭합니다.
다음 코드 줄을 찾습니다.
var builder = WebApplication.CreateBuilder(args);
해당 줄 바로 뒤에 출력 캐시를 프로젝트에 추가하려면 이 코드를 추가합니다.
builder.AddRedisDistributedCache("cache");
솔루션 탐색기에서 Catalog.API > Api를 확장한 다음 CatalogApi.cs를 두 번 클릭합니다.
GetAllItems
메서드를 선언하는 다음 코드를 찾습니다.public static async Task<Results<Ok<PaginatedItems<CatalogItem>>, BadRequest<string>>> GetAllItems( [AsParameters] PaginationRequest paginationRequest, [AsParameters] CatalogServices services) {
종속성 주입을 통해 Redis Cache를 가져오려면 메서드에 새 매개 변수를 추가하도록 해당 코드를 수정합니다.
public static async Task<Results<Ok<PaginatedItems<CatalogItem>>, BadRequest<string>>> GetAllItems( [AsParameters] PaginationRequest paginationRequest, [AsParameters] CatalogServices services, IDistributedCache cache) {
GetAllItems
메서드의 전체 내용을 제거하고 다음 코드로 바꿉니다.var pageSize = paginationRequest.PageSize; var pageIndex = paginationRequest.PageIndex; var totalItems = await services.DbContext.CatalogItems .LongCountAsync(); // Check that there are cached items var cachedItems = await cache.GetAsync("catalogItems"); if (cachedItems is null) { // There are no items in the cache. Get them from the database var itemsOnPage = await services.DbContext.CatalogItems .OrderBy(c => c.Name) .Skip(pageSize * pageIndex) .Take(pageSize) .AsNoTracking() .ToListAsync(); // Store the items in the cache for 10 seconds await cache.SetAsync("catalogItems", Encoding.UTF8.GetBytes(System.Text.Json.JsonSerializer.Serialize(itemsOnPage)), new() { AbsoluteExpiration = DateTime.Now.AddSeconds(10) }); ChangeUriPlaceholder(services.Options.Value, itemsOnPage); return TypedResults.Ok(new PaginatedItems<CatalogItem>(pageIndex, pageSize, totalItems, itemsOnPage)); } else { // There are items in the cache. Deserialize them to display. var itemsOnPage = System.Text.Json.JsonSerializer.Deserialize<List<CatalogItem>>(cachedItems); // Make sure itemsOnPage is not null if (itemsOnPage is null) { itemsOnPage = new List<CatalogItem>(); } ChangeUriPlaceholder(services.Options.Value, itemsOnPage); return TypedResults.Ok(new PaginatedItems<CatalogItem>(pageIndex, pageSize, totalItems, itemsOnPage)); }
분산 캐싱 테스트
이제 Catalog.API 프로젝트에 분산 캐싱이 구현되었습니다. 테스트를 수행해 봅시다.
Visual Studio에서 앱을 시작하려면 F5를 누르거나 디버그 > 디버깅 시작을 선택합니다.
eShop .NET Aspire 대시보드가 나타나면 catalog-api 리소스에 대해 다음 엔드포인트를 선택합니다.
엔드포인트가 Catalog API 마이크로 서비스에 대한 Swagger 인터페이스를 표시합니다. /api/v1/catalog/items 메서드 옆에 있는 GET을 선택합니다.
사용해 보기를 선택한 다음 실행을 선택합니다. 응답 본문 창에 결과가 표시됩니다.
실행을 여러 번 클릭하여 API를 다시 호출합니다. 첫 번째 요청 이후 요청이 10초 미만이 지난 경우 이러한 요청은 캐시에서 항목을 가져옵니다.
.NET Aspire 대시보드를 표시하는 브라우저 탭으로 변경한 다음 왼쪽 탐색 레이아웃에서 Traces를 선택합니다.
catalog-api: GET /api/v1/catalog/items 추적이 Catalog API의 항목 메서드에 대한 요청입니다. 해당 메서드에 대한 첫 번째 요청의 경우 API가 Redis Cache에서 항목을 가져오는 후속 요청을 공식화하는 데 더 오래 걸립니다.
Swagger 페이지와 .NET Aspire 대시보드를 닫습니다.
Visual Studio에서 디버깅을 중지하려면 SHIFT - F5를 누르거나 디버그 > 디버깅 중지를 선택합니다.