

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

# 변수를 사용하여 상태 간에 데이터 전달
<a name="workflow-variables"></a>

**변수 및 JSONata를 사용하여 상태 관리**  
Step Functions는 최근에 상태를 관리하고 데이터를 트랜스포밍하기 위해 변수와 JSONata를 추가했습니다.  
블로그 게시물 [AWS Step Functions의 변수 및 JSONata로 개발자 경험 간소화](https://aws.amazon.com/blogs/compute/simplifying-developer-experience-with-variables-and-jsonata-in-aws-step-functions/)에서 자세히 알아보기   
 다음 동영상에서는 DynamoDB 예를 사용하여 Step Functions의 변수 및 JSONata를 설명합니다.  




 변수 및 상태 출력을 사용하면 워크플로의 단계 간에 데이터를 전달할 수 있습니다.

 워크플로 변수를 사용하면 단계에서 데이터를 저장하고 향후 단계에서 해당 데이터를 검색할 수 있습니다. 예를 들어 나중에 필요할 수 있는 데이터가 포함된 API 응답을 저장할 수 있습니다. 반대로 상태 출력은 다음 단계의 입력으로만 사용할 수 있습니다.

## 변수의 개념적 개요
<a name="conceptual-overview-of-variables"></a>

 워크플로 변수를 사용하면 나중에 참조할 데이터를 저장할 수 있습니다. 예를 들어 1단계는 API 요청의 결과를 저장하여 5단계의 뒷부분에서 해당 요청의 일부를 재사용할 수 있습니다.

 다음 시나리오에서는 상태 머신이 API에서 데이터를 1번 가져옵니다. 1단계에서 워크플로는 반환된 API 데이터(상태당 최대 256KiB)를 변수 'x'에 저장하여 이후 단계에서 사용합니다.

 변수가 없으면 5단계에서 사용하려면 1단계에서 2단계, 3단계, 4단계의 출력을 통해 데이터를 전달해야 합니다. 이러한 중간 단계에 데이터가 필요하지 않으면 어떻게 해야 하나요? 출력 및 입력을 통해 상태에서 상태로 데이터를 전달하는 것은 불필요한 작업입니다.

 변수를 사용하면 데이터를 저장하고 향후 단계에서 사용할 수 있습니다. 데이터 흐름을 방해하지 않고 단계를 수정, 재배열 또는 추가할 수도 있습니다. 변수의 유연성을 고려할 때 Parallel 및 Map 하위 워크플로와 상태 머신 실행이 끝날 때 데이터를 반환하는 데만 **Output**을 사용해야 할 수 있습니다.

 ![Diagram showing step 1 assigning a value to $x, used in step 5.](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/vars-diag-opt1.png)

 **변수를 지원하는 상태 **

 *Pass, Task, Map, Parallel, Choice, Wait* 상태 유형은 `Assign`이 변수를 선언하고 값을 할당하도록 지원합니다.

 변수를 설정하려면 변수 이름과 값이 포함된 JSON 객체를 제공합니다.

```
"Assign": {
  "productName": "product1",
  "count" : 42,
  "available" : true
}
```

 변수를 참조하려면 이름 앞에 달러 기호(`$`)를 추가합니다. 예: `$productName`.

## 예약 변수: $states
<a name="reserved-variable-states"></a>

 Step Functions는 **`$states`**라는 단일 예약 변수를 정의합니다. JSONata 상태에서는 JSONata 표현식에 사용할 수 있도록 다음 구조가 `$states`에 할당됩니다.

```
# Reserved $states variable in JSONata states
$states = {
  "input":       // Original input to the state
  "result":      // API or sub-workflow's result (if successful)
  "errorOutput": // Error Output (only available in a Catch)
  "context":     // Context object
}
```

 상태 입력 시 Step Functions는 상태 입력을 **`$states.input`**에 할당합니다. `$states.input`의 값은 JSONata 표현식을 허용하는 모든 필드에서 사용할 수 있습니다. `$states.input`은 항상 원래 상태 입력을 참조합니다.

 `Task`, `Parallel` 및 `Map` 상태:
+ **`$states.result`**는 성공할 경우 API 또는 하위 워크플로의 원시 결과를 참조합니다.
+ **`$states.errorOutput`**는 API 또는 하위 워크플로가 실패한 경우 오류 출력을 참조합니다.

  `$states.errorOutput`은 `Catch` 필드의 `Assign` 또는 `Output`에서 사용할 수 있습니다.

액세스할 수 없는 필드 및 상태에서 `$states.result` 또는 `$states.errorOutput`에 액세스하려는 시도는 상태 머신의 생성, 업데이트 또는 검증 시 포착됩니다.

`$states.context` 객체는 `StartTime`, 작업 토큰 및 초기 워크플로 입력과 같은 특정 실행에 대한 워크플로 정보를 제공합니다. 자세한 내용은 [Step Functions의 컨텍스트 객체에서 실행 데이터 액세스](input-output-contextobject.md)를 참조하세요.

## 변수 이름 구문
<a name="variable-name-syntax"></a>

 변수 이름은 [Unicode® Standard Annex \#31](https://unicode.org/reports/tr31/)에 설명된 유니코드 식별자 규칙을 따릅니다. 변수 이름의 첫 번째 문자는 Unicode ID\_Start 문자여야 하며, 두 번째 및 후속 문자는 Unicode ID\_Continue 문자여야 합니다. 변수 이름의 최대 길이는 80입니다.

 변수 이름 규칙은 JavaScript 및 기타 프로그래밍 언어에 대한 규칙과 유사합니다.

## 변수 범위
<a name="variable-scope"></a>

 Step Functions 워크플로는 *workflow-local* 범위를 사용하여 변수와의 경합 상태를 방지합니다.

워크플로-로컬 범위에는 상태 머신의 **Status** 필드 내의 모든 상태가 포함되지만 Parallel 또는 Map 상태 내의 상태는 포함되지 않습니다. Parallel 또는 Map 상태 내의 상태는 외부 범위 변수를 참조할 수 있지만 별도의 워크플로-로컬 변수 및 값을 생성하고 유지합니다.

`Parallel` 브랜치 및 `Map` 반복에서는 **외부 범위**의 변수 값에 액세스할 수 있습니다. 하지만 다른 동시 브랜치 또는 반복의 변수 값에 액세스할 수 없습니다. 오류를 처리할 때 `Catch`의 `Assign` 필드는 외부 범위, 즉 Parallel/Map 상태가 존재하는 범위의 변수에 값을 할당할 수 있습니다.

 예외: **Distributed Map 상태**에서는 외부 범위의 변수를 참조할 수 없습니다.

 범위 내 어떤 상태에서든 변수에 값을 할당하는 경우 해당 변수는 범위 내에 존재합니다. 일반적인 오류를 방지하기 위해 내부 범위에 할당된 변수는 외부 범위에 할당된 변수와 동일한 이름을 가질 수 없습니다. 예를 들어 최상위 범위가 `myVariable`이라는 변수에 값을 할당하는 경우 다른 범위(`Map`, `Parallel` 내부)도 `myVariable`에 할당할 수 없습니다.

 변수에 대한 액세스는 현재 범위에 따라 달라집니다. Parallel 또는 Map 상태는 자체 범위가 있지만 외부 범위의 변수에 액세스할 수 있습니다.

 Parallel 또는 Map 상태가 완료되면 모든 변수가 범위를 벗어나 액세스가 중지됩니다. **Output 필드**를 사용하여 Parallel 브랜치 및 Map 반복에서 데이터를 전달합니다.

## ASL에서 필드 할당
<a name="assign-field-in-asl"></a>

 ASL의 `Assign` 필드는 하나 이상의 변수에 값을 할당하는 데 사용됩니다. `Assign` 필드는 각 상태의 최상위 수준(`Succeed` 및 `Fail` 제외), `Choice` 상태 규칙 내부 및 `Catch` 필드 내부에서 사용할 수 있습니다. 예: 

```
# Example of Assign with JSONata
"Store inputs": {
    "Type": "Pass",
    "Next": "Get Current Price",
    "Comment": "Store the input desired price into a variable: $desiredPrice",
    "Assign": {
       "desiredPrice": "{% $states.input.desired_price %}",
       "maximumWait": "{% $states.input.max_days %}"
    }
},
```

 `Assign` 필드는 JSON 객체를 사용합니다. 각 최상위 필드는 할당할 변수의 이름을 지정합니다. 이전 예에서 변수 이름은 `desiredPrice` 및 `maximumWait`입니다. JSONata를 사용할 때 `{% ... %}`는 변수 또는 더 복잡한 표현식을 포함할 수 있는 JSONata 표현식을 나타냅니다. JSONata 표현식에 대한 자세한 내용은 [JSONata.org 설명서](https://docs.jsonata.org/overview.html)를 참조하세요.

 쿼리 언어로 **JSONata**를 사용하는 경우 다음 다이어그램은 **Assign** 및 **Output** 필드를 병렬로 처리하는 방법을 보여줍니다. 영향 참고: *변수 값을 할당해도 Output 출력에는 영향을 주지 않습니다. * 

 ![Diagram showing a comparison of JSONPath and JSONata flow.](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/vars-jsonata.png)

 다음 JSONata 예는 상태 입력에서 `order.product`를 검색합니다. 변수 `currentPrice`는 작업 결과의 값으로 설정됩니다.

```
# Example of Task with JSONata assignment from result
{
   "Type": "Task",
   ...
   "Assign": {
      "product": "{% $states.input.order.product %}",
      "currentPrice": "{% $states.result.Payload.current_price %}"
   },
   "Next": "the next state"
}
```

 참고: 변수의 일부에는 값을 할당할 수 **없습니다**. 예를 들어 `"Assign":{"x":42}`는 할 수 있지만 `"Assign":{"x.y":42}` 또는 `"Assign":{"x[2]":42}`는 할 수 없습니다.

## 할당 필드의 평가 순서
<a name="evaluation-order-in-an-assign-field"></a>

Step Functions 상태의 모든 변수 참조는 **상태 항목**에 있는 것처럼 값을 사용합니다.

앞의 사실은 `Assign` 필드가 하나 이상의 변수에 값을 할당하는 방법을 이해하는 데 중요합니다. 먼저 새 값이 계산되고 Step Functions는 변수에 새 값을 할당합니다. 새 변수 값은 **다음 **상태부터 사용할 수 있습니다. 예를 들어 다음 `Assign` 필드를 고려합니다.

```
# Starting values: $x=3, $a=6

"Assign": {
  "x": "{% $a %}",
  "nextX": "{% $x %}"
}

# Ending values: $x=6, $nextX=3
```

앞의 예에서 변수 `x`는 모두 할당되고 참조됩니다.

모든 표현식이 ***먼저 평가***되고 할당이 이루어집니다. 그리고 새로 할당된 값은 **다음** 상태에서 사용할 수 있습니다.

예를 자세히 살펴보겠습니다. 이전 상태에서 `$x`에 값 삼(3)이 할당되었고 `$a`에 값 육(6)이 할당되었다고 가정합니다. 다음 단계에서는 프로세스에 대해 설명합니다.

1. 모든 표현식은 모든 변수의 **현재** 값을 사용하여 평가됩니다.

   `"{% $a %}"` 표현식은 6으로 평가되고 `"{% $x %}"` 표현식은 3으로 평가됩니다.

1. 다음으로 할당이 이루어집니다.

   `$x`에는 값 육(6)이 할당됩니다.

   `$nextX`에는 값 삼(3)이 할당됩니다.

 참고: `$x`가 이전에 할당되지 않은 경우 `$x`가 *정의되지* 않았기 때문에 예가 **실패**합니다.

 요약하면 Step Functions는 **모든** 표현식을 평가한 다음 할당합니다. `Assign` 필드에서 변수가 발생하는 순서는 중요하지 **않습니다**.

## Limits
<a name="limits"></a>

 단일 변수의 최대 크기는 표준 및 Express 워크플로 모두에 대해 256Kib입니다.

 단일 `Assign` 필드의 모든 변수에 대한 최대 결합 크기도 256Kib입니다. 예를 들어 X와 Y를 128KiB에 할당할 수 있지만 동일한 `Assign` 필드에서 X와 Y를 모두 256KiB에 할당할 수는 없습니다.

 저장된 모든 변수의 총 크기는 실행당 10MiB를 초과할 수 없습니다.

## JSONPath 상태에서 변수 사용
<a name="using-variables-in-jsonpath-states"></a>

 변수는 쿼리 언어에 JSONPath를 사용하는 상태에서도 사용할 수 있습니다.

 JSONpath 표현식(`$.` 또는 `$$.` 구문)을 수락하는 모든 필드에서 변수를 참조할 수 있습니다. 단, 상태 입력에서 상태 결과를 주입할 위치를 지정하는 `ResultPath`는 예외입니다. 변수는 `ResultPath`에서 사용할 수 없습니다.

 JSONPath에서 `$` 기호는 '현재' 값을 나타내며 `$$`는 컨텍스트 객체 상태를 나타냅니다. JSONPath 표현식은 `$.customer.name`에서와 같이 `$.`로 시작할 수 있습니다. `$$.Execution.Id`에서처럼 `$$.`를 사용하여 컨텍스트에 액세스할 수 있습니다.

 변수를 참조하려면 `$x` 또는 `$order.numItems`와 같은 변수 이름 앞에 `$` 기호를 사용합니다.

 내장 함수를 허용하는** JSONPath** 필드에서는 `States.Format('The order number is {}', $order.number)`와 같은 인수에 변수를 사용할 수 있습니다.

 다음 다이어그램은 **JSONPath** 작업의 할당 단계가 동시에 ResultSelector에서 어떻게 발생하는지 보여줍니다.

 ![Logical diagram of a state that uses JSONPath query language.](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/vars-jsonpath.png)

 **JSONPath에서 변수 할당**

 JSONPath 변수 할당은 페이로드 템플릿과 유사하게 동작합니다. `.$`로 끝나는 필드는 Step Functions가 상태 머신 실행 중에 값으로 평가하는 JSONPath 표현식입니다(예: `$.order..product` 및 `$.order.total`).

```
# Example of Assign with JSONPath
{
  "Type": "Task",
  ...
  "Assign": {
    "products.$": "$.order..product",
    "orderTotal.$": "$.order.total"
  },
  "Next": "the next state"
}
```

 JSONPath 상태의 경우 `Assign` 필드의 `$` 값은 상태 유형에 따라 다릅니다. `Task,` `Map`에서 `Parallel` 상태 `$`는 API/하위 워크플로 결과를 나타냅니다. `Choice` 및 `Wait` 상태에서 `$`는 `InputPath`가 상태 입력에 적용된 후의 값인 *유효 입력*을 나타냅니다. `Pass`의 경우 `$`는 `Result` 필드에 의해 생성되었든 `InputPath`/`Parameters` 필드에 의해 생성되었든 상관없이 결과를 나타냅니다.

 다음 JSONPath 예에서는 `details` 변수에 JSON 객체, `resultCode`에 JSONPath 표현식의 결과 `$.result.code`, `message`에 JSONPath 표현식의 결과 `States.Format('Hello {}', $customer.name)`을 할당합니다. 이것이 `Task` 상태인 경우 `$.order.items` 및 `$.result.code`의 `$`에서 API 결과를 참조합니다. `startTime` 변수는 컨텍스트 객체 `$$.Execution.StartTime`의 값과 함께 할당됩니다.

```
"Assign": {
   "details": {
      "status": "SUCCESS",
      "lineItems.$": "$.order.items"
   },
   "resultCode.$": "$.result.code",
   "message.$": "States.Format('Hello {}', $customer.name)",
   "startTime.$": "$$.Execution.StartTime"
}
```