

# API Gateway에서 REST API SDK 생성
<a name="how-to-generate-sdk"></a>

REST API를 플랫폼별 또는 언어별 방식으로 호출하려면, API의 플랫폼별 또는 언어별 SDK를 생성해야 합니다. API를 생성하고 테스트하여 스테이지에 배포한 후에 SDK를 생성합니다. 현재 API Gateway에서는 Java, JavaScript, Java for Android, iOS용 Objective-C 또는 Swift, Ruby로 API용 SDK를 생성할 수 있습니다.

이 단원에서는 API Gateway API의 SDK를 생성하는 방법에 대해 설명합니다. 또한 Java 앱, Android 용 Java 앱, iOS용 Objective-C 및 Swift 앱 및 JavaScript 앱에서 생성된 SDK를 사용하는 방법을 보여줍니다.

원활한 설명을 위해 이 [간편 계산기](simple-calc-lambda-api.md) Lambda 함수를 표시하는 이 API Gateway [API](simple-calc-nodejs-lambda-function.md)를 사용합니다.

계속하기 전에 API Gateway에서 API를 생성하거나 가져와서 최소 한 번 이상 배포하십시오. 지침은 [API Gateway에서 REST API 배포](how-to-deploy-api.md) 단원을 참조하십시오.

**Topics**
+ [간편 계산기 Lambda 함수](simple-calc-nodejs-lambda-function.md)
+ [API Gateway의 간편 계산기 API](simple-calc-lambda-api.md)
+ [간편 계산기 API OpenAPI 정의](simple-calc-lambda-api-swagger-definition.md)
+ [API Gateway에서 API의 Java SDK 생성](generate-java-sdk-of-an-api.md)
+ [API Gateway에서 API의 Android SDK 생성](generate-android-sdk-of-an-api.md)
+ [API Gateway에서 API의 iOS SDK 생성](generate-ios-sdk-of-an-api.md)
+ [API Gateway에서 REST API의 JavaScript SDK 생성](generate-javascript-sdk-of-an-api.md)
+ [API Gateway에서 API의 Ruby SDK 생성](generate-ruby-sdk-of-an-api.md)
+ [API Gateway에서 AWS CLI 명령을 사용하여 API용 SDK 생성](how-to-generate-sdk-cli.md)

# 간편 계산기 Lambda 함수
<a name="simple-calc-nodejs-lambda-function"></a>

예를 들어 더하기, 빼기, 곱하기, 나누기의 이진 연산을 수행하는 Node.js Lambda 함수를 사용해 보겠습니다.

