쿠키 기본 설정 선택

당사는 사이트와 서비스를 제공하는 데 필요한 필수 쿠키 및 유사한 도구를 사용합니다. 고객이 사이트를 어떻게 사용하는지 파악하고 개선할 수 있도록 성능 쿠키를 사용해 익명의 통계를 수집합니다. 필수 쿠키는 비활성화할 수 없지만 '사용자 지정' 또는 ‘거부’를 클릭하여 성능 쿠키를 거부할 수 있습니다.

사용자가 동의하는 경우 AWS와 승인된 제3자도 쿠키를 사용하여 유용한 사이트 기능을 제공하고, 사용자의 기본 설정을 기억하고, 관련 광고를 비롯한 관련 콘텐츠를 표시합니다. 필수가 아닌 모든 쿠키를 수락하거나 거부하려면 ‘수락’ 또는 ‘거부’를 클릭하세요. 더 자세한 내용을 선택하려면 ‘사용자 정의’를 클릭하세요.

페이지네이터 - SDK for .NET (버전 3)

의 버전 4(V4) SDK for .NET 는 미리 보기 중입니다! 미리 보기에서이 새 버전에 대한 정보를 보려면 AWS SDK for .NET (버전 4 미리 보기) 개발자 안내서를 참조하세요.

SDK의 V4는 미리 보기 상태이므로 콘텐츠는 변경될 수 있습니다.

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

의 버전 4(V4) SDK for .NET 는 미리 보기 중입니다! 미리 보기에서이 새 버전에 대한 정보를 보려면 AWS SDK for .NET (버전 4 미리 보기) 개발자 안내서를 참조하세요.

SDK의 V4는 미리 보기 상태이므로 콘텐츠는 변경될 수 있습니다.

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

페이지네이터

일부 AWS 서비스는 대량의 데이터를 수집하고 저장하며,이 데이터는의 API 호출을 사용하여 검색할 수 있습니다 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(또는 이후 버전)를 사용하여 동일한 작업을 수행하는 방법에 대한 정보는의 예제 다음에 나와 있습니다페이지네이터에 관한 추가 고려 사항.

예제

다음 예제에서는를 사용하여 로그 그룹 목록을 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); }

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

참고

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

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

전체 코드

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

NuGet 패키지:

프로그래밍 요소:

NuGet 패키지:

프로그래밍 요소:

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}"); } } } } }

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일부터 SDK for .NET 는 .NET Framework 3.5에 대한 지원을 종료하고 최소 .NET Framework 버전을 4.7.2로 변경합니다. 자세한 내용은 블로그 게시물의 .NET Framework 3.5 및 4.5 대상에 대한 중요 변경 사항을 참조하세요 SDK for .NET.

    이를 보려면 .NET Framework 4.7.2(또는 이후 버전) 프로젝트를 생성하고 이전 코드를 복사합니다. 다음 예제에 표시된 대로 두 개의 foreach 페이지네이터 호출에서 await 키워드를 제거하기만 하면 됩니다.

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

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

프라이버시사이트 이용 약관쿠키 기본 설정
© 2025, Amazon Web Services, Inc. 또는 계열사. All rights reserved.