

# API Gateway의 템플릿 변환 매핑에 변수를 사용하는 예제
<a name="api-gateway-mapping-variable-examples"></a>

다음 예제는 매핑 템플릿에서 `$context`, `input` 및 `util` 변수를 사용하는 방법을 보여줍니다. 모의 통합 또는 입력 이벤트를 API Gateway에 반환하는 Lambda 비프록시 통합을 사용할 수 있습니다. 데이터 변환에 지원되는 모든 변수 목록은 [API Gateway의 데이터 변환을 위한 변수](api-gateway-mapping-template-reference.md) 섹션을 참조하시기 바랍니다.

## 예제 1: 여러 `$context` 변수를 통합 엔드포인트에 전달
<a name="context-variables-template-example"></a>

다음 예제는 받은 `$context` 변수를, 통합 요청 페이로드에서 약간 다른 이름을 가진 백엔드 변수에 매핑하는 매핑 템플릿을 보여 줍니다.

```
{
    "stage" : "$context.stage",
    "request_id" : "$context.requestId",
    "api_id" : "$context.apiId",
    "resource_path" : "$context.resourcePath",
    "resource_id" : "$context.resourceId",
    "http_method" : "$context.httpMethod",
    "source_ip" : "$context.identity.sourceIp",
    "user-agent" : "$context.identity.userAgent",
    "account_id" : "$context.identity.accountId",
    "api_key" : "$context.identity.apiKey",
    "caller" : "$context.identity.caller",
    "user" : "$context.identity.user",
    "user_arn" : "$context.identity.userArn"
}
```

이 매핑 템플릿의 출력은 다음과 같아야 합니다.

```
{
  stage: 'prod',
  request_id: 'abcdefg-000-000-0000-abcdefg',
  api_id: 'abcd1234',
  resource_path: '/',
  resource_id: 'efg567',
  http_method: 'GET',
  source_ip: '192.0.2.1',
  user-agent: 'curl/7.84.0',
  account_id: '111122223333',
  api_key: 'MyTestKey',
  caller: 'ABCD-0000-12345',
  user: 'ABCD-0000-12345',
  user_arn: 'arn:aws:sts::111122223333:assumed-role/Admin/carlos-salazar'
}
```

이러한 변수 중 하나가 API 키입니다. 이 예제는 메서드에 API 키가 필요하다는 것을 전제로 합니다.

## 예제 2: 모든 요청 파라미터를 JSON 페이로드를 통해 통합 엔드포인트로 전달
<a name="input-examples-mapping-templates"></a>

다음 예제에서는 `path`, `querystring` 및 `header` 파라미터를 포함한 모든 요청 파라미터를 JSON 페이로드를 통해 통합 엔드포인트로 전달합니다.

```
#set($allParams = $input.params())
{
  "params" : {
    #foreach($type in $allParams.keySet())
    #set($params = $allParams.get($type))
    "$type" : {
      #foreach($paramName in $params.keySet())
      "$paramName" : "$util.escapeJavaScript($params.get($paramName))"
      #if($foreach.hasNext),#end
      #end
    }
    #if($foreach.hasNext),#end
    #end
  }
}
```

요청에 다음 입력 파라미터가 있는 경우:
+ `myparam`이라는 경로 매개변수
+ 쿼리 문자열 파라미터 `querystring1=value1,value2`
+ `"header1" : "value1"` 헤더입니다.

이 매핑 템플릿의 출력은 다음과 같아야 합니다.

```
{"params":{"path":{"example2":"myparamm"},"querystring":{"querystring1":"value1,value2"},"header":{"header1":"value1"}}}
```

## 예제 3: 메서드 요청의 하위 섹션을 통합 엔드포인트에 전달
<a name="input-example-json-mapping-template"></a>

 다음 예제에서는 `name` 입력 파라미터를 사용하여 `name` 파라미터만 검색하고 `input.json('$')` 입력 파라미터를 사용하여 메서드 요청의 전체 본문을 검색합니다.

```
{
    "name" : "$input.params('name')",
    "body" : $input.json('$') 
}
```

쿼리 문자열 `name=Bella&type=dog` 파라미터와 다음 본문이 포함된 요청의 경우:

```
{
    "Price" : "249.99",
    "Age": "6"
}
```

이 매핑 템플릿의 출력은 다음과 같아야 합니다.

```
{
    "name" : "Bella",
    "body" : {"Price":"249.99","Age":"6"}
}
```

