

# DynamoDB 조건 표현식 CLI 예제
<a name="Expressions.ConditionExpressions"></a>

다음은 조건 표현식을 사용하는 몇 가지 AWS Command Line Interface(AWS CLI) 예제입니다. 이 예제는 `ProductCatalog`에서 소개된 [DynamoDB에서 표현식 사용 시 항목 속성 참조](Expressions.Attributes.md) 테이블을 기반으로 합니다. 이 테이블의 파티션 키는 `Id`이며 정렬 키는 없습니다. 다음 `PutItem` 작업은 예제에서 참조할 샘플 `ProductCatalog` 항목을 생성합니다.

```
aws dynamodb put-item \
    --table-name ProductCatalog \
    --item file://item.json
```

`--item`의 인수는 `item.json` 파일에 저장됩니다. 간소화를 위해 항목 속성 몇 개만 사용됩니다.

```
{
    "Id": {"N": "456" },
    "ProductCategory": {"S": "Sporting Goods" },
    "Price": {"N": "650" }
}
```

**Topics**
+ [조건부 추가](#Expressions.ConditionExpressions.PreventingOverwrites)
+ [조건부 삭제](#Expressions.ConditionExpressions.AdvancedComparisons)
+ [조건부 업데이트](#Expressions.ConditionExpressions.SimpleComparisons)
+ [조건부 표현식 예시](#Expressions.ConditionExpressions.ConditionalExamples)

## 조건부 추가
<a name="Expressions.ConditionExpressions.PreventingOverwrites"></a>

`PutItem` 작업은 동일한 프라이머리 키가 있는 항목을 덮어씁니다(있는 경우). 이 동작을 방지하려면 조건 표현식을 사용합니다. 이렇게 하면 해당 항목에 동일한 프라이머리 키가 아직 없는 경우에만 쓰기를 진행할 수 있습니다.

다음 예제에서는 `attribute_not_exists()`를 사용하여, 쓰기 작업을 시도하기 전에 테이블에 프라이머리 키가 있는지 확인합니다.

**참고**  
프라이머리 키가 파티션 키(pk)와 정렬 키(sk)로 구성된 경우 이 파라미터는 쓰기 작업을 시도하기 전에 `attribute_not_exists(pk)` AND `attribute_not_exists(sk)` 전체 문이 true로 평가되는지 아니면 false로 평가되는지 확인합니다.

```
aws dynamodb put-item \
    --table-name ProductCatalog \
    --item file://item.json \
    --condition-expression "attribute_not_exists(Id)"
```

조건 표현식이 false로 평가되는 경우 DynamoDB는 조건부 요청 실패라는 오류 메시지를 반환합니다.

**참고**  
`attribute_not_exists` 및 기타 함수에 대한 자세한 내용은 [DynamoDB의 조건 및 필터 표현식, 연산자, 함수](Expressions.OperatorsAndFunctions.md)을 참조하세요.

## 조건부 삭제
<a name="Expressions.ConditionExpressions.AdvancedComparisons"></a>

조건부 삭제를 수행하려면 조건 표현식과 함께 `DeleteItem` 작업을 사용합니다. 작업이 성공하려면 조건식이 true로 평가되어야 하며, 그렇지 않으면 작업이 실패합니다.

위에서 정의한 항목을 고려해 보겠습니다.

다음 조건에서만 항목을 삭제하려 한다고 가정합니다.
+  `ProductCategory`는 "스포츠 상품" 또는 "원예용 소모품"입니다.
+  `Price`는 500에서 600 사이입니다.

다음 예제에서는 항목을 삭제하려고 시도합니다.

```
aws dynamodb delete-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"456"}}' \
    --condition-expression "(ProductCategory IN (:cat1, :cat2)) and (Price between :lo and :hi)" \
    --expression-attribute-values file://values.json
```

`--expression-attribute-values`의 인수는 `values.json` 파일에 저장됩니다.

```
{
    ":cat1": {"S": "Sporting Goods"},
    ":cat2": {"S": "Gardening Supplies"},
    ":lo": {"N": "500"},
    ":hi": {"N": "600"}
}
```

**참고**  
조건 표현식에서 `:`(콜론 문자)은 실제 값의 자리 표시자인 *표현식 속성 값*을 나타냅니다. 자세한 내용은 [DynamoDB에서 표현식 속성 값 사용](Expressions.ExpressionAttributeValues.md) 섹션을 참조하세요.  
`IN`, `AND` 및 기타 키워드에 대한 자세한 내용은 [DynamoDB의 조건 및 필터 표현식, 연산자, 함수](Expressions.OperatorsAndFunctions.md) 섹션을 참조하세요.

이 예에서 `ProductCategory` 비교는 true로 평가되지만 `Price` 비교는 false로 평가됩니다. 이로 인해 조건 표현식이 false로 평가되고 `DeleteItem` 작업이 실패합니다.

## 조건부 업데이트
<a name="Expressions.ConditionExpressions.SimpleComparisons"></a>

조건부 업데이트를 수행하려면 조건 표현식과 함께 `UpdateItem` 작업을 사용합니다. 작업이 성공하려면 조건식이 true로 평가되어야 하며, 그렇지 않으면 작업이 실패합니다.

**참고**  
`UpdateItem`은 *업데이트 표현식*도 지원하는데, 이 표현식에서 사용자는 항목에 대해 변경하고자 하는 사항을 지정합니다. 자세한 내용은 [DynamoDB에서 업데이트 표현식 사용](Expressions.UpdateExpressions.md) 섹션을 참조하세요.

위에서 정의한 항목으로 시작했다고 가정합니다.

다음 예제에서는 `UpdateItem` 작업을 수행합니다. 이 작업은 제품의 `Price`를 75만큼 감소시키려고 시도하지만, 조건 표현식은 현재 `Price`가 500보다 작거나 같은 경우 업데이트를 방지합니다.

```
aws dynamodb update-item \
    --table-name ProductCatalog \
    --key '{"Id": {"N": "456"}}' \
    --update-expression "SET Price = Price - :discount" \
    --condition-expression "Price > :limit" \
    --expression-attribute-values file://values.json
```

`--expression-attribute-values`의 인수는 `values.json` 파일에 저장됩니다.

```
{
    ":discount": { "N": "75"},
    ":limit": {"N": "500"}
}
```

시작 `Price`가 650이면 `UpdateItem` 작업은 `Price`를 575로 감소시킵니다. `UpdateItem` 작업을 다시 실행하면 `Price`는 500으로 감소됩니다. 세 번째로 작업을 실행하면 조건 표현식이 false로 평가되고 업데이트가 실패합니다.

**참고**  
조건 표현식에서 `:`(콜론 문자)은 실제 값의 자리 표시자인 *표현식 속성 값*을 나타냅니다. 자세한 내용은 [DynamoDB에서 표현식 속성 값 사용](Expressions.ExpressionAttributeValues.md) 섹션을 참조하세요.  
"*>*" 및 기타 연산자에 대한 자세한 내용은 [DynamoDB의 조건 및 필터 표현식, 연산자, 함수](Expressions.OperatorsAndFunctions.md)를 참조하세요.

## 조건부 표현식 예시
<a name="Expressions.ConditionExpressions.ConditionalExamples"></a>

다음 예에 사용된 함수에 대한 자세한 내용은 [DynamoDB의 조건 및 필터 표현식, 연산자, 함수](Expressions.OperatorsAndFunctions.md) 섹션을 참조하세요. 표현식에서 다양한 속성 유형을 지정하는 방법에 대한 자세한 내용은 [DynamoDB에서 표현식 사용 시 항목 속성 참조](Expressions.Attributes.md) 섹션을 참조하세요.

### 항목의 속성 확인
<a name="Expressions.ConditionExpressions.CheckingForAttributes"></a>

속성이 존재하는지(또는 존재하지 않는지)를 확인할 수 있습니다. 조건 표현식이 true로 평가되는 경우 작업이 성공하고, 그렇지 않으면 작업이 실패합니다.

다음 예제에서는 `attribute_not_exists`를 사용하여 `Price` 속성이 없는 경우에만 제품을 삭제합니다.

```
aws dynamodb delete-item \
    --table-name ProductCatalog \
    --key '{"Id": {"N": "456"}}' \
    --condition-expression "attribute_not_exists(Price)"
```

DynamoDB는 `attribute_exists` 함수도 제공합니다. 다음 예제에서는 좋지 않은 평가를 받은 경우에만 제품을 삭제합니다.

```
aws dynamodb delete-item \
    --table-name ProductCatalog \
    --key '{"Id": {"N": "456"}}' \
    --condition-expression "attribute_exists(ProductReviews.OneStar)"
```

### 속성 유형 확인
<a name="Expressions.ConditionExpressions.CheckingForAttributeType"></a>

`attribute_type` 함수를 사용하여 속성 값의 데이터 형식을 확인할 수 있습니다. 조건 표현식이 true로 평가되는 경우 작업이 성공하고, 그렇지 않으면 작업이 실패합니다.

다음 예제에서는 문자열 집합 형식의 `attribute_type` 속성이 있는 경우에만 `Color`을 사용하여 제품을 삭제합니다.

```
aws dynamodb delete-item \
    --table-name ProductCatalog \
    --key '{"Id": {"N": "456"}}' \
    --condition-expression "attribute_type(Color, :v_sub)" \
    --expression-attribute-values file://expression-attribute-values.json
```

`--expression-attribute-values`의 인수는 expression-attribute-values.json 파일에 저장됩니다.

```
{
    ":v_sub":{"S":"SS"}
}
```

### 문자열 시작 값 확인
<a name="Expressions.ConditionExpressions.CheckingBeginsWith"></a>

`begins_with` 함수를 사용하여 문자열 속성 값이 특정 하위 문자열로 시작하는지 확인할 수 있습니다. 조건 표현식이 true로 평가되는 경우 작업이 성공하고, 그렇지 않으면 작업이 실패합니다.

다음 예제에서는 `begins_with` 맵의 `FrontView` 요소가 특정 값으로 시작하는 경우에만 `Pictures`를 사용하여 제품을 삭제합니다.

```
aws dynamodb delete-item \
    --table-name ProductCatalog \
    --key '{"Id": {"N": "456"}}' \
    --condition-expression "begins_with(Pictures.FrontView, :v_sub)" \
    --expression-attribute-values file://expression-attribute-values.json
```

`--expression-attribute-values`의 인수는 expression-attribute-values.json 파일에 저장됩니다.

```
{
    ":v_sub":{"S":"http://"}
}
```

### 세트의 요소 확인
<a name="Expressions.ConditionExpressions.CheckingForContains"></a>

`contains` 함수를 사용하여 집합의 요소를 확인하거나 문자열 내의 하위 문자열을 찾을 수 있습니다. 조건 표현식이 true로 평가되는 경우 작업이 성공하고, 그렇지 않으면 작업이 실패합니다.

다음 예제에서는 `contains` 문자열 집합에 특정 값을 가진 요소가 있는 경우에만 `Color`를 사용하여 제품을 삭제합니다.

```
aws dynamodb delete-item \
    --table-name ProductCatalog \
    --key '{"Id": {"N": "456"}}' \
    --condition-expression "contains(Color, :v_sub)" \
    --expression-attribute-values file://expression-attribute-values.json
```

`--expression-attribute-values`의 인수는 expression-attribute-values.json 파일에 저장됩니다.

```
{
    ":v_sub":{"S":"Red"}
}
```

### 속성 값의 크기 확인
<a name="Expressions.ConditionExpressions.CheckingForSize"></a>

`size` 함수를 사용하여 속성 값의 크기를 확인할 수 있습니다. 조건 표현식이 true로 평가되는 경우 작업이 성공하고, 그렇지 않으면 작업이 실패합니다.

다음 예제에서는 `size` 이진 속성의 크기가 `VideoClip`바이트보다 큰 경우만 `64000`를 사용하여 제품을 삭제합니다.

```
aws dynamodb delete-item \
    --table-name ProductCatalog \
    --key '{"Id": {"N": "456"}}' \
    --condition-expression "size(VideoClip) > :v_sub" \
    --expression-attribute-values file://expression-attribute-values.json
```

`--expression-attribute-values`의 인수는 expression-attribute-values.json 파일에 저장됩니다.

```
{
    ":v_sub":{"N":"64000"}
}
```