

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

# Choice 워크플로 상태
<a name="state-choice"></a>

**상태 관리 및 데이터 트랜스포밍**  
[변수를 사용하여 상태 간 데이터 전달](workflow-variables.md)과 [JSONata를 사용하여 데이터 트랜스포밍](transforming-data.md)에 대해 알아봅니다.

`Choice` 상태(`"Type": "Choice"`)는 조건부 논리를 상태 머신에 추가합니다.

`Choice` 상태에는 대부분의 [일반 상태 필드](statemachine-structure.md#amazon-states-language-common-fields) 외에도 다음과 같은 필드가 추가로 포함되어 있습니다.

**`Choices`(필수)**  
상태 머신이 다음으로 전환하는 상태를 결정하는 [선택 규칙](#state-choice-rules)의 어레이. `Choice` 상태에 규칙을 최소 하나 이상 정의해야 합니다.  
`Choice` 상태가 실행되면 Step Functions는 각 **선택 규칙**을 true 또는 false로 평가합니다. 결과에 따라 Step Functions는 워크플로의 다음 상태로 전환됩니다.

**`Default`(선택 사항, 권장됨)**  
**선택 규칙**이 true로 평가되지 않는 경우 전환할 상태의 이름입니다.

**중요**  
 `Choice` 상태는 `End` 필드를 지원하지 않습니다. 또한, `Next`는 `Choices` 필드 내에서만 사용됩니다.  
워크플로가 실행될 때 true로 평가되는 **선택 항목**이 없고 **기본값**이 제공되지 않으면 *상태 전환 실패*로 인해 상태 머신에서 **오류**가 발생합니다.

## 선택 규칙(JSONata)
<a name="state-choice-rules"></a>

`Choice` 상태에는 값이 선택 규칙의 비어 있지 않은 배열인 `Choices` 필드가 있어야 합니다. 이 필드에는 JSONata를 사용할 때 다음 필드가 포함됩니다.
+ **`Condition` 필드** - true/false로 평가되는 JSONata 표현식입니다.
+ **`Next` 필드** - 상태 머신의 상태 이름과 일치해야 하는 값입니다.

다음은 숫자 값이 `1`과 동일한지 여부를 검사하는 예제입니다.

```
{
  "Condition": "{% $foo = 1 %}",
  "Next": "NumericMatchState"
}
```

다음은 `type` 변수가 `local`과 동일한지 여부를 검사하는 예제입니다.

```
{
  "Condition": "{% $type = 'local' %}",
  "Next": "StringMatchState"
}
```

다음은 문자열이 `MyStringABC`보다 큰지를 검사하는 예제입니다.

```
{
  "Condition": "{% $foo > 'MyStringABC' %}",
  "Next": "StringGreaterMatchState"
}
```

다음은 문자열이 null이 아닌지를 검사하는 예제입니다.

```
{
 "Condition" : "{% $possiblyNullValue != null and $possiblyNullValue = 42 %}",
 "Next": "NotNullAnd42"
}
```

## 선택 규칙(JSONPath)
<a name="state-choice-rules-jsonpath"></a>

`Choice` 상태에는 값이 선택 규칙의 비어 있지 않은 배열인 `Choices` 필드가 있어야 합니다. 이 필드에는 JSONPath를 사용할 때 다음 필드가 포함됩니다.
+ **비교값** - 비교할 입력 변수, 비교 유형 및 변수와 비교할 값을 지정하는 필드 2개. 선택 규칙에서는 두 변수를 비교할 수 있습니다. 선택 규칙 내에서 `Path`를 지원되는 비교 연산자 이름에 추가하여 변수 값을 상태 입력의 다른 값과 비교할 수 있습니다. 비교할 때 `Variable` 및 경로 필드의 값은 유효한 [참조 경로](amazon-states-language-paths.md#amazon-states-language-reference-paths)여야 합니다.
+ **`Next` 필드** - 이 필드 값은 상태 머신의 상태 이름과 일치해야 합니다.

다음은 숫자 값이 `1`과 동일한지 여부를 검사하는 예제입니다.

```
{
  "Variable": "$.foo",
  "NumericEquals": 1,
  "Next": "FirstMatchState"
}
```

다음은 문자열이 `MyString`과 동일한지 여부를 검사하는 예제입니다.

```
{
  "Variable": "$.foo",
  "StringEquals": "MyString",
  "Next": "FirstMatchState"
}
```

다음은 문자열이 `MyStringABC`보다 큰지를 검사하는 예제입니다.

```
{
  "Variable": "$.foo",
  "StringGreaterThan": "MyStringABC",
  "Next": "FirstMatchState"
}
```

다음은 문자열이 null인지 여부를 검사하는 예제입니다.

```
{
 "Variable": "$.possiblyNullValue",
 "IsNull": true
}
```

다음 예제에서는 이전 `IsPresent` 선택 규칙으로 인해 `$.keyThatMightNotExist`가 존재하는 경우에만 StringEquals가 평가되는 방식을 보여줍니다.

```
"And": [
 {
 "Variable": "$.keyThatMightNotExist",
 "IsPresent": true
 },
 {
 "Variable": "$.keyThatMightNotExist",
 "StringEquals": "foo"
 }
]
```

다음은 와일드카드가 있는 패턴이 일치하는지 여부를 검사하는 예제입니다.

```
{
 "Variable": "$.foo",
 "StringMatches": "log-*.txt"
}
```

다음은 타임스탬프가 `2001-01-01T12:00:00Z`과 동일한지 여부를 검사하는 예제입니다.

```
{
  "Variable": "$.foo",
  "TimestampEquals": "2001-01-01T12:00:00Z",
  "Next": "FirstMatchState"
}
```

다음은 변수를 상태 입력의 다른 값과 비교하는 예제입니다.

```
{
 "Variable": "$.foo",
 "StringEqualsPath": "$.bar"
}
```

Step Functions는 `Choices` 필드에 명시된 순서에 따라 각 선택 규칙을 검사합니다. 그런 다음 비교 연산자에 따라 변수가 값과 일치하는 첫 번째 선택 규칙의 `Next` 필드에 지정된 상태로 전환합니다.

다음 비교 연산자가 지원됩니다.
+ `And`
+ `BooleanEquals`,`BooleanEqualsPath`
+ `IsBoolean`
+ `IsNull`
+ `IsNumeric`
+ `IsPresent`
+ `IsString`
+ `IsTimestamp`
+ `Not`
+ `NumericEquals`,`NumericEqualsPath`
+ `NumericGreaterThan`,`NumericGreaterThanPath`
+ `NumericGreaterThanEquals`,`NumericGreaterThanEqualsPath`
+ `NumericLessThan`,`NumericLessThanPath`
+ `NumericLessThanEquals`,`NumericLessThanEqualsPath`
+ `Or`
+ `StringEquals`,`StringEqualsPath`
+ `StringGreaterThan`,`StringGreaterThanPath`
+ `StringGreaterThanEquals`,`StringGreaterThanEqualsPath`
+ `StringLessThan`,`StringLessThanPath`
+ `StringLessThanEquals`,`StringLessThanEqualsPath`
+ `StringMatches`
+ `TimestampEquals`,`TimestampEqualsPath`
+ `TimestampGreaterThan`,`TimestampGreaterThanPath`
+ `TimestampGreaterThanEquals`,`TimestampGreaterThanEqualsPath`
+ `TimestampLessThan`,`TimestampLessThanPath`
+ `TimestampLessThanEquals`,`TimestampLessThanEqualsPath`

이러한 연산자마다 해당 값이 적절한 유형(문자열, 숫자, 부울 또는 타임스탬프)이어야 합니다. Step Functions는 숫자 필드를 문자열 값과 일치시키려고 시도하지 않습니다. 단, 타임스탬프 필드는 논리적으로 문자열이므로 타임스탬프로 간주되는 필드는 `StringEquals` 연산자와 연결될 수 있습니다.

**참고**  
상호 운영성을 위해, [IEEE 754-2008 `binary64` 데이터 유형](https://en.wikipedia.org/wiki/IEEE_754#Basic_and_interchange_formats)에 표시되는 크기나 정밀도를 넘는 값을 사용하여 수 비교를 수행하지 마십시오. 특히, `[-253+1, 253-1]` 범위를 넘는 정수를 사용하면 예상되는 방식으로 비교가 수행되지 않을 수 있습니다.  
타임스탬프(예: `2016-08-18T17:33:00Z`)는 [RFC3339 프로필 ISO 8601](https://www.ietf.org/rfc/rfc3339.txt)을 준수하되 다음과 같은 추가 제한도 따라야 합니다.  
대문자 `T`로 날짜와 시간 부분을 구분해야 합니다.
대문자 `Z`로 숫자로 된 시간대 오프셋이 없음을 표기해야 합니다.
문자열 비교 동작을 이해하려면 [Java `compareTo` 설명서](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#compareTo-java.lang.String-)를 참조하십시오.  
`And` 및 `Or` 연산자는 비어 있지 않은 선택 규칙 어레이여야 하며 `Next` 필드를 자체적으로 포함하지 않아야 합니다. 마찬가지로, `Not` 연산자는 단일 선택 규칙이어야 하며 `Next` 필드를 포함하지 않아야 합니다.  
`And`, `Not` 및 `Or`를 사용하면 복잡한 중첩 선택 규칙을 생성할 수 있습니다. 단, `Next` 필드는 최상위 선택 규칙에만 표시될 수 있습니다.  
StringMatches 비교 연산자를 사용하여 문자열을 와일드카드(“\$1”)가 하나 이상 있는 패턴과 비교할 수 있습니다. 와일드카드 문자는 `\\ (Ex: “\\*”)` 표준을 통해 이스케이프됩니다. 매칭 중에는 “\$1” 이외의 어떠한 문자도 특별한 의미를 갖지 않습니다.