페이지네이터 - AWS SDK for .NET

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

페이지네이터

일부 AWS 서비스는 대량의 데이터를 수집하고 저장하며, 의 API 호출을 사용하여 데이터를 검색할 수 AWS SDK for .NET있습니다. 검색하려는 데이터 양이 단일 API 직접 호출로 너무 많아지면 페이지 매김을 사용하여 결과를 관리하기 쉬운 부분으로 나눌 수 있습니다.

페이지 매김을 수행할 수 있도록 SDK의 여러 서비스 클라이언트에 대한 요청 및 응답 객체는 연속 토큰(일반적으로 NextToken으로 이름이 지정됨)을 제공합니다. 이러한 서비스 클라이언트 중 일부는 페이지네이터도 제공합니다.

페이지네이터를 사용하면 루프, 상태 변수, 다중 API 직접 호출 등이 포함될 수 있는 연속 토큰의 오버헤드를 피할 수 있습니다. 페이지네이터를 사용하면 한 줄의 코드인 foreach 루프 선언을 통해 AWS 서비스에서 데이터를 검색할 수 있습니다. 데이터를 검색하는 데 여러 API 직접 호출이 필요한 경우 페이지네이터가 이를 자동으로 처리합니다.

페이지네이터는 어디서 찾을 수 있나요?

모든 서비스가 페이지네이터를 제공하는 것은 아닙니다. 서비스가 특정 API에 페이지네이터를 제공하는지 여부를 확인하는 한 가지 방법은 AWS SDK for .NET API 참조에서 서비스 클라이언트 클래스의 정의를 살펴보는 것입니다.

예를 들어, AmazonCloudWatchLogsClient클래스의 정의를 살펴보면 Paginators 속성이 표시됩니다. Amazon CloudWatch Logs의 페이징 네이터를 제공하는 속성입니다.

페이지네이터는 무엇을 제공합니까?

페이지네이터에는 전체 응답을 볼 수 있는 속성이 있습니다. 또한 일반적으로 응답의 가장 흥미로운 부분에 액세스할 수 있는 하나 이상의 속성이 포함되어 있는데, 이를 핵심 결과라고 합니다.

예를 들어 앞서 AmazonCloudWatchLogsClient 언급한 것처럼 Paginator 객체에는 API 호출의 전체 DescribeLogGroupsResponse객체가 포함된 Responses 속성이 포함되어 있습니다. 이 Responses 속성에는 무엇보다도 로그 그룹 컬렉션이 포함되어 있습니다.

페이지네이터 객체에는 LogGroups로 이름이 지정된 하나의 주요 결과도 포함되어 있습니다. 이 속성은 응답의 로그 그룹 부분만 포함합니다. 이 주요 결과를 통해 많은 상황에서 코드를 줄이고 단순화할 수 있습니다.

동기 페이지 매김과 비동기 페이지 매김 비교

페이지네이터는 동기 및 비동기 페이지 매김 메커니즘을 모두 제공합니다. .NET Framework 4.7.2 (이상) 프로젝트에서 동기 페이지 매김을 사용할 수 있습니다. .NET Core 프로젝트 (.NET Core 3.1, .NET 5 등) 에서는 비동기 페이지 매김을 사용할 수 있습니다.

비동기 작업과 .NET Core가 권장되므로 다음 예제에서는 비동기 페이지 매김을 보여줍니다. 동기 페이지 매김 및 .NET Framework 4.7.2 (이상) 를 사용하여 동일한 작업을 수행하는 방법에 대한 자세한 내용은 의 예제 다음에 나와 있습니다. 페이지네이터에 관한 추가 고려 사항

다음 예제는 를 사용하여 로그 그룹 목록을 표시하는 AWS SDK for .NET 방법을 보여줍니다. 반대로 이 예에서는 페이지 매김을 사용하거나 사용하지 않고 이 작업을 수행하는 방법을 보여줍니다. 나중에 보여드릴 전체 코드를 살펴보기 전에 다음 스니펫을 살펴보세요.

페이지 매김이 없는 CloudWatch 로그 그룹 가져오기

// Loop as many times as needed to get all the log groups var request = new DescribeLogGroupsRequest{Limit = LogGroupLimit}; do { Console.WriteLine($"Getting up to {LogGroupLimit} log groups..."); var response = await cwClient.DescribeLogGroupsAsync(request); foreach(var logGroup in response.LogGroups) { Console.WriteLine($"{logGroup.LogGroupName}"); } request.NextToken = response.NextToken; } while(!string.IsNullOrEmpty(request.NextToken));

CloudWatch 페이지네이터를 사용하여 로그 그룹 가져오기

// No need to loop to get all the log groups--the SDK does it for us behind the scenes var paginatorForLogGroups = cwClient.Paginators.DescribeLogGroups(new DescribeLogGroupsRequest()); await foreach(var logGroup in paginatorForLogGroups.LogGroups) { Console.WriteLine(logGroup.LogGroupName); }

