

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

# 예: Step Functions 워크플로에서 경로를 통해 상태 데이터 조작
<a name="input-output-example"></a>

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

이 주제에는 InputPath, ResultPath 및 OutputPath 필드를 사용하여 상태 입력 및 출력 JSON을 조작하는 방법의 예가 포함되어 있습니다.

[Fail 워크플로 상태](state-fail.md) 상태 또는 [Succeed 워크플로 상태](state-succeed.md) 상태 이외의 모든 상태에는 `InputPath`, `ResultPath` 또는 `OutputPath`와 같은 입력 및 출력 처리 필드가 포함될 수 있습니다. 또한 [Wait 워크플로 상태](state-wait.md) 및 [Choice 워크플로 상태](state-choice.md) 상태는 `ResultPath` 필드를 지원하지 않습니다. 이러한 필드를 사용하면 [JsonPath](https://datatracker.ietf.org/wg/jsonpath/about/)를 사용하여 워크플로를 통해 이동하는 JSON 데이터를 필터링할 수 있습니다.

또한 `Parameters` 필드를 사용하여 워크플로를 통해 이동하는 JSON 데이터를 조작할 수 있습니다. `Parameters` 사용에 대한 자세한 내용은 [Step Functions 워크플로의 파라미터를 사용하여 파라미터 조작](input-output-inputpath-params.md)을 참조하십시오.

예를 들어 [Lambda를 사용하는 Step Functions 상태 머신 만들기](tutorial-creating-lambda-state-machine.md) 자습서에 설명된 AWS Lambda 함수와 상태 머신을 시작합니다. 상태 머신을 수정하여 다음 `InputPath`, `ResultPath`, `OutputPath`를 포함할 수 있습니다.

```
{
  "Comment": "A Hello World example of the Amazon States Language using an AWS Lambda function",
  "StartAt": "HelloWorld",
  "States": {
    "HelloWorld": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:region:123456789012:function:HelloFunction",
      "InputPath": "$.lambda",
      "ResultPath": "$.data.lambdaresult",
      "OutputPath": "$.data",
      "End": true
    }
  }
}
```

다음 입력을 사용하여 실행을 시작합니다.

```
{
  "comment": "An input comment.",
  "data": {
    "val1": 23,
    "val2": 17
  },
  "extra": "foo",
  "lambda": {
    "who": "AWS Step Functions"
  }
}
```

`comment` 및 `extra` 노드를 폐기하지만 `data` 노드의 정보를 보존하면서 동시에 Lambda 함수의 출력을 포함하려고 한다고 가정해보겠습니다.

업데이트된 상태 머신에서 `Task` 상태를 변경하여 작업으로 입력을 전달합니다.

```
"InputPath": "$.lambda",
```

상태 머신 정의의 이 라인은 작업 입력을 상태 입력의 `lambda` 노드로만 한정합니다. Lambda 함수는 입력으로 JSON 객체 `{"who": "AWS Step Functions"}`만 수신합니다.

```
"ResultPath": "$.data.lambdaresult",
```

이 `ResultPath`는 상태 머신에게 Lambda 함수 결과를 기존 상태 머신 입력의 `data` 노드 하위 개념으로 `lambdaresult`라는 노드에 입력하라고 지시합니다. 원래 입력과 `OutputPath`를 사용한 결과에서 다른 어떠한 조작도 수행하지 않으므로 이제 상태 출력에는 원래 입력과 함께 Lambda 함수의 결과가 포함됩니다.

```
{
  "comment": "An input comment.",
  "data": {
    "val1": 23,
    "val2": 17,
    "lambdaresult": "Hello, AWS Step Functions!"
  },
  "extra": "foo",
  "lambda": {
    "who": "AWS Step Functions"
  }
}
```

하지만 목적은 `data` 노드만 보존하고 Lambda 함수의 결과를 포함하는 것이었습니다. `OutputPath`는 이런 결합된 JSON을 상태 출력으로 보내기 전에 필터링합니다.

```
"OutputPath": "$.data",
```

기존 입력에서 `data` 노드(`lambdaresult`가 입력한 `ResultPath` 하위 개념 포함)만 선택하여 출력으로 전달될 수 있게 합니다. 상태 출력은 다음과 같이 필터링됩니다.

```
{
  "val1": 23,
  "val2": 17,
  "lambdaresult": "Hello, AWS Step Functions!"
}
```

이 `Task`작업 상태에서:

1. `InputPath`는 `lambda` 노드만 입력에서 Lambda 함수로 보냅니다.

1. `ResultPath`는 기존 입력의 `data` 노드의 하위 개념으로 결과를 입력합니다.

1. `OutputPath`는 상태 입력에서 `data` 노드만 상태 출력으로 전달하도록 이제 Lambda 함수의 결과를 포함된 상태 입력을 필터링합니다.

**Example JsonPath를 사용하여 원래 상태 머신 입력, 결과 및 최종 출력을 조작하는 예제**  
보험 신청자의 신원과 주소를 확인하는 다음 상태 머신을 고려해보겠습니다.  
전체 예제를 보려면 [Step Functions에서 JSON 경로를 사용하는 방법](https://github.com/aws-samples/serverless-account-signup-service)을 참조하세요.

```
{
  "Comment": "Sample state machine to verify an applicant's ID and address",
  "StartAt": "Verify info",
  "States": {
    "Verify info": {
      "Type": "Parallel",
      "End": true,
      "Branches": [
        {
          "StartAt": "Verify identity",
          "States": {
            "Verify identity": {
              "Type": "Task",
              "Resource": "arn:aws:states:::lambda:invoke",
              "Parameters": {
                "Payload.$": "$",
                "FunctionName": "arn:aws:lambda:us-east-2:111122223333:function:check-identity:$LATEST"
              },
              "End": true
            }
          }
        },
        {
          "StartAt": "Verify address",
          "States": {
            "Verify address": {
              "Type": "Task",
              "Resource": "arn:aws:states:::lambda:invoke",
              "Parameters": {
                "Payload.$": "$",
                "FunctionName": "arn:aws:lambda:us-east-2:111122223333:function:check-address:$LATEST"
              },
              "End": true
            }
          }
        }
      ]
    }
  }
}
```
다음 입력을 사용하여 이 상태 머신을 실행하면 검증을 수행하는 Lambda 함수에서 확인이 필요한 데이터만 입력으로 예상하므로 실행이 실패합니다. 따라서 적절한 JsonPath를 사용하여 확인할 정보가 포함된 노드를 지정해야 합니다.  

```
{
  "data": {
    "firstname": "Jane",
    "lastname": "Doe",
    "identity": {
      "email": "jdoe@example.com",
      "ssn": "123-45-6789"
    },
    "address": {
      "street": "123 Main St",
      "city": "Columbus",
      "state": "OH",
      "zip": "43219"
    },
    "interests": [
      {
        "category": "home",
        "type": "own",
        "yearBuilt": 2004
      },
      {
        "category": "boat",
        "type": "snowmobile",
        "yearBuilt": 2020
      },
      {
        "category": "auto",
        "type": "RV",
        "yearBuilt": 2015
      },
    ]
  }
}
```
`check-identity` Lambda 함수에서 사용해야 하는 노드를 지정하려면 다음과 같이 `InputPath` 필드를 사용합니다.  

```
"InputPath": "$.data.identity"
```
그리고 `check-address` Lambda 함수에서 사용해야 하는 노드를 지정하려면 다음과 같이 `InputPath` 필드를 사용합니다.  

```
"InputPath": "$.data.address"
```
이제 원본 상태 머신 입력 내에 검증 결과를 저장하려면 다음과 같이 `ResultPath` 필드를 사용합니다.  

```
"ResultPath": "$.results"
```
하지만 ID 및 확인 결과만 필요하고 원래 입력을 삭제하려면 다음과 같이 `OutputPath` 필드를 사용합니다.  

```
"OutputPath": "$.results"
```

자세한 내용은 [Step Functions에서 입력 및 출력 처리](concepts-input-output-filtering.md) 섹션을 참조하세요.

## OutputPath를 사용하여 상태 출력 필터링
<a name="input-output-outputpath"></a>

`OutputPath`를 사용하면 다음 상태로 전달할 상태 출력 부분을 선택할 수 있습니다. 이 접근 방식을 사용하면 원치 않는 정보를 필터링하고 필요한 JSON 부분만 전달할 수 있습니다.

`OutputPath`를 지정하지 않으면 기본값 `$`가 사용됩니다. 이 값은 전체 JSON 노드(상태 입력, 작업 결과 및 `ResultPath`에 따라 결정됨)를 다음 상태로 전달합니다.