

# Expected(레거시)
<a name="LegacyConditionalParameters.Expected"></a>

**참고**  
가능하면 이러한 레거시 파라미터 대신 새 표현식 파라미터를 사용하는 것이 좋습니다. 자세한 내용은 [DynamoDB에서 표현식 사용](Expressions.md) 섹션을 참조하세요. 이 파라미터를 대체하는 새 파라미터에 대한 자세한 내용은 [대신 *ConditionExpression*을 사용합니다.](#Expected.instead) 섹션을 참조하세요.

레거시 조건 파라미터 `Expected`는 `UpdateItem` 작업의 조건부 블록입니다. `Expected`는 속성/조건 페어의 맵입니다. 각 속성은 속성 이름, 비교 연산자 및 하나 이상의 값으로 구성됩니다. DynamoDB는 비교 연산자를 사용하여 속성을 제공된 값과 비교합니다. 각 `Expected` 요소에 대한 평가 결과는 true 또는 false입니다.

`Expected` 맵의 요소를 다수 지정하는 경우, 기본적으로 모든 조건이 true로 평가되어야 합니다. 즉, 조건은 `AND` 연산자를 사용하여 결합됩니다. (대신 `ConditionalOperator` 파라미터를 사용하여 조건을 OR로 연결할 수 있습니다. 이렇게 하는 경우 모든 조건이 아니라 조건 중 하나 이상이 true로 평가되어야 합니다.)

`Expected` 맵이 true로 평가되면 조건부 작업이 성공하지만, 그렇지 않으면 실패합니다.

 `Expected`는 다음을 포함합니다.
+  `AttributeValueList` - 제공된 속성에 대해 평가되는 하나 이상의 값. 목록에 있는 값의 개수는 사용되는 `ComparisonOperator`에 따라 달라집니다.

  숫자 유형의 경우 값 비교가 숫자입니다.

  크다, 같다 또는 작다 등의 문자열 값 비교는 UTF-8 이진 인코딩을 사용하는 유니코드를 기준으로 합니다. 예를 들어 `a`는 `A`보다 크고 `a`는 `B`보다 큽니다.

  이진수 유형의 경우, DynamoDB가 이진수 값을 비교할 때 이진수 데이터의 각 바이트를 부호가 없는 것으로 처리합니다.
+  `ComparisonOperator` - 의 속성을 평가하는 비교기입니다.`AttributeValueList` 비교를 수행하면 DynamoDB가 강력한 일관된 읽기(Strongly Consistent Read)를 사용합니다.

  다음 비교 연산자를 사용할 수 있습니다.

   `EQ | NE | LE | LT | GE | GT | NOT_NULL | NULL | CONTAINS | NOT_CONTAINS | BEGINS_WITH | IN | BETWEEN` 

  다음은 각 비교 연산자에 대한 설명입니다.
  +  `EQ` : 같음. `EQ`는 모든 데이터 형식(목록 및 맵 포함)에 대해 지원됩니다.

     `AttributeValueList`에는 문자열, 숫자, 이진수, 문자열 집합, 숫자 집합 또는 이진수 집합 유형의 `AttributeValue` 요소 하나만 포함될 수 있습니다. 요청에서 제공된 형식과 다른 형식의 `AttributeValue` 요소가 항목에 포함되어 있으면 값이 일치하지 않습니다. 예를 들어 `{"S":"6"}`은 `{"N":"6"}`과 같지 않습니다. 또한 `{"N":"6"}`은 `{"NS":["6", "2", "1"]}`과 같지 않습니다.
  +  `NE` : 같지 않음. `NE`는 모든 데이터 형식(목록 및 맵 포함)에 대해 지원됩니다.

     `AttributeValueList`에는 문자열, 숫자, 이진수, 문자열 집합, 숫자 집합 또는 이진수 집합 유형의 `AttributeValue` 하나만 포함될 수 있습니다. 항목에 요청에서 제공한 형식과 다른 형식의 `AttributeValue`가 포함되어 있으면 값이 일치하지 않습니다. 예를 들어 `{"S":"6"}`은 `{"N":"6"}`과 같지 않습니다. 또한 `{"N":"6"}`은 `{"NS":["6", "2", "1"]}`과 같지 않습니다.
  +  `LE` : 작거나 같음.

     `AttributeValueList`에는 문자열, 숫자, 이진수 유형의 `AttributeValue` 요소 하나만 포함될 수 있습니다(집합 유형 제외). 요청에서 제공된 형식과 다른 형식의 `AttributeValue` 요소가 항목에 포함되어 있으면 값이 일치하지 않습니다. 예를 들어 `{"S":"6"}`은 `{"N":"6"}`과 같지 않습니다. 또한 `{"N":"6"}`은 `{"NS":["6", "2", "1"]}`과 비교할 수 없습니다.
  +  `LT` : 작음.

     `AttributeValueList`에는 문자열, 숫자, 이진수 유형의 `AttributeValue` 하나만 포함될 수 있습니다(집합 유형 제외). 요청에서 제공된 형식과 다른 형식의 `AttributeValue` 요소가 항목에 포함되어 있으면 값이 일치하지 않습니다. 예를 들어 `{"S":"6"}`은 `{"N":"6"}`과 같지 않습니다. 또한 `{"N":"6"}`은 `{"NS":["6", "2", "1"]}`과 비교할 수 없습니다.
  +  `GE` : 크거나 같음.

     `AttributeValueList`에는 문자열, 숫자, 이진수 유형의 `AttributeValue` 요소 하나만 포함될 수 있습니다(집합 유형 제외). 요청에서 제공된 형식과 다른 형식의 `AttributeValue` 요소가 항목에 포함되어 있으면 값이 일치하지 않습니다. 예를 들어 `{"S":"6"}`은 `{"N":"6"}`과 같지 않습니다. 또한 `{"N":"6"}`은 `{"NS":["6", "2", "1"]}`과 비교할 수 없습니다.
  +  `GT` : 큼.

     `AttributeValueList`에는 문자열, 숫자, 이진수 유형의 `AttributeValue` 요소 하나만 포함될 수 있습니다(집합 유형 제외). 요청에서 제공된 형식과 다른 형식의 `AttributeValue` 요소가 항목에 포함되어 있으면 값이 일치하지 않습니다. 예를 들어 `{"S":"6"}`은 `{"N":"6"}`과 같지 않습니다. 또한 `{"N":"6"}`은 `{"NS":["6", "2", "1"]}`과 비교할 수 없습니다.
  +  `NOT_NULL` : 속성 있음. `NOT_NULL`은 모든 데이터 형식(목록 및 맵 포함)에 대해 지원됩니다.
**참고**  
이 연산자는 속성의 데이터 형식이 아닌 존재 여부를 테스트합니다. 속성 "`a`"의 데이터 형식이 null이고 `NOT_NULL`을 사용하여 평가하는 경우, 결과가 부울 `true`가 됩니다. 속성 "`a`"가 존재하기 때문에 이러한 결과가 나오는 것이며, 데이터 형식은 `NOT_NULL` 비교 연산자와 관련 없습니다.
  +  `NULL` : 속성 없음. `NULL`은 모든 데이터 형식(목록 및 맵 포함)에 대해 지원됩니다.
**참고**  
이 연산자는 속성의 데이터 형식이 아닌 비존재 여부를 테스트합니다. 속성 "`a`"의 데이터 형식이 null이고 `NULL`을 사용하여 평가하는 경우, 결과가 부울 `false`가 됩니다. 속성 "`a`"가 존재하기 때문에 이러한 결과가 나오는 것이며, 데이터 형식은 `NULL` 비교 연산자와 관련 없습니다.
  +  `CONTAINS`: 세트의 하위 시퀀스 또는 값 확인.

     `AttributeValueList`에는 문자열, 숫자, 이진수 유형의 `AttributeValue` 요소 하나만 포함될 수 있습니다(집합 유형 제외). 비교 대상의 속성이 문자열 유형이라면 연산자가 하위 문자열이 일치하는지 확인합니다. 비교 대상의 속성이 이진수 유형이라면 연산자가 대상에서 입력 이진수와 일치하는 부분 수열을 찾습니다. 비교 대상의 속성이 집합("`SS`", "`NS`" 또는 "`BS`")이라면 집합을 구성하는 어떤 요소든지 정확히 일치하는 것을 찾아야만 연산자가 true로 평가됩니다.

    CONTAINS는 목록의 경우 지원됩니다. "`a CONTAINS b`"를 평가할 때, "`a`"는 목록이 될 수 있지만, "`b`"는 집합, 맵 또는 목록이 될 수 없습니다.
  +  `NOT_CONTAINS`: 세트의 하위 시퀀스 부재 또는 값의 부재 확인.

     `AttributeValueList`에는 문자열, 숫자, 이진수 유형의 `AttributeValue` 요소 하나만 포함될 수 있습니다(집합 유형 제외). 비교 대상의 속성이 문자열이라면 연산자가 하위 문자열이 일치하지 않는지 확인합니다. 비교 대상의 속성이 이진수라면 연산자가 대상에서 입력 이진수와 일치하는 부분 수열이 없는지 확인합니다. 비교 대상의 속성이 집합("`SS`", "`NS`" 또는 "`BS`")이라면 집합을 구성하는 어떤 요소든지 정확히 일치하는 것을 찾지 못해야만(`does not`) 연산자가 true로 평가됩니다.

    NOT\$1CONTAINS는 목록의 경우 지원됩니다. "`a NOT CONTAINS b`"를 평가할 때, "`a`"는 목록이 될 수 있지만, "`b`"는 집합, 맵 또는 목록이 될 수 없습니다.
  +  `BEGINS_WITH`: 접두사 여부 확인.

     `AttributeValueList`에는 문자열 또는 이진수 유형의 `AttributeValue` 하나만 포함될 수 있습니다(숫자 또는 집합 유형 제외). 비교 대상의 속성은 문자열 또는 이진수 유형이 되어야 합니다(숫자 또는 집합 유형 제외).
  +  `IN`: 두 집합 안의 일치하는 요소 확인.

     `AttributeValueList`에는 문자열, 숫자 또는 이진수 유형 중 하나 이상의 `AttributeValue` 요소가 포함될 수 있습니다(집합 유형 제외). 이 속성들은 기존 집합 유형 항목 속성과 비교됩니다. 입력된 집합 요소 중 하나라도 항목 속성에 있으면 표현식은 true로 평가됩니다.
  +  `BETWEEN`: 첫 번째 값보다 크거나 같음 및 두 번째 값보다 작거나 같음.

     `AttributeValueList`에는 문자열, 숫자 또는 이진수(집합 유형 제외) 중에서 동일한 형식으로 2개의 `AttributeValue` 요소가 들어 있어야 합니다. 대상 값이 첫 번째 요소보다 크거나 같을 때, 그리고 두 번째 요소보다 작거나 같을 때 대상 속성이 일치합니다. 요청에서 제공된 형식과 다른 형식의 `AttributeValue` 요소가 항목에 포함되어 있으면 값이 일치하지 않습니다. 예를 들어 `{"S":"6"}`은 `{"N":"6"}`과 비교할 수 없습니다. 또한 `{"N":"6"}`은 `{"NS":["6", "2", "1"]}`과 비교할 수 없습니다.

다음 파라미터는 `AttributeValueList` 및 `ComparisonOperator` 대신 사용할 수 있습니다.
+  `Value` - DynamoDB가 속성과 값을 비교할 값.
+  `Exists` - DynamoDB가 조건부 작업을 시도하기 전에 값을 평가하도록 할 부울 값:
  + `Exists`가 `true`이면, DynamoDB가 속성 값이 테이블에 이미 있는지를 확인합니다. 있으면, 조건이 true로 평가되고, 없으면 조건이 false로 평가됩니다.
  + `Exists`가 `false`이면, DynamoDB가 속성 값이 테이블에 없다고(`not`) 가정합니다. 값이 실제로 없으면, 가정이 유효하고 조건이 true로 평가됩니다. 값이 있으면, 값이 없다는 가정에도 불구하고 조건이 false로 평가됩니다.

  `Exists`의 기본값은 `true`입니다.

`Value` 및 `Exists` 파라미터는 `AttributeValueList` 및 `ComparisonOperator`와 호환되지 않습니다. 두 파라미터 집합을 한 번에 사용하면 DynamoDB에서 `ValidationException` 예외를 반환합니다.

**참고**  
이 파라미터는 목록 또는 맵 유형의 속성을 지원하지 않습니다.

## 대신 *ConditionExpression* 사용 - 예
<a name="Expected.instead"></a>

특정 조건이 true인 경우에만 *Music* 테이블의 항목을 수정하길 원한다고 가정합니다. 다음 `UpdateItem` 예제에서와 같이 `Expected` 요청을 AWS CLI 파라미터와 함께 사용할 수 있습니다.

```
aws dynamodb update-item \
    --table-name Music \
    --key '{
        "Artist": {"S":"No One You Know"},
        "SongTitle": {"S":"Call Me Today"} 
    }' \
    --attribute-updates '{
        "Price": {
            "Action": "PUT", 
            "Value": {"N":"1.98"}
        }
    }' \
    --expected '{
        "Price": {
            "ComparisonOperator": "LE", 
            "AttributeValueList": [ {"N":"2.00"} ]
        }
    }'
```

대신에 `ConditionExpression`을 사용할 수 있습니다.

```
aws dynamodb update-item \
    --table-name Music \
    --key '{
        "Artist": {"S":"No One You Know"},
        "SongTitle": {"S":"Call Me Today"} 
    }' \
    --update-expression 'SET Price = :p1' \
    --condition-expression 'Price <= :p2' \
    --expression-attribute-values '{
        ":p1": {"N":"1.98"},
        ":p2": {"N":"2.00"}
    }'
```