

# DynamoDB의 테이블 쿼리 결과 페이지 매김
<a name="Query.Pagination"></a>

DynamoDB는 `Query` 작업 결과의 *페이지를 매깁니다*. 페이지를 매기면 `Query` 결과는 크기가 1MB 이하인 데이터 ‘페이지’로 분리됩니다. 애플리케이션은 결과의 첫 번째 페이지를 처리한 다음 두 번째 페이지를 처리하고 이런 식으로 계속할 수 있습니다.

단일 `Query`는 1MB 크기 한도 내에 맞는 결과 집합만 반환합니다. 추가 결과가 있는지 확인하고 이러한 결과를 한번에 한 페이지에 가져오려면 애플리케이션에서 다음을 수행해야 합니다.

1. 하위 수준 `Query` 결과를 확인합니다.
   + 결과가 `LastEvaluatedKey` 요소를 포함하고 null이 아닌 경우 2단계로 계속합니다.
   + 결과에 `LastEvaluatedKey`가 *없는* 경우 더 이상 가져올 항목이 없습니다.

1. 동일한 `KeyConditionExpression`을 사용하여 `Query`를 구성합니다. 그러나 이번에는 1단계에서 `LastEvaluatedKey` 값을 가져와서 새로운 `ExclusiveStartKey` 요청의 `Query` 파라미터로 사용합니다.

1. 새로운 `Query` 요청을 실행합니다.

1. 1단계로 이동합니다.

다시 말해서, `LastEvaluatedKey` 응답의 `Query`를 다음 `ExclusiveStartKey` 요청에 대한 `Query`로 사용해야 합니다. `LastEvaluatedKey` 응답에 `Query` 요소가 없는 경우 결과의 최종 페이지를 검색한 것입니다. `LastEvaluatedKey`가 비어 있지 않는 경우 결과 집합에 데이터가 더 있음을 의미하는 것은 아닙니다. 결과 집합의 마지막 페이지를 알 수 있는 유일한 방법은 `LastEvaluatedKey`가 비어 있을 때입니다.

AWS CLI를 사용하여 이 동작을 볼 수 있습니다. AWS CLI는 `LastEvaluatedKey`가 결과에 더 이상 없을 때까지 하위 수준 `Query` 요청을 DynamoDB에 반복적으로 보냅니다. 특정 연도의 영화 제목을 검색하는 다음 AWS CLI 예제를 살펴보세요.

```
aws dynamodb query --table-name Movies \
    --projection-expression "title" \
    --key-condition-expression "#y = :yyyy" \
    --expression-attribute-names '{"#y":"year"}' \
    --expression-attribute-values '{":yyyy":{"N":"1993"}}' \
    --page-size 5 \
    --debug
```

일반적으로 AWS CLI에서는 페이지 매김이 자동으로 처리됩니다. 그러나 이 예제에서는 AWS CLI `--page-size` 파라미터가 페이지당 항목 수를 제한합니다. `--debug` 파라미터는 요청 및 응답에 대한 하위 수준 정보를 출력합니다.

예제를 실행하면 DynamoDB의 첫 응답이 다음과 유사합니다.

```
2017-07-07 11:13:15,603 - MainThread - botocore.parsers - DEBUG - Response body:
b'{"Count":5,"Items":[{"title":{"S":"A Bronx Tale"}},
{"title":{"S":"A Perfect World"}},{"title":{"S":"Addams Family Values"}},
{"title":{"S":"Alive"}},{"title":{"S":"Benny & Joon"}}],
"LastEvaluatedKey":{"year":{"N":"1993"},"title":{"S":"Benny & Joon"}},
"ScannedCount":5}'
```

응답의 `LastEvaluatedKey`는 가져온 항목이 전부가 아님을 나타냅니다. 그러면 AWS CLI는 DynamoDB에 다른 `Query` 요청을 보냅니다. 이 요청과 응답 패턴은 마지막 응답이 반환될 때까지 계속됩니다.

```
2017-07-07 11:13:16,291 - MainThread - botocore.parsers - DEBUG - Response body:
b'{"Count":1,"Items":[{"title":{"S":"What\'s Eating Gilbert Grape"}}],"ScannedCount":1}'
```

`LastEvaluatedKey`가 없으면 가져올 항목이 더 이상 없음을 나타냅니다.

**참고**  
AWS SDK는 하위 수준 DynamoDB 응답(`LastEvaluatedKey`의 유무 포함)을 처리하여 `Query` 결과 페이지 매김에 대해 다양한 추상을 제공합니다. 예를 들어, SDK for Java 문서 인터페이스는 `java.util.Iterator` 지원을 제공하므로 한 번에 하나씩 결과를 볼 수 있습니다.  
다양한 프로그래밍 언어의 코드 예제를 보려면 [Amazon DynamoDB 시작 안내서](https://docs.aws.amazon.com/amazondynamodb/latest/gettingstartedguide/) 및 해당 언어의 AWS SDK 설명서를 참조하세요.

`Query` 작업의 `Limit` 파라미터를 사용하여 결과 세트의 항목 수를 제한하여 페이지 크기를 줄일 수도 있습니다.

DynamoDB를 사용한 쿼리 방법에 대한 자세한 내용은 [DynamoDB에서 테이블 쿼리](Query.md) 단원을 참조하세요.