이 매핑 템플릿은 `type=dog` 쿼리 문자열 파라미터를 제거합니다.

 JSON 입력에 이스케이프 처리되지 않은 문자가 포함되어 있고 이 문자가 자바스크립트로 구문 분석할 수 없는 경우 API 게이트웨이에서 400 응답을 반환할 수 있습니다. `$util.escapeJavaScript($input.json('$'))`을 적용하면 JSON 입력을 올바르게 구문 분석할 수 있습니다.

`$util.escapeJavaScript($input.json('$'))`이 적용된 이전 예는 다음과 같습니다.

```
{
    "name" : "$input.params('name')",
    "body" : "$util.escapeJavaScript($input.json('$'))"
}
```

이 경우 이 매핑 템플릿의 출력은 다음과 같아야 합니다.

```
{
    "name" : "Bella",
    "body": {"Price":"249.99","Age":"6"}
}
```

## 예제 4: JSONPath 표현식을 사용하여 메서드 요청의 하위 섹션을 통합 엔드포인트에 전달
<a name="input-example-inputs-mapping-template"></a>

다음 예제에서는 JSONPath 표현식을 사용하여 요청 본문에서 `name` 입력 파라미터와 `Age`만 검색합니다.

```
{
    "name" : "$input.params('name')",
    "body" : $input.json('$.Age')  
}
```

쿼리 문자열 `name=Bella&type=dog` 파라미터와 다음 본문이 포함된 요청의 경우:

```
{
    "Price" : "249.99",
    "Age": "6"
}
```

이 매핑 템플릿의 출력은 다음과 같아야 합니다.

```
{
    "name" : "Bella",
    "body" : "6"
}
```

이 매핑 템플릿은 본문에서 `type=dog` 쿼리 문자열 파라미터와 `Price` 필드를 제거합니다.

 메서드 요청 페이로드에 이스케이프 처리되지 않은 문자가 포함되어 있고 이 문자가 자바스크립트로 구문 분석할 수 없는 경우 API Gateway에서 `400` 응답을 반환할 수 있습니다. `$util.escapeJavaScript()`을 적용하면 JSON 입력을 올바르게 구문 분석할 수 있습니다.

`$util.escapeJavaScript($input.json('$.Age'))`이 적용된 이전 예는 다음과 같습니다.

```
{
    "name" : "$input.params('name')",
    "body" : "$util.escapeJavaScript($input.json('$.Age'))" 
}
```

이 경우 이 매핑 템플릿의 출력은 다음과 같아야 합니다.

```
{
    "name" : "Bella",
    "body": "\"6\""
}
```

## 예제 5: JSONPath 표현식을 사용하여 메서드 요청에 대한 정보를 통합 엔드포인트에 전달
<a name="input-example-request-and-response"></a>

다음 예제에서는 `$input.params()`, `$input.path()` 및 `$input.json()`을 사용하여 메서드 요청에 대한 정보를 통합 엔드포인트로 전송합니다. 이 매핑 템플릿은 `size()` 메서드를 사용하여 목록의 요소 수를 제공합니다.

```
{
    "id" : "$input.params('id')",
    "count" : "$input.path('$.things').size()",
    "things" : $input.json('$.things')
}
```

경로 `123` 매개변수와 다음 본문이 포함된 요청의 경우:

```
{
      "things": {
            "1": {},
            "2": {},
            "3": {}
      }
}
```

이 매핑 템플릿의 출력은 다음과 같아야 합니다.

```
{"id":"123","count":"3","things":{"1":{},"2":{},"3":{}}}
```

 메서드 요청 페이로드에 이스케이프 처리되지 않은 문자가 포함되어 있고 이 문자가 자바스크립트로 구문 분석할 수 없는 경우 API Gateway에서 `400` 응답을 반환할 수 있습니다. `$util.escapeJavaScript()`을 적용하면 JSON 입력을 올바르게 구문 분석할 수 있습니다.

`$util.escapeJavaScript($input.json('$.things'))`이 적용된 이전 예는 다음과 같습니다.

```
{
     "id" : "$input.params('id')",
     "count" : "$input.path('$.things').size()",
     "things" : "$util.escapeJavaScript($input.json('$.things'))"
}
```

이 매핑 템플릿의 출력은 다음과 같아야 합니다.

```
{"id":"123","count":"3","things":"{\"1\":{},\"2\":{},\"3\":{}}"}
```