

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

# AWS SDK for PHP 버전 3에서 페이지 매김된 결과 사용
<a name="guide_paginators"></a>

일부 AWS 서비스 작업은 페이지 지정되며 잘린 결과로 응답합니다. 예를 들어, Amazon S3`ListObjects` 작업은 한 번에 최대 1,000개의 객체만 반환합니다. 이와 같은 작업(일반적으로 “list” 또는 “describe”라는 접두사가 붙음)을 수행하려면 토큰(또는 마커) 파라미터와 함께 후속 요청을 수행하여 전체 결과 집합을 검색해야 합니다.

 **페이지네이터**는 개발자가 페이지 매김된 API를 쉽게 사용할 수 있도록 이 프로세스에서 추상화 역할을 수행하는 AWS SDK for PHP의 기능입니다. 페이지네이터는 본질적으로 결과의 반복자입니다. 이 기능은 클라이언트의 `getPaginator()` 메서드를 통해 생성됩니다. `getPaginator()`를 호출할 때 작업 이름과 작업 인수를 제공해야 합니다(작업을 실행할 때 수행한 것과 동일한 방법 사용). `foreach`를 사용하는 페이지네이터 객체를 반복하여 개별 `Aws\Result` 객체를 가져올 수 있습니다.

```
$results = $s3Client->getPaginator('ListObjects', [
    'Bucket' => 'amzn-s3-demo-bucket'
]);

foreach ($results as $result) {
    foreach ($result['Contents'] as $object) {
        echo $object['Key'] . "\n";
    }
}
```

## 페이지네이터 객체
<a name="paginator-objects"></a>

`getPaginator()` 메서드에서 반환된 객체는 `Aws\ResultPaginator` 클래스의 인스턴스입니다. 이 클래스는 PHP의 고유 `iterator` 인터페이스를 구현하며, 이러한 이유로 `foreach`와 함께 작동합니다. `iterator_to_array`와 같은 iterator 함수와도 함께 사용할 수 있으며 `LimitIterator` 객체와 같은 [SPL iterator](http://www.php.net/manual/en/spl.iterators.php)와 잘 통합됩니다.

페이지네이터 객체는 한 번에 한 “페이지”의 결과만 보유하며 지연 실행됩니다. 따라서 결과의 동시 페이지를 산출하는 데 필요한 수의 요청만 수행합니다. 예를 들어, Amazon S3`ListObjects` 작업은 한 번에 최대 1,000개의 객체만 반환하므로, 버킷에 \$110,000개의 객체가 있는 경우 페이지네이터는 총 10개의 요청을 수행해야 합니다. 결과를 반복하면 반복을 시작할 때 첫 번째 요청이 실행되고 루프의 두 번째 반복에서 두 번째 요청이 실행되며 같은 방식으로 계속됩니다.

## 결과의 데이터 열거
<a name="enumerating-data-from-results"></a>

페이지네이터 객체에는 `search()`라는 메서드가 있습니다. 이 메서드를 사용하여 결과 집합 내의 데이터에 대한 반복자를 생성할 수 있습니다. `search()`를 호출할 때 [JMESPath 표현식](guide_jmespath.md)을 제공하여 어떤 데이터를 추출할지를 지정합니다. `search()`를 호출하면 결과의 각 페이지에서 표현식의 결과를 산출하는 반복자가 반환됩니다. 반환된 반복자를 반복하므로 이 값은 늦게 평가됩니다.

다음 예제는 이전 코드 예제와 동등하지만, 더 간결하게 하기 위해 `ResultPaginator::search()` 메서드를 사용합니다.

```
$results = $s3Client->getPaginator('ListObjects', [
    'Bucket' => 'amzn-s3-demo-bucket'
]);

foreach ($results->search('Contents[].Key') as $key) {
    echo $key . "\n";
}
```

JMESPath 표현식을 사용하면 상당히 복잡한 작업을 수행할 수 있습니다. 예를 들어, 모든 객체 키와 공통 접두사를 인쇄하려는 경우(예: 버킷의 `ls` 실행) 다음을 수행할 수 있습니다.

```
// List all prefixes ("directories") and objects ("files") in the bucket
$results = $s3Client->getPaginator('ListObjects', [
    'Bucket'    => 'amzn-s3-demo-bucket',
    'Delimiter' => '/'
]);

$expression = '[CommonPrefixes[].Prefix, Contents[].Key][]';
foreach ($results->search($expression) as $item) {
    echo $item . "\n";
}
```

## 비동기 페이지 매김
<a name="async-paginators"></a>

`each()`의 `Aws\ResultPaginator` 메서드에 콜백을 제공하여 페이지네이터의 결과를 비동기적으로 반복할 수 있습니다. 페이지네이터에서 산출되는 각 값에 대해 콜백이 호출됩니다.

```
$results = $s3Client->getPaginator('ListObjects', [
    'Bucket' => 'amzn-s3-demo-bucket'
]);

$promise = $results->each(function ($result) {
    echo 'Got ' . var_export($result, true) . "\n";
});
```

**참고**  
`each()` 메서드를 사용하면 다른 요청을 비동기적으로 동시에 전송하면서 API 작업의 결과에 페이지를 매길 수 있습니다.

기본 코루틴 기반 promise에서 콜백의 null이 아닌 반환 값이 산출됩니다. 따라서 남은 항목을 계속 반복하여 본질적으로 다른 promise를 반복에 병합하기 전에 해결해야 하는 콜백의 promise를 반환할 수 있습니다. 콜백에서 반환되는 마지막 null이 아닌 값은 다운스트림 promise까지 promise를 이행하는 결과입니다. 마지막 반환 값이 promise인 경우 해당 promise의 해결은 다운스트림 promise를 이행하거나 거부하는 결과입니다.

```
// Delete all keys that end with "Foo"
$promise = $results->each(function ($result) use ($s3Client) {
    if (substr($result['Key'], -3) === 'Foo') {
        // Merge this promise into the iterator
        return $s3Client->deleteAsync([
            'Bucket' => 'amzn-s3-demo-bucket',
            'Key'    => 'Foo'
        ]);
    }
});

$promise
    ->then(function ($result) {
        // Result would be the last result to the deleteAsync operation
    })
    ->otherwise(function ($reason) {
        // Reason would be an exception that was encountered either in the
        // call to deleteAsync or calls performed while iterating
    });

// Forcing a synchronous wait will also wait on all of the deleteAsync calls
$promise->wait();
```