목록 작업 사용

일부 서비스는 행이나 리소스 설명과 같이 항목 목록이 클 수 있습니다. CPU 및 메모리 사용량을 제어하기 위해 서비스는 다음 하위 집합을 요청하는 연속 토큰이 있는 항목의 더 작은 하위 집합인 pages에서 이러한 리소스를 반환합니다.

페이지별로 항목을 반복하는 것은 지루할 수 있습니다. 클라이언트 라이브러리는 페이지를 비동기 반복자로 변환하는 어댑터를 제공합니다. 이 가이드에서는 이러한 어댑터를 사용하는 방법을 보여줍니다.

기본 요건

이 가이드에서는 Secret Manager 서비스를 사용하여 목록 작업을 보여줍니다. 이 가이드에 포함된 개념은 다른 서비스에도 적용됩니다.

이 가이드를 따르려면 Secret Manager 서비스를 사용 설정하고 로그인한 후 계정에 필요한 권한이 있는지 확인해야 합니다. 이러한 사전 요구사항을 충족하는 방법에 관한 안내는 서비스 빠른 시작을 참고하세요.

Rust 라이브러리의 전체 설정 안내는 개발 환경 설정을 참고하세요.

종속 항목

Cargo.toml 파일에 Secret Manager 라이브러리를 추가합니다.

cargo add google-cloud-secretmanager-v1

목록 메서드 반복

목록 메서드의 항목을 반복할 수 있도록 API는 ItemPaginator 트레이트의 구현을 반환합니다. use 선언을 사용하여 범위에 트레이트를 도입합니다.

use google_cloud_gax::paginator::ItemPaginator as _;

항목을 반복하려면 by_item 메서드를 사용합니다.

let mut list = client
    .list_secrets()
    .set_parent(format!("projects/{project_id}"))
    .by_item();
while let Some(secret) = list.next().await {
    let secret = secret?;
    println!("  secret={}", secret.name)
}

드문 경우지만 액세스해야 하는 추가 정보가 페이지에 포함되어 있거나 프로세스 전반에서 진행 상황을 검사해야 할 수 있습니다. 필요한 경우 개별 항목 대신 전체 페이지를 반복할 수 있습니다.

  1. use 선언을 사용하여 Paginator를 범위에 도입합니다.

    use google_cloud_gax::paginator::Paginator as _;

  2. by_page을 사용하여 페이지를 반복합니다.

    let mut list = client
        .list_secrets()
        .set_parent(format!("projects/{project_id}"))
        .by_page();
    while let Some(page) = list.next().await {
        let page = page?;
        println!("  next_page_token={}", page.next_page_token);
        page.secrets
            .into_iter()
            .for_each(|secret| println!("    secret={}", secret.name));
    }

futures::Stream 사용

tokio::Stream과 같은 비동기 스트림의 더 큰 Rust 생태계에서 이러한 API를 사용할 수 있습니다. 이 작업은 다음과 같이 수행할 수 있습니다.

  1. google_cloud_gax 크레이트에서 unstable-streams 기능을 사용 설정합니다. 이 기능의 이름은 이러한 API가 불안정하다는 알림 역할을 합니다. futures::Stream 트레이트의 호환되지 않는 변경사항으로 인해 발생하는 중단을 처리할 준비가 된 경우에만 사용해야 합니다.

    cargo add google-cloud-gax --features unstable-stream
    
  2. 다음 예시에서는 futures 크레이트를 추가하여 사용 설정하는 futures::stream::StreamExt 트레이트도 사용합니다.

    cargo add futures
    
  3. 필요한 use 선언을 추가합니다.

    use futures::stream::StreamExt;
    use google_cloud_gax::paginator::ItemPaginator as _;

  4. into_stream 함수를 사용하여 ItemPaginatorfutures::Stream로 변환합니다.

    let list = client
        .list_secrets()
        .set_parent(format!("projects/{project_id}"))
        .by_item()
        .into_stream();
    list.map(|secret| -> gax::Result<()> {
        println!("  secret={}", secret?.name);
        Ok(())
    })
    .fold(Ok(()), async |acc, result| -> gax::Result<()> {
        acc.and(result)
    })
    .await?;

마찬가지로 into_stream 함수를 사용하여 Paginatorfutures::Stream로 변환할 수 있습니다.

let list = client
    .list_secrets()
    .set_parent(format!("projects/{project_id}"))
    .by_page()
    .into_stream();
list.enumerate()
    .map(|(index, page)| -> gax::Result<()> {
        println!("page={}, next_page_token={}", index, page?.next_page_token);
        Ok(())
    })
    .fold(Ok(()), async |acc, result| -> gax::Result<()> {
        acc.and(result)
    })
    .await?;

다음 페이지 토큰을 설정하여 목록 메서드 재개

목록 작업이 중단된 경우와 같은 일부 사례에서는 다음 페이지 토큰을 설정하여 특정 페이지부터 페이지로 나누기를 재개할 수 있습니다.

let page = client
    .list_secrets()
    .set_parent(format!("projects/{project_id}"))
    .send()
    .await;
let page = page?;
let mut next_page_token = page.next_page_token.clone();
page.secrets
    .into_iter()
    .for_each(|secret| println!("    secret={}", secret.name));

while !next_page_token.is_empty() {
    println!("  next_page_token={next_page_token}");

    let page = client
        .list_secrets()
        .set_parent(format!("projects/{project_id}"))
        .set_page_token(next_page_token)
        .send()
        .await;
    let page = page?;
    next_page_token = page.next_page_token.clone();

    page.secrets
        .into_iter()
        .for_each(|secret| println!("    secret={}", secret.name));
}

페이지로 나누기 도우미를 사용해야 하는 경우

Rust용 Google Cloud 클라이언트 라이브러리는 AIP-4233에 정의된 목록 RPC를 ItemPaginatorPaginator를 구현하는 유형으로 변환하는 어댑터를 제공합니다(Google API 목록 메서드가 AIP-158에 정의된 페이지로 나누기 가이드라인을 따르는 경우). 간단히 말해 이 가이드라인에서는 List 메서드에 대한 각 호출이 다음 페이지를 가져오기 위해 List 메서드에 전달할 수 있는 토큰과 함께 리소스 항목 (예: 보안 비밀) 페이지를 반환해야 합니다.

대부분의 Google Cloud 서비스는 이 가이드라인을 따릅니다. 그렇지 않은 경우에는 결과를 반복하기 위해 자체 어댑터를 구현해야 합니다.