

# Objective-C 또는 Swift에서 API Gateway에 의해 생성되는 REST API용 iOS SDK 사용
<a name="how-to-generate-sdk-ios"></a>

이 자습서에서는 Objective-C 또는 Swift 앱에서 API Gateway에 의해 생성되는 REST API용 iOS SDK를 사용하여 기본 API를 호출하는 방법을 보여줍니다. [SimpleCalc API](simple-calc-lambda-api.md)를 예제로 사용하여 다음 주제를 설명합니다.
+ 필요한 AWS Mobile SDK 구성 요소를 Xcode 프로젝트에 설치하는 방법
+ API 메서드를 호출하기 전에 API 클라이언트 객체를 생성하는 방법
+ API 클라이언트 객체에서 해당 SDK 메서드를 통해 API 메서드를 호출하는 방법
+ 메서드 입력을 준비하고 SDK의 해당 모델 클래스를 사용하여 결과를 구문 분석하는 방법

**Topics**
+ [

## 생성된 iOS SDK(Objective-C)를 사용하여 API 호출
](#how-to-use-sdk-ios-objc)
+ [

## API를 호출하기 위해 생성된 iOS SDK(Swift) 사용
](#how-to-generate-sdk-ios-swift)

## 생성된 iOS SDK(Objective-C)를 사용하여 API 호출
<a name="how-to-use-sdk-ios-objc"></a>

다음 절차를 시작하기 전에 Objective-C에서 iOS에 대한 [API Gateway에서 REST API SDK 생성](how-to-generate-sdk.md)의 단계를 완료하고 생성된 SDK에 대한 .zip 파일을 다운로드해야 합니다.

### Objective-C 프로젝트에서 API Gateway에 의해 생성되는 iOS SDK 및 AWS Mobile SDK 설치
<a name="use-sdk-ios-objc-install-sdk"></a>

다음 절차에서는 SDK를 설치하는 방법을 설명합니다.

**Objective-C에서 API Gateway가 생성한 iOS SDK를 설치하고 사용하려면**

1. 앞서 다운로드한 API Gateway가 생성한 .zip 파일의 압축을 풉니다. [SimpleCalc API](simple-calc-lambda-api.md)를 사용하여 압축 해제된 SDK 폴더의 이름을 **sdk\$1objc\$1simple\$1calc** 등으로 바꿉니다. 이 SDK 폴더에는 `README.md` 파일과 `Podfile` 파일이 있습니다. `README.md` 파일에는 SDK를 설치하고 사용하기 위한 지침이 포함되어 있습니다. 이 자습서는 이러한 지침에 대한 세부 정보를 제공합니다. 설치 시 [CocoaPods](https://cocoapods.org)를 활용해 필요한 API Gateway 라이브러리와 기타 종속 AWS Mobile SDK 구성 요소를 가져옵니다. `Podfile`을 업데이트하여 앱의 Xcode 프로젝트로 SDK를 가져와야 합니다. 아카이빙을 해제한 SDK 폴더에는 사용자 API에서 생성한 SDK의 소스 코드를 포함하는 `generated-src` 폴더도 포함되어 있습니다.

1. Xcode를 시작하고 새로운 iOS Objective-C 프로젝트를 생성합니다. 프로젝트의 대상을 기록해 둡니다. `Podfile`에 이를 설정해야 합니다.

      
![\[Xcode에서 대상을 찾습니다.\]](http://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/images/use-sdk-in-ios-objc-project-find-target.png)

1. CocoaPods를 이용해 AWS Mobile SDK for iOS를 Xcode 프로젝트로 가져오려면 다음과 같이 하십시오.

   1. 터미널 창에 다음 명령을 실행하여 CocoaPods를 설치합니다.

      ```
      sudo gem install cocoapods
      pod setup
      ```

   1. 압축을 푼 SDK 폴더에서 `Podfile` 파일을 복사하여 Xcode 프로젝트 파일을 포함하는 동일 디렉터리에 추가합니다. 다음 블록:

      ```
      target '<YourXcodeTarget>' do
          pod 'AWSAPIGateway', '~> 2.4.7'
      end
      ```

      을 프로젝트 대상 이름: 으로 바꿉니다.

      ```
      target 'app_objc_simple_calc' do
          pod 'AWSAPIGateway', '~> 2.4.7'
      end
      ```

      Xcode 프로젝트에 이미 `Podfile`이라는 파일이 있는 경우, 다음 코드 줄을 추가합니다.

      ```
      pod 'AWSAPIGateway', '~> 2.4.7'
      ```

   1. 터미널 창을 열고 다음 명령을 실행합니다.

      ```
      pod install
      ```

      그러면 API Gateway 구성 요소와 기타 종속 AWS Mobile SDK 구성 요소가 설치됩니다.

   1. Xcode 프로젝트를 닫은 후 `.xcworkspace` 파일을 열어 Xcode를 다시 시작합니다.

   1. 압축을 푼 SDK의 `.h` 디렉터리에 포함된 모든 `.m` 및 `generated-src` 파일을 Xcode 프로젝트에 추가합니다.

         
![\[.h 및 .m 파일은 generated-src에 있습니다.\]](http://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/images/use-sdk-in-ios-objc-project-add-sdk-src.png)

   AWS Mobile SDK를 명시적으로 다운로드하거나 [Carthage](https://github.com/Carthage/Carthage#installing-carthage)를 이용해 프로젝트로 AWS Mobile SDK for iOS Objective-C를 가져오려면 *README.md* 파일의 지침을 따르세요. 이러한 옵션 중 하나만 사용하여 AWS Mobile SDK를 가져와야 합니다.

### Objective-C 프로젝트에서 API Gateway에 의해 생성되는 iOS SDK를 사용하여 API 메서드 호출
<a name="use-sdk-ios-objc-call-sdk"></a>

이 [SimpleCalc API](simple-calc-lambda-api.md)에 대한 `SIMPLE_CALC` 접두사와 메서드의 입력(`Input`) 및 출력(`Result`)에 대한 두 모델을 사용하여 SDK를 생성한 경우 SDK에서 결과 API 클라이언트 클래스는 `SIMPLE_CALCSimpleCalcClient`이고 해당 데이터 클래스는 각각 `SIMPLE_CALCInput` 및 `SIMPLE_CALCResult`입니다. API 요청 및 응답은 SDK 메서드에 다음과 같이 매핑됩니다.
+ 다음의 API 요청이

  ```
  GET /?a=...&b=...&op=...
  ```

  다음의 SDK 메서드가 됩니다.

  ```
  (AWSTask *)rootGet:(NSString *)op a:(NSString *)a b:(NSString *)b
  ```

  `AWSTask.result` 모델이 메서드 응답에 추가된 경우 `SIMPLE_CALCResult` 속성은 `Result` 유형입니다. 그렇지 않은 경우 속성은 `NSDictionary` 유형입니다.
+ 다음의 이 API 요청이

  ```
  POST /
      
  {
     "a": "Number",
     "b": "Number",
     "op": "String"
  }
  ```

  다음의 SDK 메서드가 됩니다.

  ```
  (AWSTask *)rootPost:(SIMPLE_CALCInput *)body
  ```
+ 다음의 API 요청이

  ```
  GET /{a}/{b}/{op}
  ```

  다음의 SDK 메서드가 됩니다.

  ```
  (AWSTask *)aBOpGet:(NSString *)a b:(NSString *)b op:(NSString *)op
  ```

다음 절차에서는 Objective-C 앱 소스 코드에서 API 메서드를 호출하는 방법(예: `viewDidLoad` 파일에서 `ViewController.m` 위임자의 일부로 호출)을 설명합니다.

**API Gateway가 생성한 iOS SDK를 통해 API를 호출하려면**

1. API 클라이언트 클래스 헤더 파일을 가져와 앱에서 API 클라이언트 클래스를 호출할 수 있도록 합니다.

   ```
   #import "SIMPLE_CALCSimpleCalc.h"
   ```

   `#import` 명령문은 두 모델 클래스에 대한 `SIMPLE_CALCInput.h` 및 `SIMPLE_CALCResult.h`도 가져옵니다.

1. API 클라이언트 클래스 인스턴스화:

   ```
   SIMPLE_CALCSimpleCalcClient *apiInstance = [SIMPLE_CALCSimpleCalcClient defaultClient];
   ```

   API를 통해 Amazon Cognito를 사용하려면 다음과 같이 기본 `AWSServiceManager` 객체에 `defaultServiceConfiguration` 속성을 설정한 후 `defaultClient` 메서드를 호출해 API 클라이언트 객체를 생성합니다(앞의 예와 같음).

   ```
   AWSCognitoCredentialsProvider *creds = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:your_cognito_pool_id];
   AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:creds];
   AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration;
   ```

1. `GET /?a=1&b=2&op=+` 메서드를 호출하여 `1+2`를 수행합니다.

   ```
   [[apiInstance rootGet: @"+" a:@"1" b:@"2"] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) {
       _textField1.text = [self handleApiResponse:task];
       return nil;
   }];
   ```

   여기에서 헬퍼 함수 `handleApiResponse:task`는 결과 서식을 텍스트 필드 (`_textField1`)에 표시할 문자열로 지정합니다.

   ```
   - (NSString *)handleApiResponse:(AWSTask *)task {
       if (task.error != nil) {
           return [NSString stringWithFormat: @"Error: %@", task.error.description];
       } else if (task.result != nil && [task.result isKindOfClass:[SIMPLE_CALCResult class]]) {
           return [NSString stringWithFormat:@"%@ %@ %@ = %@\n",task.result.input.a, task.result.input.op, task.result.input.b, task.result.output.c];
       }
       return nil;
   }
   ```

   표시되는 결과는 `1 + 2 = 3`입니다.

1. 페이로드와 함께 `POST /` 메서드를 호출하여 `1-2`를 수행합니다.

   ```
   SIMPLE_CALCInput *input = [[SIMPLE_CALCInput alloc] init];
       input.a = [NSNumber numberWithInt:1];
       input.b = [NSNumber numberWithInt:2];
       input.op = @"-";
       [[apiInstance rootPost:input] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) {
           _textField2.text = [self handleApiResponse:task];
           return nil;
       }];
   ```

   표시되는 결과는 `1 - 2 = -1`입니다.

1. `GET /{a}/{b}/{op}`를 호출하여 `1/2`를 수행합니다.

   ```
   [[apiInstance aBOpGet:@"1" b:@"2" op:@"div"] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) {
       _textField3.text = [self handleApiResponse:task];
       return nil;
   }];
   ```

   표시되는 결과는 `1 div 2 = 0.5`입니다. 여기서 `div` 자리에 `/`가 사용되는데, 이유는 백엔드의 [간단한 Lambda 함수](simple-calc-nodejs-lambda-function.md)가 URL로 인코딩된 경로 변수를 처리하지 않기 때문입니다.

## API를 호출하기 위해 생성된 iOS SDK(Swift) 사용
<a name="how-to-generate-sdk-ios-swift"></a>

다음 절차를 시작하기 전에 Swift에서 iOS에 대한 [API Gateway에서 REST API SDK 생성](how-to-generate-sdk.md)의 단계를 완료하고 생성된 SDK에 대한 .zip 파일을 다운로드해야 합니다.

**Topics**
+ [

### AWS Mobile SDK 및 API Gateway 생성 SDK를 Swift 프로젝트에 설치
](#use-sdk-ios-swift-install-sdk)
+ [

### Swift 프로젝트에서 API Gateway가 생성한 iOS SDK를 통해 API 메서드 호출
](#use-sdk-ios-swift-call-api)

### AWS Mobile SDK 및 API Gateway 생성 SDK를 Swift 프로젝트에 설치
<a name="use-sdk-ios-swift-install-sdk"></a>

다음 절차에서는 SDK를 설치하는 방법을 설명합니다.

**Swift에서 API Gateway가 생성한 iOS SDK를 설치하고 사용하려면**

1. 앞서 다운로드한 API Gateway가 생성한 .zip 파일의 압축을 풉니다. [SimpleCalc API](simple-calc-lambda-api.md)를 사용하여 압축 해제된 SDK 폴더의 이름을 **sdk\$1swift\$1simple\$1calc** 등으로 바꿉니다. 이 SDK 폴더에는 `README.md` 파일과 `Podfile` 파일이 있습니다. `README.md` 파일에는 SDK를 설치하고 사용하기 위한 지침이 포함되어 있습니다. 이 자습서는 이러한 지침에 대한 세부 정보를 제공합니다. 설치 시 [CocoaPods](https://cocoapods.org)를 활용해 필요한 AWS Mobile SDK 구성 요소를 가져옵니다. `Podfile`을 업데이트하여 Swift 앱의 Xcode 프로젝트로 SDK를 가져와야 합니다. 아카이빙을 해제한 SDK 폴더에는 사용자 API에서 생성한 SDK의 소스 코드를 포함하는 `generated-src` 폴더도 포함되어 있습니다.

1. Xcode를 시작하고 새로운 iOS Swift 프로젝트를 생성합니다. 프로젝트의 대상을 기록해 둡니다. `Podfile`에 이를 설정해야 합니다.

      
![\[Xcode에서 대상을 찾습니다.\]](http://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/images/use-sdk-in-ios-swift-project-find-target.png)

1. CocoaPods를 이용해 필요한 AWS Mobile SDK 구성 요소를 Xcode 프로젝트로 가져오려면 다음과 같이 합니다.

   1. CocoaPods가 아직 설치되어 있지 않은 경우 터미널 창에 다음 명령을 실행하여 설치합니다.

      ```
      sudo gem install cocoapods
      pod setup
      ```

   1. 압축을 푼 SDK 폴더에서 `Podfile` 파일을 복사하여 Xcode 프로젝트 파일을 포함하는 동일 디렉터리에 추가합니다. 다음 블록:

      ```
      target '<YourXcodeTarget>' do
          pod 'AWSAPIGateway', '~> 2.4.7'
      end
      ```

      프로젝트 대상 이름은 다음과 같습니다.

      ```
      target 'app_swift_simple_calc' do
          pod 'AWSAPIGateway', '~> 2.4.7'
      end
      ```

      Xcode 프로젝트에 이미 올바른 대상의 `Podfile`이 있는 경우, 다음 코드 줄을 `do ... end` 루프에 추가하기만 하면 됩니다.

      ```
      pod 'AWSAPIGateway', '~> 2.4.7'
      ```

   1. 터미널 창을 열고 앱 디렉터리에서 다음 명령을 실행합니다.

      ```
      pod install
      ```

      그러면 앱의 프로젝트에 API Gateway 구성 요소와 종속 AWS Mobile SDK 구성 요소가 설치됩니다.

   1. Xcode 프로젝트를 닫은 후 `*.xcworkspace` 파일을 열어 Xcode를 다시 시작합니다.

   1. 추출한 `.h` 디렉터리에서 SDK의 모든 헤더 파일(`.swift`) 및 Swift 소스 코드 파일(`generated-src`)을 Xcode 프로젝트에 추가합니다.

         
![\[.h 및 .swift 파일은 generated-src에 있습니다.\]](http://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/images/use-sdk-in-ios-swift-project-add-sdk-src.png)

   1. Swift 코드 프로젝트에서 AWS Mobile SDK의 Objective-C 라이브러리 호출을 활성화하려면 Xcode 프로젝트 구성의 **Swift Compiler - General** 설정에서 **Objective-C Bridging Header** 속성에 `Bridging_Header.h` 파일 경로를 설정합니다.

         
![\[Swift Compiler - General에서 Bridging_Header.h 파일 경로를 설정합니다.\]](http://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/images/use-sdk-in-ios-swift-project-set-bridging-header.png)
**작은 정보**  
Xcode의 검색 상자에 **bridging**을 입력하여 **Objective-C Bridging Header** 속성을 찾을 수 있습니다.

   1. Xcode 프로젝트를 구축하여 적절하게 구성되어 있는지 확인한 후 다음 단계로 진행합니다. Xcode가 AWS Mobile SDK에 지원되는 Swift보다 최신 버전을 사용하는 경우, Swift 컴파일러 오류를 받게 됩니다. 이 경우 **Swift Compiler - Version** 설정에서 **Use Legacy Swift Language Version** 속성을 **예**로 설정합니다.

         
![\[Legacy Swift Language Version 속성을 Yes로 설정합니다.\]](http://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/images/use-sdk-in-ios-swift-project-set-legacy-swift-version.png)

   AWS Mobile SDK를 명시적으로 다운로드하거나 [Carthage](https://github.com/Carthage/Carthage#installing-carthage)를 이용해 Swift에서 AWS Mobile SDK for iOS를 프로젝트로 가져오려면 SDK 패키지와 함께 제공된 `README.md` 파일의 지침을 따릅니다. 이러한 옵션 중 하나만 사용하여 AWS Mobile SDK를 가져와야 합니다.

### Swift 프로젝트에서 API Gateway가 생성한 iOS SDK를 통해 API 메서드 호출
<a name="use-sdk-ios-swift-call-api"></a>

API 요청 및 응답의 입력(`Input`) 및 출력(`Result`)을 설명하는 두 가지 모델을 사용하여 이 [SimpleCalc API](simple-calc-lambda-api.md)에 대한 `SIMPLE_CALC` 접두사를 사용하여 SDK를 생성한 경우 SDK에서 결과 API 클라이언트 클래스는 `SIMPLE_CALCSimpleCalcClient`가 되고 해당 데이터 클래스는 각각 `SIMPLE_CALCInput` 및 `SIMPLE_CALCResult`입니다. API 요청 및 응답은 SDK 메서드에 다음과 같이 매핑됩니다.
+ 다음의 API 요청이

  ```
  GET /?a=...&b=...&op=...
  ```

  다음의 SDK 메서드가 됩니다.

  ```
  public func rootGet(op: String?, a: String?, b: String?) -> AWSTask
  ```

  `AWSTask.result` 모델이 메서드 응답에 추가된 경우 `SIMPLE_CALCResult` 속성은 `Result` 유형입니다. 그렇지 않으면 `NSDictionary` 유형입니다.
+ 다음의 이 API 요청이

  ```
  POST /
      
  {
     "a": "Number",
     "b": "Number",
     "op": "String"
  }
  ```

  다음의 SDK 메서드가 됩니다.

  ```
  public func rootPost(body: SIMPLE_CALCInput) -> AWSTask
  ```
+ 다음의 API 요청이

  ```
  GET /{a}/{b}/{op}
  ```

  다음의 SDK 메서드가 됩니다.

  ```
  public func aBOpGet(a: String, b: String, op: String) -> AWSTask
  ```

다음 절차에서는 Swift 앱 소스 코드에서 API 메서드를 호출하는 방법(예: `viewDidLoad()` 파일에서 `ViewController.m` 위임자의 일부로 호출)을 설명합니다.

**API Gateway가 생성한 iOS SDK를 통해 API를 호출하려면**

1. API 클라이언트 클래스 인스턴스화:

   ```
   let client = SIMPLE_CALCSimpleCalcClient.default()
   ```

   API를 통해 Amazon Cognito를 사용하려면 (다음과 같이) 기본 AWS 서비스 구성을 설정한 후, (이전과 같이) `default` 메서드를 가져옵니다.

   ```
   let credentialsProvider = AWSCognitoCredentialsProvider(regionType: AWSRegionType.USEast1, identityPoolId: "my_pool_id")        
   let configuration = AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: credentialsProvider)        
   AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration
   ```

1. `GET /?a=1&b=2&op=+` 메서드를 호출하여 `1+2`를 수행합니다.

   ```
   client.rootGet("+", a: "1", b:"2").continueWithBlock {(task: AWSTask) -> AnyObject? in
       self.showResult(task)
       return nil
   }
   ```

   헬퍼 함수 `self.showResult(task)`가 콘솔에 결과나 오류를 인쇄합니다. 예: 

   ```
   func showResult(task: AWSTask) {
       if let error = task.error {
           print("Error: \(error)")
       } else if let result = task.result {
           if result is SIMPLE_CALCResult {
               let res = result as! SIMPLE_CALCResult
               print(String(format:"%@ %@ %@ = %@", res.input!.a!, res.input!.op!, res.input!.b!, res.output!.c!))
           } else if result is NSDictionary {
               let res = result as! NSDictionary
               print("NSDictionary: \(res)")
           }
       }
   }
   ```

   생산 앱에서 텍스트 필드에 결과나 오류를 표시할 수 있습니다. 표시되는 결과는 `1 + 2 = 3`입니다.

1. 페이로드와 함께 `POST /` 메서드를 호출하여 `1-2`를 수행합니다.

   ```
   let body = SIMPLE_CALCInput()
   body.a=1
   body.b=2
   body.op="-"
   client.rootPost(body).continueWithBlock {(task: AWSTask) -> AnyObject? in
       self.showResult(task)
       return nil
   }
   ```

   표시되는 결과는 `1 - 2 = -1`입니다.

1. `GET /{a}/{b}/{op}`를 호출하여 `1/2`를 수행합니다.

   ```
   client.aBOpGet("1", b:"2", op:"div").continueWithBlock {(task: AWSTask) -> AnyObject? in
       self.showResult(task)
       return nil
   }
   ```

   표시되는 결과는 `1 div 2 = 0.5`입니다. 여기서 `div` 자리에 `/`가 사용되는데, 이유는 백엔드의 [간단한 Lambda 함수](simple-calc-nodejs-lambda-function.md)가 URL로 인코딩된 경로 변수를 처리하지 않기 때문입니다.