

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

# Amazon EC2 API의 페이지 매김
<a name="ec2-api-pagination"></a>

`DescribeInstances`와 같이 잠재적으로 많은 결과를 반환할 수 있는 설명 작업을 직접 호출할 때 페이지 매김을 사용하는 것이 좋습니다. 페이지 매김을 사용하면 설명 직접 호출에서 반환되는 항목 수와 직접 호출이 반환되는 데 걸리는 시간이 제한됩니다. 리소스가 많은 경우 페이지가 지정되지 않은 직접 호출이 스로틀링되어 시간이 초과될 수 있습니다. 따라서 페이지가 매겨진 직접 호출은 페이지가 매겨지지 않은 직접 호출보다 전체 지연 시간이 더 우수합니다. 페이지가 매겨진 직접 호출은 일관되게 성공하기 때문입니다.

자세한 내용은 *Amazon EC2 API Reference*(Amazon EC2 API 레퍼런스)의 [Pagination](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination)(페이지네이션)을 참조하세요.

## 모범 사례
<a name="pagination-best-practices"></a>

가능하면 설명 직접 호출에 리소스 ID 목록을 지정합니다. 이는 많은 리소스를 설명하는 가장 빠른 방법입니다. 단, 직접 호출 한 번에 1,000개 이상의 ID를 지정해서는 안 됩니다. 다음은 예입니다.

```
private List<Reservation> describeMyInstances(List<String> ids){
    if (ids == null || ids.isEmpty()) {
        return ImmutableList.of();
    }
        
    final DescribeInstancesRequest request = new DescribeInstancesRequest()
            .withInstanceIds(ids);

    return ec2.describeInstances(request).getReservations();
}
```

설명 직접 호출에 리소스 ID를 지정할 수 없는 경우 페이지 매김을 사용하는 것이 좋습니다. 다음은 예입니다.

```
private List<Reservation> describeMyInstances(final Collection<Filter> filters){
    final DescribeInstancesRequest request = new DescribeInstancesRequest()
            .withFilters(filters)
            .withMaxResults(1000);

    List<Reservation> reservations = new ArrayList<>();
    String nextToken = null;
    do {
        request.setNextToken(nextToken);
        final DescribeInstancesResult response = ec2.describeInstances(request);
        reservations.addAll(response.getReservations());
        nextToken = response.getNextToken();
    } while (nextToken != null);

    return reservations;
}
```

페이지가 매겨진 직접 호출을 다시 시도해야 하는 경우 [지터와 함께 지수 백오프](ec2-api-throttling.md#api-backoff)를 사용합니다.

## 일반적인 문제
<a name="pagination-common-issues"></a>

다음은 실수로 페이지가 지정되지 않은 직접 호출을 수행하는 코드의 예제입니다.

**Example 예제 문제: 빈 리소스 ID 목록 전달**  
다음 코드는 ID 목록을 사용합니다. 그러나 목록이 비어 있으면 페이지가 지정되지 않은 직접 호출이 발생합니다.  

```
private List<Reservation> describeMyInstances(List<String> ids){
    final DescribeInstancesRequest request = new DescribeInstancesRequest()
            .withInstanceIds(ids);

    return ec2.describeInstances(request).getReservations();
}
```
이 문제를 해결하려면 설명 직접 호출을 수행하기 전에 목록이 비어 있지 않은지 확인합니다.  

```
private List<Reservation> describeMyInstances(List<String> ids){
    if (ids == null || ids.isEmpty()) {
        return ImmutableList.of();
        // OR
        return Lists.newArrayList();
        // OR
        return new ArrayList<>();
    }
        
    final DescribeInstancesRequest request = new DescribeInstancesRequest()
            .withInstanceIds(ids);

    return ec2.describeInstances(request).getReservations();
}
```

**Example 예제 문제: MaxResults가 설정되지 않음**  
다음 코드는 `nextToken`을 확인하고 사용하지만, `MaxResults`를 설정하지는 않습니다.  

```
private List<Reservation> describeMyInstances(final Collection<Filter> filters){
    final DescribeInstancesRequest request = new DescribeInstancesRequest()
            .withFilters(filters);

    List<Reservation> reservations = new ArrayList<>();
    String nextToken = null;
    do {
        request.setNextToken(nextToken);
        final DescribeInstancesResult response = ec2.describeInstances(request);
        reservations.addAll(response.getReservations());
        nextToken = response.getNextToken();
    } while (nextToken != null);

    return reservations;
}
```
이 문제를 해결하려면 다음과 같이 `withMaxResults`를 추가합니다.  

```
private List<Reservation> describeMyInstances(final Collection<Filter> filters){
    final DescribeInstancesRequest request = new DescribeInstancesRequest()
            .withFilters(filters)
            .withMaxResults(1000);

    List<Reservation> reservations = new ArrayList<>();
    String nextToken = null;
    do {
        request.setNextToken(nextToken);
        final DescribeInstancesResult response = ec2.describeInstances(request);
        reservations.addAll(response.getReservations());
        nextToken = response.getNextToken();
    } while (nextToken != null);

    return reservations;
}
```