

# DynamoDB에서의 쿼리 작업에 대한 키 조건 표현식
<a name="Query.KeyConditionExpressions"></a>

키 조건 표현식에서는 첫 번째 문자가 `a-z` 또는 `A-Z`이고 나머지 문자(두 번째 문자부터 시작, 있는 경우)가 `a-z`, `A-Z` 또는 `0-9`인 경우에 한해 속성 이름은 아무거나 사용할 수 있습니다. 또한 속성 이름이 DynamoDB 예약어가 되어서는 안 됩니다. (예약어 전체 목록은 [DynamoDB의 예약어](ReservedWords.md) 단원을 참조하세요.) 속성 이름이 이러한 요건을 만족하지 않으면 표현식 속성 이름을 자리 표시자로 정의해야 합니다. 자세한 내용은 [DynamoDB의 표현식 속성 이름(별칭)](Expressions.ExpressionAttributeNames.md) 섹션을 참조하세요.

일정한 파티션 키 값을 갖는 항목들에 대해서는 DynamoDB가 정렬 키 값을 기준으로 순서를 정렬하여 모두 함께 저장합니다. `Query` 작업을 할 때는 DynamoDB는 정렬된 순서대로 항목을 가져온 다음 `FilterExpression`과 모든 `KeyConditionExpression`(있는 경우)을 사용해 항목을 처리합니다. 그러면 클라이언트에게는 `Query` 결과만 다시 보내집니다.

`Query` 작업은 항상 결과 집합을 반환합니다. 일치하는 항목이 없다면 결과 집합은 비어 있습니다.

`Query` 결과는 항상 정렬 키 값을 기준으로 정렬됩니다. 정렬 키의 데이터 형식이 `Number`이면 결과가 숫자 순서대로 반환됩니다. 그렇지 않으면 결과가 UTF-8 바이트 순서로 반환됩니다. 기본적으로 정렬 순서는 오름차순입니다. 오름차순을 역순으로 바꾸려면 `ScanIndexForward` 파라미터를 `false`로 설정하면 됩니다.

단일 `Query` 작업은 최대 1MB의 데이터를 가져올 수 있습니다. 이러한 크기 제한은 `FilterExpression` 또는 `ProjectionExpression`이 결과에 반영되기 전에 적용됩니다. 응답에 `LastEvaluatedKey`가 존재하고 null이 아니라면 결과 집합을 페이지 매김해야 합니다([DynamoDB의 테이블 쿼리 결과 페이지 매김](Query.Pagination.md) 참조).

## 키 조건 표현식 예제
<a name="Query.KeyConditionExpressions-example"></a>

검색 기준을 지정하려면 테이블 또는 인덱스에서 읽을 항목을 결정하는 문자열인 *키 조건 표현식*을 사용합니다.

파티션 키 이름 및 값은 등식 조건으로 지정해야 합니다. 키 조건 표현식에는 키가 아닌 속성을 사용할 수 없습니다.

정렬 키의 두 번째 조건(있는 경우)은 옵션으로 입력할 수 있습니다. 단, 정렬 키 조건은 다음 중 한 가지 비교 연산자를 사용해야 합니다.
+ `a = b` - 속성 *a*가 값 *b*와 같은 경우 true
+ `a < b` - *a*가 *b*보다 작은 경우 true
+ `a <= b` - *a*가 *b*보다 작거나 같은 경우 true
+ `a > b` - *a*가 *b*보다 큰 경우 true
+ `a >= b` - *a*가 *b*보다 크거나 같은 경우 true
+ `a BETWEEN b AND c` - *a*가 *b*보다 크거나 같고 *c*보다 작거나 같은 경우 true

다음 함수도 지원됩니다.
+ `begins_with (a, substr)` - `a` 속성 값이 특정 하위 문자열로 시작하는 경우 true

다음 AWS Command Line Interface(AWS CLI) 예제는 키 조건 표현식의 사용을 보여 줍니다. 이 표현식들은 실제 값이 아닌 자리 표시자(`:name` 및 `:sub`)를 사용합니다. 자세한 내용은 [DynamoDB의 표현식 속성 이름(별칭)](Expressions.ExpressionAttributeNames.md) 및 [DynamoDB에서 표현식 속성 값 사용](Expressions.ExpressionAttributeValues.md) 단원을 참조하세요.

**Example**  
`Thread` 테이블에 대한 쿼리를 실행하여 특정 `ForumName`(파티션 키)을 찾습니다. 쿼리 결과에 따라 `ForumName` 값을 갖는 항목을 모두 읽어옵니다. 정렬 키(`Subject`)가 `KeyConditionExpression`에 추가되지 않았기 때문입니다.  

```
aws dynamodb query \
    --table-name Thread \
    --key-condition-expression "ForumName = :name" \
    --expression-attribute-values  '{":name":{"S":"Amazon DynamoDB"}}'
```

**Example**  
`Thread` 테이블에 대한 쿼리를 실행하여 특정 `ForumName`(파티션 키)을 찾습니다. 하지만 이번에는 `Subject`(정렬 키)를 갖는 항목만 반환됩니다.  

```
aws dynamodb query \
    --table-name Thread \
    --key-condition-expression "ForumName = :name and Subject = :sub" \
    --expression-attribute-values  file://values.json
```
`--expression-attribute-values`의 인수는 `values.json` 파일에 저장됩니다.  

```
{
    ":name":{"S":"Amazon DynamoDB"},
    ":sub":{"S":"DynamoDB Thread 1"}
}
```

**Example**  
`Reply` 테이블에 대해 쿼리를 실행하여 특정 `Id`(파티션 키)를 찾습니다. 하지만 `ReplyDateTime`(정렬 키)이 몇 가지 문자로 시작되는 항목만 반환됩니다.  

```
aws dynamodb query \
    --table-name Reply \
    --key-condition-expression "Id = :id and begins_with(ReplyDateTime, :dt)" \
    --expression-attribute-values  file://values.json
```
`--expression-attribute-values`의 인수는 `values.json` 파일에 저장됩니다.  

```
{
    ":id":{"S":"Amazon DynamoDB#DynamoDB Thread 1"},
    ":dt":{"S":"2015-09"}
}
```