이 두 스니펫의 결과는 완전히 동일하므로 페이지네이터를 사용할 때의 이점을 분명히 확인할 수 있습니다.

참고

전체 코드를 빌드하고 실행하기 전에 환경과 프로젝트를 설정했는지 확인하세요.

Microsoft.Bcl이 필요할 수도 있습니다. AsyncInterfaces NuGet 비동기 페이징 네이터가 인터페이스를 사용하기 때문에 패키지화하세요. IAsyncEnumerable

전체 코드

이 섹션에는 이 예제에 대한 관련 참조와 전체 코드가 나와 있습니다.

using System; using System.Threading.Tasks; using Amazon.CloudWatchLogs; using Amazon.CloudWatchLogs.Model; namespace CWGetLogGroups { class Program { // A small limit for demonstration purposes private const int LogGroupLimit = 3; // // Main method static async Task Main(string[] args) { var cwClient = new AmazonCloudWatchLogsClient(); await DisplayLogGroupsWithoutPaginators(cwClient); await DisplayLogGroupsWithPaginators(cwClient); } // // Method to get CloudWatch log groups without paginators private static async Task DisplayLogGroupsWithoutPaginators(IAmazonCloudWatchLogs cwClient) { Console.WriteLine("\nGetting list of CloudWatch log groups without using paginators..."); Console.WriteLine("------------------------------------------------------------------"); // Loop as many times as needed to get all the log groups var request = new DescribeLogGroupsRequest{Limit = LogGroupLimit}; do { Console.WriteLine($"Getting up to {LogGroupLimit} log groups..."); DescribeLogGroupsResponse response = await cwClient.DescribeLogGroupsAsync(request); foreach(LogGroup logGroup in response.LogGroups) { Console.WriteLine($"{logGroup.LogGroupName}"); } request.NextToken = response.NextToken; } while(!string.IsNullOrEmpty(request.NextToken)); } // // Method to get CloudWatch log groups by using paginators private static async Task DisplayLogGroupsWithPaginators(IAmazonCloudWatchLogs cwClient) { Console.WriteLine("\nGetting list of CloudWatch log groups by using paginators..."); Console.WriteLine("-------------------------------------------------------------"); // Access the key results; i.e., the log groups // No need to loop to get all the log groups--the SDK does it for us behind the scenes Console.WriteLine("\nFrom the key results..."); Console.WriteLine("------------------------"); IDescribeLogGroupsPaginator paginatorForLogGroups = cwClient.Paginators.DescribeLogGroups(new DescribeLogGroupsRequest()); await foreach(LogGroup logGroup in paginatorForLogGroups.LogGroups) { Console.WriteLine(logGroup.LogGroupName); } // Access the full response // Create a new paginator, do NOT reuse the one from above Console.WriteLine("\nFrom the full response..."); Console.WriteLine("--------------------------"); IDescribeLogGroupsPaginator paginatorForResponses = cwClient.Paginators.DescribeLogGroups(new DescribeLogGroupsRequest()); await foreach(DescribeLogGroupsResponse response in paginatorForResponses.Responses) { Console.WriteLine($"Content length: {response.ContentLength}"); Console.WriteLine($"HTTP result: {response.HttpStatusCode}"); Console.WriteLine($"Metadata: {response.ResponseMetadata}"); Console.WriteLine("Log groups:"); foreach(LogGroup logGroup in response.LogGroups) { Console.WriteLine($"\t{logGroup.LogGroupName}"); } } } } }

페이지네이터에 관한 추가 고려 사항

  • 페이지네이터는 두 번 이상 사용할 수 없음

    코드의 여러 위치에 있는 특정 AWS 페이지네이터의 결과가 필요한 경우 페이지네이터 객체를 두 번 이상 사용해서는 안 됩니다. 대신 필요할 때마다 새 페이지네이터를 만드세요. 이 개념은 DisplayLogGroupsWithPaginators 메서드의 이전 예제 코드에 나와 있습니다.

  • 동기식 페이지 매김

    .NET Framework 4.7.2 (이상) 프로젝트에서는 동기 페이지 매김을 사용할 수 있습니다.

    주의

    2024년 8월 15일부터 .NET 프레임워크 3.5에 AWS SDK for .NET 대한 지원이 종료되고 최소 .NET 프레임워크 버전이 4.7.2로 변경됩니다. 자세한 내용은 블로그 게시물에서.NET Framework 3.5 및 4.5 대상에 적용될 주요 변경 사항을 참조하십시오. AWS SDK for .NET

    이를 확인하려면 .NET Framework 4.7.2 (이상) 프로젝트를 만들고 이전 코드를 여기에 복사하십시오. 다음 예제에 표시된 대로 두 개의 foreach 페이지네이터 호출에서 await 키워드를 제거하기만 하면 됩니다.

    /*await*/ foreach(var logGroup in paginatorForLogGroups.LogGroups) { Console.WriteLine(logGroup.LogGroupName); }

    프로젝트를 빌드하고 실행하면 비동기 페이지 매김으로 본 것과 동일한 결과를 확인할 수 있습니다.