

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

# AWS SDK for PHP 버전 3의 웨이터
<a name="guide_waiters"></a>

Waiter를 사용하면 리소스를 폴링하여 리소스가 특정 상태로 전환될 때까지 대기할 수 있는 추상화된 방법을 제공하여 시스템을 더 쉽고 *일관되게* 사용할 수 있습니다. 클라이언트에서 지원되는 Waiter 목록은 서비스 클라이언트의 [API 설명서](https://docs.aws.amazon.com/aws-sdk-php/v3/api/index.html)에서 확인할 수 있습니다. 그곳으로 이동하려면 API 설명서의 클라이언트 페이지로 이동하여 특정 버전 번호 (날짜로 표시) 로 이동한 다음 'Waiters' 섹션으로 스크롤합니다. [이 링크를 클릭하면 S3의 웨이터 섹션으로 이동합니다.](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#waiters)

다음 예에서 Amazon S3 클라이언트는 버킷을 생성하는 데 사용됩니다. Waiter는 버킷이 존재할 때까지 대기하는 데 사용됩니다.

```
// Create a bucket
$s3Client->createBucket(['Bucket' => 'amzn-s3-demo-bucket']);

// Wait until the created bucket is available
$s3Client->waitUntil('BucketExists', ['Bucket' => 'amzn-s3-demo-bucket']);
```

waiter에서 버킷을 지나치게 많이 폴링해야 하는 경우 `\RuntimeException` 예외를 발생합니다.

## Waiter 구성
<a name="waiter-configuration"></a>

Waiter는 구성 옵션의 결합형 배열을 기반으로 합니다. 특정 waiter에서 사용되는 모든 옵션은 기본값이 있지만, 다른 대기 전략을 지원하도록 재정의할 수 있습니다.

`@waiter` 옵션의 결합형 배열을 클라이언트의 `$args` 및 `waitUntil()` 메서드의 `getWaiter()` 인수에 전달하여 waiter 구성 옵션을 수정할 수 있습니다.

```
// Providing custom waiter configuration options to a waiter
$s3Client->waitUntil('BucketExists', [
    'Bucket'  => 'amzn-s3-demo-bucket',
    '@waiter' => [
        'delay'       => 3,
        'maxAttempts' => 10
    ]
]);
```

**delay (int)**  
폴링 시도 사이의 지연 시간(초)입니다. 각 waiter에는 기본 `delay` 구성 값이 있지만, 특정 사용 사례에 대해 이 설정을 수정해야 할 수 있습니다.

**maxAttempts (int)**  
waiter를 실패로 처리하기 이전의 최대 폴링 시도 횟수입니다. 이 옵션은 리소스를 무기한으로 대기하지 않도록 해줍니다. 각 waiter에는 기본 `maxAttempts` 구성 값이 있지만, 특정 사용 사례에 대해 이 설정을 수정해야 할 수 있습니다.

**initDelay (int)**  
최초 폴링 시도 이전에 대기할 시간(초)입니다. 이 옵션은 원하는 상태로 전환되는 데 시간이 걸릴 것을 알고 잇는 리소스를 대기할 때 유용합니다.

**before (callable)**  
각 시도 전에 호출되는 PHP callable 함수입니다. callable 함수는 실행할 `Aws\CommandInterface` 명령과 지금까지 실행된 횟수를 기준으로 호출됩니다. `before` callable 함수를 사용하여 실행되기 전에 명령을 수정하거나 진행률 정보를 제공할 수 있습니다.  

```
use Aws\CommandInterface;

$s3Client->waitUntil('BucketExists', [
    'Bucket'  => 'amzn-s3-demo-bucket',
    '@waiter' => [
        'before' => function (CommandInterface $command, $attempts) {
            printf(
                "About to send %s. Attempt %d\n",
                $command->getName(),
                $attempts
            );
        }
    ]
]);
```

## 비동기적 대기
<a name="async-waiters"></a>

비동기적으로 대기하는 이외에 waiter를 호출하여 다른 요청을 보내거나 한 번에 여러 리소스를 대기하면서 비동기적으로 대기할 수 있습니다.

클라이언트의 `getWaiter($name, array $args = [])` 메서드를 사용하여 클라이언트에서 waiter를 검색하여 waiter promise에 액세스할 수 있습니다. waiter의 `promise()` 메서드를 사용하여 waiter를 시작합니다. waiter promise는 waiter에서 실행된 마지막 `Aws\CommandInterface`를 통해 이행되며, 오류 시 `RuntimeException`과 함께 거부됩니다.

```
use Aws\CommandInterface;

$waiterName = 'BucketExists';
$waiterOptions = ['Bucket' => 'amzn-s3-demo-bucket'];

// Create a waiter promise
$waiter = $s3Client->getWaiter($waiterName, $waiterOptions);

// Initiate the waiter and retrieve a promise
$promise = $waiter->promise();

// Call methods when the promise is resolved.
$promise
    ->then(function () {
        echo "Waiter completed\n";
    })
    ->otherwise(function (\Exception $e) {
        echo "Waiter failed: " . $e . "\n";
    });

// Block until the waiter completes or fails. Note that this might throw
// a \RuntimeException if the waiter fails.
$promise->wait();
```

일부 강력하고 상대적으로 낮은 오버헤드 사용 사례에서 promise 기반 waiter API를 노출할 수 있습니다. 예를 들어, 여러 리소스를 대기하고, 확인된 첫 번째 waiter를 처리하려는 경우 어떻게 될까요?

```
use Aws\CommandInterface;

// Create an array of waiter promises
$promises = [
    $s3Client->getWaiter('BucketExists', ['Bucket' => 'a'])->promise(),
    $s3Client->getWaiter('BucketExists', ['Bucket' => 'b'])->promise(),
    $s3Client->getWaiter('BucketExists', ['Bucket' => 'c'])->promise()
];

// Initiate a race between the waiters, fulfilling the promise with the
// first waiter to complete (or the first bucket to become available)
$any = Promise\any($promises)
    ->then(function (CommandInterface $command) {
        // This is invoked with the command that succeeded in polling the
        // resource. Here we can know which bucket won the race.
        echo "The {$command['Bucket']} waiter completed first!\n";
    });

// Force the promise to complete
$any->wait();
```