**Topics**
+ [간편 계산기 Lambda 함수 입력 형식](#simple-calc-lambda-function-input-format)
+ [간편 계산기 Lambda 함수 출력 형식](#simple-calc-lambda-function-output-format)
+ [간편 계산기 Lambda 함수 구현](#simple-calc-lambda-function-implementation)

## 간편 계산기 Lambda 함수 입력 형식
<a name="simple-calc-lambda-function-input-format"></a>

이 함수의 입력 형식은 다음과 같습니다.

```
{ "a": "Number", "b": "Number", "op": "string"}
```

여기서 `op`는 `(+, -, *, /, add, sub, mul, div)` 중 하나일 수 있습니다.

## 간편 계산기 Lambda 함수 출력 형식
<a name="simple-calc-lambda-function-output-format"></a>

작업이 성공할 경우 반환되는 결과 형식은 다음과 같습니다.

```
{ "a": "Number", "b": "Number", "op": "string", "c": "Number"}
```

여기서 `c`는 계산 결과를 유지합니다.

## 간편 계산기 Lambda 함수 구현
<a name="simple-calc-lambda-function-implementation"></a>

Lambda 함수의 구현은 다음과 같습니다.

```
export const handler = async function (event, context) {
  console.log("Received event:", JSON.stringify(event));

  if (
    event.a === undefined ||
    event.b === undefined ||
    event.op === undefined
  ) {
    return "400 Invalid Input";
  }

  const res = {};
  res.a = Number(event.a);
  res.b = Number(event.b);
  res.op = event.op;
  if (isNaN(event.a) || isNaN(event.b)) {
    return "400 Invalid Operand";
  }
  switch (event.op) {
    case "+":
    case "add":
      res.c = res.a + res.b;
      break;
    case "-":
    case "sub":
      res.c = res.a - res.b;
      break;
    case "*":
    case "mul":
      res.c = res.a * res.b;
      break;
    case "/":
    case "div":
      if (res.b == 0) {
        return "400 Divide by Zero";
      } else {
        res.c = res.a / res.b;
      }
      break;
    default:
      return "400 Invalid Operator";
  }

  return res;
};
```

# API Gateway의 간편 계산기 API
<a name="simple-calc-lambda-api"></a>

간편 계산기 API는 [간편 계산기 Lambda 함수](simple-calc-nodejs-lambda-function.md)을 호출하는 세 가지 메서드(GET, POST, GET)를 제공합니다. 이 API를 그래픽으로 나타내면 다음과 같습니다.

![\[생성된 SDK를 위한 간편 계산기 API\]](http://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/images/simple-calc-api-console-hierarchy-new-console.png)


다음 세 가지 메서드는 다양한 방식으로 백엔드 Lambda 함수에 대한 입력을 제공하여 동일한 작업을 수행할 수 있음을 보여 줍니다.
+ `GET /?a=...&b=...&op=...` 메서드는 쿼리 파라미터를 사용하여 입력값을 지정합니다.
+ `POST /` 메서드는 `{"a":"Number", "b":"Number", "op":"string"}`의 JSON 페이로드를 사용하여 입력값을 지정합니다.
+ `GET /{a}/{b}/{op}` 메서드는 경로 파라미터를 사용하여 입력값을 지정합니다.

정의되지 않은 경우, API Gateway는 HTTP 메서드 부분과 경로 부분을 조합하여 해당 SDK 메서드 이름을 생성합니다. 루트 경로 부분(`/`)은 `Api Root`라고 합니다. 예를 들어 `GET /?a=...&b=...&op=...` API 메서드의 기본 Java SDK 메서드 이름은 `getABOp`이고, `POST /`의 기본 SDK 메서드 이름은 `postApiRoot`이며, `GET /{a}/{b}/{op}`의 기본 SDK 메서드 이름은 `getABOp`입니다. 개별 SDK는 명명 규칙을 사용자 지정할 수 있습니다. SDK별 메서드 이름에 대해서는 생성된 SDK 소스의 설명서를 참고하십시오.

각 API 메서드에서 [operationName](https://docs.aws.amazon.com/apigateway/latest/api/API_Method.html#operationName) 속성을 지정하여 기본 SDK 메서드 이름을 재정의할 수 있으며, 이렇게 재정의해야 합니다. API Gateway REST API를 사용하여 [API 메서드를 생성](https://docs.aws.amazon.com/apigateway/latest/api/API_PutMethod.html)하거나 [API 메서드를 업데이트](https://docs.aws.amazon.com/apigateway/latest/api/API_UpdateMethod.html)할 때 이렇게 재정의할 수 있습니다. API Swagger 정의에서 `operationId`를 설정하여 같은 결과를 달성할 수 있습니다.

이 API에 대해 API Gateway에서 생성된 SDK를 사용하여 이러한 메서드를 호출하는 방법을 보여드리기 전에, 먼저 메서드를 설정하는 방법을 간략하게 복습해 보겠습니다. 자세한 지침은 단원을 참조하십시오[API Gateway에서 REST API 개발](rest-api-develop.md) API Gateway를 처음 사용하는 경우 먼저 [AWS Lambda 통합 튜토리얼 선택](getting-started-with-lambda-integration.md) 단원을 참조하십시오.

## 입력 및 출력 모델 생성
<a name="simple-calc-lambda-api-create-models-for-input-and-output"></a>

강력한 입력 형식을 SDK에 지정하기 위해, 먼저 API의 `Input` 모델을 생성합니다. 응답 본문 데이터 유형을 설명하기 위해 `Output` 모델과 `Result` 모델을 생성합니다.

**입력, 출력 및 결과에 대한 모델을 생성하려면**

1. 기본 탐색 창에서 **모델**을 선택합니다.

1. **Create model**(모델 생성)을 선택합니다.

1. **이름**에 **input**을 입력합니다.

1. **콘텐츠 유형**에 **application/json**을 입력합니다.

   일치하는 콘텐츠 유형이 없는 경우 요청 확인이 수행되지 않습니다. 콘텐츠 유형에 관계없이 동일한 모델을 사용하려면 **\$1default**를 입력합니다.

1. **모델 스키마**에서 다음 모델을 입력합니다.

   ```
   {
       "$schema" : "$schema": "http://json-schema.org/draft-04/schema#",
       "type":"object",
       "properties":{
           "a":{"type":"number"},
           "b":{"type":"number"},
           "op":{"type":"string"}
       },
       "title":"Input"
   }
   ```

1. **Create model**(모델 생성)을 선택합니다.

1. 다음 단계를 반복하여 `Output` 모델과 `Result` 모델을 생성합니다.

   `Output` 모델의 경우 **모델 스키마**에 다음을 입력합니다.

   ```
   {
       "$schema": "http://json-schema.org/draft-04/schema#",
       "type": "object",
       "properties": {
           "c": {"type":"number"}
       },
       "title": "Output"
   }
   ```

   `Result` 모델의 경우 **모델 스키마**에 다음을 입력합니다. API ID `abc123`을 해당 API ID로 바꿉니다.

   ```
   {
       "$schema": "http://json-schema.org/draft-04/schema#",
       "type":"object",
       "properties":{
           "input":{
               "$ref":"https://apigateway.amazonaws.com/restapis/abc123/models/Input"
           },
           "output":{
               "$ref":"https://apigateway.amazonaws.com/restapis/abc123/models/Output"
           }
       },
       "title":"Result"
   }
   ```

## GET/메서드 쿼리 파라미터 설정
<a name="simple-calc-lambda-api-set-up-get-method-query-parameters"></a>

`GET /?a=..&b=..&op=..` 메서드의 경우, **Method Request(메서드 요청)**에서 쿼리 파라미터를 선언합니다.

**GEL/URL 쿼리 문자열 파라미터를 설정하려면**

1. 루트(`/`) 리소스의 `GET` 메서드에 대한 **메서드 요청** 섹션에서 **편집**을 선택합니다.

1. **URL 쿼리 문자열 파라미터**를 선택하고 다음을 수행합니다.

   1. **쿼리 문자열 추가(Add query string)**를 선택합니다.

   1. **이름**에 **a**을 입력합니다.

   1. **필수** 상태로 유지하고 **캐싱**을 해제합니다.

   1. **캐싱**을 꺼진 상태로 둡니다.

   같은 단계를 반복하여 **b**라는 쿼리 문자열과 **op**라는 쿼리 문자열을 생성합니다.

1. **Save**(저장)를 선택합니다.

## 페이로드의 데이터 모델을 백엔드 입력값으로 설정
<a name="simple-calc-lambda-api-set-up-post-method-body-data-type"></a>

`POST /` 메서드의 경우, `Input` 모델을 생성하고 이를 메서드 요청에 추가하여 입력 데이터의 형태를 정의합니다.

**페이로드의 데이터 모델을 백엔드 입력으로 설정하려면**

1. 루트(`/`) 리소스의 `POST` 메서드에 대한 **메서드 요청** 섹션에서 **편집**을 선택합니다.

1. **요청 본문**을 선택합니다.

1. **모델 추가**를 선택합니다.

1. **콘텐츠 유형**에 **application/json**을 입력합니다.

1. **모델**에서 **입력**을 선택합니다.

1. **Save**(저장)를 선택합니다.

이 모델을 사용하는 API 고객은 SDK를 호출하여 `Input` 객체를 인스턴스화하고 입력값을 지정할 수 있습니다. 이 모델을 사용하지 않는 고객은 딕셔너리 객체를 생성하여 Lambda 함수에 대한 JSON 입력을 표시해야 합니다.

## 백엔드 결과 출력용 데이터 모델 설정
<a name="simple-calc-lambda-api-set-up-all-methods-result-data-type"></a>

세 가지 메서드 모두에 대해 `Result` 모델을 생성하고 메서드의 `Method Response`에 추가하여 Lambda 함수에서 반환되는 출력 형태를 정의합니다.

**백엔드 결과 출력용 데이터 모델을 설정하려면**

1. **/\$1a\$1/\$1b\$1/\$1op\$1** 리소스를 선택한 다음 **GET** 메서드를 선택합니다.

1. **메서드 응답** 탭의 **응답 200**에서 **편집**을 선택합니다.

1. **요청 본문**에서 **모델 추가**를 선택합니다.

1. **콘텐츠 유형**에 **application/json**을 입력합니다.

1. **모델**에서 **결과**를 선택합니다.

1. **Save**(저장)를 선택합니다.

API 고객은 `Result` 객체의 속성을 읽고 이 모델로 출력값을 분석할 수 있습니다. 이 모델을 사용하지 않는 경우, 고객이 딕셔너리 객체를 생성해서 JSON 출력을 표시해야 합니다.

# 간편 계산기 API OpenAPI 정의
<a name="simple-calc-lambda-api-swagger-definition"></a>

다음은 간편 계산기 API의 OpenAPI 정의입니다. 이 정의를 계정으로 가져올 수 있습니다. 하지만 가져온 후에는 [Lambda 함수](simple-calc-nodejs-lambda-function.md)에서 리소스 기반 권한을 다시 설정해야 합니다. 이렇게 하려면 사용자의 계정에서 생성한 Lambda 함수를 API Gateway 콘솔의 **Integration Request(통합 요청)**에서 다시 선택합니다. 그러면 API Gateway 콘솔에서 필요한 권한이 재설정됩니다. 또는 AWS Command Line Interface에서 Lambda 명령 [add-permission](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html)을 사용할 수 있습니다.

------
#### [ OpenAPI 2.0 ]

```
{
  "swagger": "2.0",
  "info": {
    "version": "2016-09-29T20:27:30Z",
    "title": "SimpleCalc"
  },
  "host": "t6dve4zn25.execute-api.us-west-2.amazonaws.com",
  "basePath": "/demo",
  "schemes": [
    "https"
  ],
  "paths": {
    "/": {
      "get": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "op",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "a",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "b",
            "in": "query",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Result"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "requestTemplates": {
            "application/json": "#set($inputRoot = $input.path('$'))\n{\n  \"a\" : $input.params('a'),\n  \"b\" : $input.params('b'),\n  \"op\" : \"$input.params('op')\"\n}"
          },
          "uri": "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123456789012:function:Calc/invocations",
          "passthroughBehavior": "when_no_templates",
          "httpMethod": "POST",
          "responses": {
            "default": {
              "statusCode": "200",
              "responseTemplates": {
                "application/json": "#set($inputRoot = $input.path('$'))\n{\n  \"input\" : {\n    \"a\" : $inputRoot.a,\n    \"b\" : $inputRoot.b,\n    \"op\" : \"$inputRoot.op\"\n  },\n  \"output\" : {\n    \"c\" : $inputRoot.c\n  }\n}"
              }
            }
          },
          "type": "aws"
        }
      },
      "post": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "in": "body",
            "name": "Input",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Input"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Result"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "uri": "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123456789012:function:Calc/invocations",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST",
          "responses": {
            "default": {
              "statusCode": "200",
              "responseTemplates": {
                "application/json": "#set($inputRoot = $input.path('$'))\n{\n  \"input\" : {\n    \"a\" : $inputRoot.a,\n    \"b\" : $inputRoot.b,\n    \"op\" : \"$inputRoot.op\"\n  },\n  \"output\" : {\n    \"c\" : $inputRoot.c\n  }\n}"
              }
            }
          },
          "type": "aws"
        }
      }
    },
    "/{a}": {
      "x-amazon-apigateway-any-method": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "a",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "404": {
            "description": "404 response"
          }
        },
        "x-amazon-apigateway-integration": {
          "requestTemplates": {
            "application/json": "{\"statusCode\": 200}"
          },
          "passthroughBehavior": "when_no_match",
          "responses": {
            "default": {
              "statusCode": "404",
              "responseTemplates": {
                "application/json": "{ \"Message\" : \"Can't $context.httpMethod $context.resourcePath\" }"
              }
            }
          },
          "type": "mock"
        }
      }
    },
    "/{a}/{b}": {
      "x-amazon-apigateway-any-method": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "a",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "b",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "404": {
            "description": "404 response"
          }
        },
        "x-amazon-apigateway-integration": {
          "requestTemplates": {
            "application/json": "{\"statusCode\": 200}"
          },
          "passthroughBehavior": "when_no_match",
          "responses": {
            "default": {
              "statusCode": "404",
              "responseTemplates": {
                "application/json": "{ \"Message\" : \"Can't $context.httpMethod $context.resourcePath\" }"
              }
            }
          },
          "type": "mock"
        }
      }
    },
    "/{a}/{b}/{op}": {
      "get": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "a",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "b",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "op",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Result"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "requestTemplates": {
            "application/json": "#set($inputRoot = $input.path('$'))\n{\n  \"a\" : $input.params('a'),\n  \"b\" : $input.params('b'),\n  \"op\" : \"$input.params('op')\"\n}"
          },
          "uri": "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123456789012:function:Calc/invocations",
          "passthroughBehavior": "when_no_templates",
          "httpMethod": "POST",
          "responses": {
            "default": {
              "statusCode": "200",
              "responseTemplates": {
                "application/json": "#set($inputRoot = $input.path('$'))\n{\n  \"input\" : {\n    \"a\" : $inputRoot.a,\n    \"b\" : $inputRoot.b,\n    \"op\" : \"$inputRoot.op\"\n  },\n  \"output\" : {\n    \"c\" : $inputRoot.c\n  }\n}"
              }
            }
          },
          "type": "aws"
        }
      }
    }
  },
  "definitions": {
    "Input": {
      "type": "object",
      "properties": {
        "a": {
          "type": "number"
        },
        "b": {
          "type": "number"
        },
        "op": {
          "type": "string"
        }
      },
      "title": "Input"
    },
    "Output": {
      "type": "object",
      "properties": {
        "c": {
          "type": "number"
        }
      },
      "title": "Output"
    },
    "Result": {
      "type": "object",
      "properties": {
        "input": {
          "$ref": "#/definitions/Input"
        },
        "output": {
          "$ref": "#/definitions/Output"
        }
      },
      "title": "Result"
    }
  }
}
```

------
#### [ OpenAPI 3.0 ]

```
{
  "openapi" : "3.0.1",
  "info" : {
    "title" : "SimpleCalc",
    "version" : "2016-09-29T20:27:30Z"
  },
  "servers" : [ {
    "url" : "https://t6dve4zn25.execute-api.us-west-2.amazonaws.com/{basePath}",
    "variables" : {
      "basePath" : {
        "default" : "demo"
      }
    }
  } ],
  "paths" : {
    "/{a}/{b}" : {
      "x-amazon-apigateway-any-method" : {
        "parameters" : [ {
          "name" : "a",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "b",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "404" : {
            "description" : "404 response",
            "content" : { }
          }
        },
        "x-amazon-apigateway-integration" : {
          "type" : "mock",
          "responses" : {
            "default" : {
              "statusCode" : "404",
              "responseTemplates" : {
                "application/json" : "{ \"Message\" : \"Can't $context.httpMethod $context.resourcePath\" }"
              }
            }
          },
          "requestTemplates" : {
            "application/json" : "{\"statusCode\": 200}"
          },
          "passthroughBehavior" : "when_no_match"
        }
      }
    },
    "/{a}/{b}/{op}" : {
      "get" : {
        "parameters" : [ {
          "name" : "a",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "b",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "op",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "200 response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/Result"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration" : {
          "type" : "aws",
          "httpMethod" : "POST",
          "uri" : "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:111122223333:function:Calc/invocations",
          "responses" : {
            "default" : {
              "statusCode" : "200",
              "responseTemplates" : {
                "application/json" : "#set($inputRoot = $input.path('$'))\n{\n  \"input\" : {\n    \"a\" : $inputRoot.a,\n    \"b\" : $inputRoot.b,\n    \"op\" : \"$inputRoot.op\"\n  },\n  \"output\" : {\n    \"c\" : $inputRoot.c\n  }\n}"
              }
            }
          },
          "requestTemplates" : {
            "application/json" : "#set($inputRoot = $input.path('$'))\n{\n  \"a\" : $input.params('a'),\n  \"b\" : $input.params('b'),\n  \"op\" : \"$input.params('op')\"\n}"
          },
          "passthroughBehavior" : "when_no_templates"
        }
      }
    },
    "/" : {
      "get" : {
        "parameters" : [ {
          "name" : "op",
          "in" : "query",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "a",
          "in" : "query",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "b",
          "in" : "query",
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "200 response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/Result"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration" : {
          "type" : "aws",
          "httpMethod" : "POST",
          "uri" : "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:111122223333:function:Calc/invocations",
          "responses" : {
            "default" : {
              "statusCode" : "200",
              "responseTemplates" : {
                "application/json" : "#set($inputRoot = $input.path('$'))\n{\n  \"input\" : {\n    \"a\" : $inputRoot.a,\n    \"b\" : $inputRoot.b,\n    \"op\" : \"$inputRoot.op\"\n  },\n  \"output\" : {\n    \"c\" : $inputRoot.c\n  }\n}"
              }
            }
          },
          "requestTemplates" : {
            "application/json" : "#set($inputRoot = $input.path('$'))\n{\n  \"a\" : $input.params('a'),\n  \"b\" : $input.params('b'),\n  \"op\" : \"$input.params('op')\"\n}"
          },
          "passthroughBehavior" : "when_no_templates"
        }
      },
      "post" : {
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/Input"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "200 response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/Result"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration" : {
          "type" : "aws",
          "httpMethod" : "POST",
          "uri" : "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:111122223333:function:Calc/invocations",
          "responses" : {
            "default" : {
              "statusCode" : "200",
              "responseTemplates" : {
                "application/json" : "#set($inputRoot = $input.path('$'))\n{\n  \"input\" : {\n    \"a\" : $inputRoot.a,\n    \"b\" : $inputRoot.b,\n    \"op\" : \"$inputRoot.op\"\n  },\n  \"output\" : {\n    \"c\" : $inputRoot.c\n  }\n}"
              }
            }
          },
          "passthroughBehavior" : "when_no_match"
        }
      }
    },
    "/{a}" : {
      "x-amazon-apigateway-any-method" : {
        "parameters" : [ {
          "name" : "a",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "404" : {
            "description" : "404 response",
            "content" : { }
          }
        },
        "x-amazon-apigateway-integration" : {
          "type" : "mock",
          "responses" : {
            "default" : {
              "statusCode" : "404",
              "responseTemplates" : {
                "application/json" : "{ \"Message\" : \"Can't $context.httpMethod $context.resourcePath\" }"
              }
            }
          },
          "requestTemplates" : {
            "application/json" : "{\"statusCode\": 200}"
          },
          "passthroughBehavior" : "when_no_match"
        }
      }
    }
  },
  "components" : {
    "schemas" : {
      "Input" : {
        "title" : "Input",
        "type" : "object",
        "properties" : {
          "a" : {
            "type" : "number"
          },
          "b" : {
            "type" : "number"
          },
          "op" : {
            "type" : "string"
          }
        }
      },
      "Output" : {
        "title" : "Output",
        "type" : "object",
        "properties" : {
          "c" : {
            "type" : "number"
          }
        }
      },
      "Result" : {
        "title" : "Result",
        "type" : "object",
        "properties" : {
          "input" : {
            "$ref" : "#/components/schemas/Input"
          },
          "output" : {
            "$ref" : "#/components/schemas/Output"
          }
        }
      }
    }
  }
}
```

------

# API Gateway에서 API의 Java SDK 생성
<a name="generate-java-sdk-of-an-api"></a>

다음 절차에서는 API Gateway에서 API의 Java SDK를 생성하는 방법을 보여줍니다.

**API Gateway에서 API의 Java SDK를 생성하려면**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. REST API를 선택합니다.

1. **단계**를 선택합니다.

1. **스테이지** 창에서 스테이지의 이름을 선택합니다.

1. **스테이지 작업** 메뉴를 연 다음 **SDK 생성**을 선택합니다.

1. **플랫폼**에서 **Java** 플랫폼을 선택하고 다음을 수행합니다.

   1.  **서비스 이름**에 SDK 이름을 지정합니다. 예: **SimpleCalcSdk**. 이 이름이 SDK 클라이언트 클래스 이름이 됩니다. 이 이름은 SDK 프로젝트 폴더에 있는 pom.xml 파일에서 `<name>` 아래에 있는 `<project>` 태그에 해당합니다. 하이픈이 포함되면 안 됩니다.

   1.  **Java 패키지 이름(Java Package Name)**에 SDK의 패키지 이름을 지정합니다. 예: **examples.aws.apig.simpleCalc.sdk**. 이 패키지 이름은 SDK 라이브러리의 네임스페이스로 사용됩니다. 하이픈이 포함되면 안 됩니다.

   1.  **Java Build System(Java 빌드 시스템)**에 **maven** 또는 **gradle**을 입력하여 빌드 시스템을 지정합니다.

   1.  **Java Group Id(Java 그룹 ID)**에 SDK 프로젝트의 그룹 식별자를 입력합니다. 예를 들면 **my-apig-api-examples**를 입력합니다. 이 식별자는 SDK 프로젝트 폴더에 있는 `<groupId>` 파일의 `<project>` 아래에 있는 `pom.xml` 태그에 해당합니다.

   1.  **Java Artifact Id(Java 아티팩트 ID)**에 SDK 프로젝트의 아티팩트 식별자를 입력합니다. 예를 들면 **simple-calc-sdk**를 입력합니다. 이 식별자는 SDK 프로젝트 폴더에 있는 `<artifactId>` 파일의 `<project>` 아래에 있는 `pom.xml` 태그에 해당합니다.

   1.  **Java Artifact Version(Java 아티팩트 버전)**에 버전 식별자 문자열을 입력합니다. 예: **1.0.0**. 이 버전 식별자는 SDK 프로젝트 폴더에 있는 `<version>` 파일의 `<project>` 아래에 있는 `pom.xml` 태그에 해당합니다.

   1. **Source Code License Text(소스 코드 라이선스 텍스트)**에 소스 코드의 라이선스 텍스트를 입력합니다(해당하는 경우).

1. **SDK 생성**를 선택한 다음, 화면 지침에 따라 API Gateway에서 생성된 SDK를 다운로드합니다.

생성된 SDK를 사용하려면 [API Gateway에서 생성한 REST API용 Java SDK 사용](how-to-call-apigateway-generated-java-sdk.md)의 지침을 따르십시오.

 API를 업데이트할 때마다 해당 API를 재배포하고 SDK를 재생성하여 업데이트 내용이 포함되도록 해야 합니다.

# API Gateway에서 API의 Android SDK 생성
<a name="generate-android-sdk-of-an-api"></a>

다음 절차에서는 API Gateway에서 API의 Android SDK를 생성하는 방법을 보여줍니다.

**API Gateway에서 API의 Android SDK를 생성하려면**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. REST API를 선택합니다.

1. **단계**를 선택합니다.

1. **스테이지** 창에서 스테이지의 이름을 선택합니다.

1. **스테이지 작업** 메뉴를 연 다음 **SDK 생성**을 선택합니다.

1. **플랫폼**에서 Android 플랫폼을 선택하고 다음을 수행합니다.

   1.  **그룹 ID**에 해당 프로젝트의 고유 식별자를 입력합니다. 이는 `pom.xml` 파일에 사용됩니다(예: **com.mycompany**).

   1.  **Invoker package(호출자 패키지)**에 생성된 클라이언트 클래스의 네임스페이스를 입력합니다(예: **com.mycompany.clientsdk**).

   1.  **Artifact ID(아티팩트 ID)**에 버전 없이 컴파일된 .jar 파일의 이름을 입력합니다. 이는 `pom.xml` 파일에 사용됩니다(예: **aws-apigateway-api-sdk**).

   1. **Artifact version(아티팩트 버전)**에 생성된 클라이언트의 아티팩트 버전 번호를 입력합니다. 이는 `pom.xml` 파일에 사용되며 *major*.*minor*.*patch* 패턴을 따라야 합니다(예: **1.0.0**)

1. **SDK 생성**를 선택한 다음, 화면 지침에 따라 API Gateway에서 생성된 SDK를 다운로드합니다.

생성된 SDK를 사용하려면 [API Gateway에서 생성한 REST API용 Android SDK 사용](how-to-generate-sdk-android.md)의 지침을 따르십시오.

 API를 업데이트할 때마다 해당 API를 재배포하고 SDK를 재생성하여 업데이트 내용이 포함되도록 해야 합니다.

# API Gateway에서 API의 iOS SDK 생성
<a name="generate-ios-sdk-of-an-api"></a>

다음 절차에서는 API Gateway에서 API의 iOS SDK를 생성하는 방법을 보여줍니다.

**API Gateway에서 API의 iOS SDK를 생성하려면**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. REST API를 선택합니다.

1. **단계**를 선택합니다.

1. **스테이지** 창에서 스테이지의 이름을 선택합니다.

1. **스테이지 작업** 메뉴를 연 다음 **SDK 생성**을 선택합니다.

1. **플랫폼**에서 **iOS(Objective-C) 또는 iOS(Swift)** 플랫폼을 선택하고 다음을 수행합니다.

   1. **접두사** 상자에 고유한 접두사를 입력합니다.

     접두사의 효과는 다음과 같습니다. 예를 들어 `input`, `output`, 및 `result` 모델을 이용해 **SIMPLE\$1CALC**를 [SimpleCalc](simple-calc-lambda-api.md) API의 SDK에 대한 접두사로 할당하는 경우, 생성된 SDK에는 메서드 요청/응답을 포함해 API를 캡슐화하는 `SIMPLE_CALCSimpleCalcClient` 클래스가 포함됩니다. 또한 생성된 SDK에는 각각 입력, 출력, 결과를 나타내는 `SIMPLE_CALCinput`, `SIMPLE_CALCoutput`, `SIMPLE_CALCresult` 클래스가 포함되어, 요청 입력과 응답 출력을 나타냅니다. 자세한 내용은 [Objective-C 또는 Swift에서 API Gateway에 의해 생성되는 REST API용 iOS SDK 사용](how-to-generate-sdk-ios.md) 단원을 참조하세요.

1. **SDK 생성**를 선택한 다음, 화면 지침에 따라 API Gateway에서 생성된 SDK를 다운로드합니다.

생성된 SDK를 사용하려면 [Objective-C 또는 Swift에서 API Gateway에 의해 생성되는 REST API용 iOS SDK 사용](how-to-generate-sdk-ios.md)의 지침을 따르십시오.

 API를 업데이트할 때마다 해당 API를 재배포하고 SDK를 재생성하여 업데이트 내용이 포함되도록 해야 합니다.

# API Gateway에서 REST API의 JavaScript SDK 생성
<a name="generate-javascript-sdk-of-an-api"></a>

다음 절차에서는 API Gateway에서 API의 JavaScript SDK를 생성하는 방법을 보여줍니다.

**API Gateway에서 API의 JavaScript SDK를 생성하려면**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. REST API를 선택합니다.

1. **단계**를 선택합니다.

1. **스테이지** 창에서 스테이지의 이름을 선택합니다.

1. **스테이지 작업** 메뉴를 연 다음 **SDK 생성**을 선택합니다.

1. **플랫폼**에서 **JavaScript** 플랫폼을 선택합니다.

1. **SDK 생성**를 선택한 다음, 화면 지침에 따라 API Gateway에서 생성된 SDK를 다운로드합니다.

생성된 SDK를 사용하려면 [API Gateway에서 생성한 REST API용 JavaScript SDK 사용](how-to-generate-sdk-javascript.md)의 지침을 따르십시오.

 API를 업데이트할 때마다 해당 API를 재배포하고 SDK를 재생성하여 업데이트 내용이 포함되도록 해야 합니다.

# API Gateway에서 API의 Ruby SDK 생성
<a name="generate-ruby-sdk-of-an-api"></a>

다음 절차에서는 API Gateway에서 API의 Ruby SDK를 생성하는 방법을 보여줍니다.

**API Gateway에서 API의 Ruby SDK를 생성하려면**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. REST API를 선택합니다.

1. **단계**를 선택합니다.

1. **스테이지** 창에서 스테이지의 이름을 선택합니다.

1. **스테이지 작업** 메뉴를 연 다음 **SDK 생성**을 선택합니다.

1. **플랫폼**에서 **Ruby** 플랫폼을 선택하고 다음을 수행합니다.

   1.  **서비스 이름**에 SDK 이름을 지정합니다. 예: **SimpleCalc**. 이것은 API의 Ruby Gem 네임스페이스를 생성하는 데 사용됩니다. 이름은 다른 특수 문자나 숫자 없이 모두 문자(`a-zA-Z`)여야 합니다.

   1.  **Ruby Gem 이름(Ruby Gem Name)**에서 API를 위해 생성된 SDK 소스 코드를 포함하도록 Ruby Gem 이름을 지정합니다. 기본적으로 이름은 소문자 서비스 이름에 `-sdk` 접미사가 붙습니다(예: **simplecalc-sdk**).

   1.  **Ruby Gem 버전(Ruby Gem Version)**에서 생성된 Ruby Gem의 버전 번호를 지정합니다. 기본적으로 `1.0.0`로 설정됩니다.

1. **SDK 생성**를 선택한 다음, 화면 지침에 따라 API Gateway에서 생성된 SDK를 다운로드합니다.

생성된 SDK를 사용하려면 [API Gateway에서 생성한 REST API용 Ruby SDK 사용](how-to-call-sdk-ruby.md)의 지침을 따르십시오.

 API를 업데이트할 때마다 해당 API를 재배포하고 SDK를 재생성하여 업데이트 내용이 포함되도록 해야 합니다.

# API Gateway에서 AWS CLI 명령을 사용하여 API용 SDK 생성
<a name="how-to-generate-sdk-cli"></a>

AWS CLI를 사용하면 [get-sdk](https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-sdk.html) 명령을 호출하여 지원되는 플랫폼의 API용 SDK를 생성하고 다운로드할 수 있습니다. 지원되는 일부 플랫폼에서 이렇게 하는 방법이 아래에 나와 있습니다.

**Topics**
+ [AWS CLI를 사용하여 Android SDK용 Java를 생성 및 다운로드](#how-to-generate-sdk-cli-android)
+ [AWS CLI를 사용하여 JavaScript SDK를 생성 및 다운로드](#how-to-generate-sdk-cli-js)
+ [AWS CLI를 사용하여 Ruby SDK를 생성 및 다운로드](#how-to-generate-sdk-cli-ruby)

## AWS CLI를 사용하여 Android SDK용 Java를 생성 및 다운로드
<a name="how-to-generate-sdk-cli-android"></a>

지정된 단계(`udpuvvzbkc`)에서 API(`test`)의 API Gateway가 생성하는 Java for Android SDK를 생성하고 다운로드하려면 다음과 같이 명령을 호출합니다.

```
aws apigateway get-sdk \
            --rest-api-id udpuvvzbkc \
            --stage-name test \
            --sdk-type android \
            --parameters groupId='com.mycompany',\
                invokerPackage='com.mycompany.myApiSdk',\ 
                artifactId='myApiSdk',\
                artifactVersion='0.0.1' \
            ~/apps/myApi/myApi-android-sdk.zip
```

`~/apps/myApi/myApi-android-sdk.zip`의 마지막 입력은 `myApi-android-sdk.zip`이라는 다운로드한 SDK 파일의 경로입니다.

## AWS CLI를 사용하여 JavaScript SDK를 생성 및 다운로드
<a name="how-to-generate-sdk-cli-js"></a>

지정된 단계(`udpuvvzbkc`)에서 API(`test`)의 API Gateway가 생성하는 JavaScript SDK를 생성하고 다운로드하려면 다음과 같이 명령을 호출합니다.

```
aws apigateway get-sdk \
            --rest-api-id udpuvvzbkc \
            --stage-name test \
            --sdk-type javascript \
            ~/apps/myApi/myApi-js-sdk.zip
```

`~/apps/myApi/myApi-js-sdk.zip`의 마지막 입력은 `myApi-js-sdk.zip`이라는 다운로드한 SDK 파일의 경로입니다.

## AWS CLI를 사용하여 Ruby SDK를 생성 및 다운로드
<a name="how-to-generate-sdk-cli-ruby"></a>

특정 단계(`udpuvvzbkc`)에 있는 API(`test`)의 Ruby SDK를 생성하고 다운로드하려면 다음과 같이 명령을 호출합니다.

```
aws apigateway get-sdk \
            --rest-api-id udpuvvzbkc \
            --stage-name test  \
            --sdk-type ruby \
            --parameters service.name=myApiRubySdk,ruby.gem-name=myApi,ruby.gem-version=0.01 \
            ~/apps/myApi/myApi-ruby-sdk.zip
```

`~/apps/myApi/myApi-ruby-sdk.zip`의 마지막 입력은 `myApi-ruby-sdk.zip`이라는 다운로드한 SDK 파일의 경로입니다.

 그런 다음 생성된 SDK를 사용하여 기본 API를 호출하는 방법을 살펴보겠습니다. 자세한 내용은 [API Gateway에서 REST API 간접 호출](how-to-call-api.md) 단원을 참조하십시오.