

# WebSocket API 간접 호출
<a name="apigateway-how-to-call-websocket-api"></a>

WebSocket API를 배포하고 나면 클라이언트 애플리케이션이 WebSocket API에 연결하여 메시지를 보낼 수 있으며, 백엔드는 연결된 클라이언트 애플리케이션에 메시지를 보낼 수 있습니다.
+ `wscat`를 사용하여 WebSocket API에 연결하고 메시지를 보내 클라이언트 동작을 시뮬레이션할 수 있습니다. [`wscat`를 사용하여 WebSocket API에 연결하고 메시지 보내기](apigateway-how-to-call-websocket-api-wscat.md)을(를) 참조하세요.
+ 백엔드 서비스의 @connections API를 사용하여 연결된 클라이언트에 콜백 메시지를 보내거나 연결 정보를 얻거나 클라이언트 연결을 끊을 수 있습니다. [백엔드 서비스에서 `@connections` 명령 사용](apigateway-how-to-call-websocket-api-connections.md)을(를) 참조하세요.
+ 클라이언트 애플리케이션은 자체 WebSocket 라이브러리를 사용하여 WebSocket API를 호출할 수 있습니다.

# `wscat`를 사용하여 WebSocket API에 연결하고 메시지 보내기
<a name="apigateway-how-to-call-websocket-api-wscat"></a>

`[wscat](https://www.npmjs.com/package/wscat)` 유틸리티는 API Gateway에서 만들고 배포한 WebSocket API를 테스트할 수 있는 편리한 도구입니다. 다음과 같이 `wscat`를 설치하여 사용할 수 있습니다.

1. [https://www.npmjs.com/package/wscat](https://www.npmjs.com/package/wscat)에서 `wscat`를 다운로드합니다.

1. 다음 명령을 실행하여 `wscat`을 설치합니다.

   ```
   npm install -g wscat
   ```

1. API에 연결하려면 다음 예와 같이 `wscat` 명령을 실행하십시오. 이 예제에서는 `Authorization` 설정이 `NONE`이라고 가정합니다.

   ```
   wscat -c wss://aabbccddee.execute-api.us-east-1.amazonaws.com/test/
   ```

   `aabbccddee`를 실제 API ID, 즉 API Gateway 콘솔에 표시되거나 AWS CLI [https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/create-api.html](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/create-api.html) 명령에서 반환하는 ID로 바꿔야 합니다.

   또한 API가 `us-east-1` 이외의 리전에 있는 경우, 올바른 리전으로 대체해야 합니다.

1. API를 테스트하려면 연결된 상태에서 다음과 같은 메시지를 입력하십시오.

   ```
   {"{jsonpath-expression}":"{route-key}"}
   ```

   여기에서 *\$1jsonpath-expression\$1*은 JSONPath 표현식이고 *\$1route-key\$1*는 API에 대한 라우팅 키입니다. 예:

   ```
   {"action":"action1"}
   {"message":"test response body"}
   ```

   JSONPath에 대한 자세한 내용은 [JSONPath](https://goessner.net/articles/JsonPath/) 또는 [Java용 JSONPath](https://github.com/json-path/JsonPath)를 참조하십시오.

1. API 연결을 해제하려면 `ctrl-C`를 입력합니다.

# 백엔드 서비스에서 `@connections` 명령 사용
<a name="apigateway-how-to-call-websocket-api-connections"></a>

백엔드 서비스는 다음 WebSocket 연결 HTTP 요청을 사용하여 연결된 클라이언트에 콜백 메시지를 보내거나 연결 정보를 얻거나 클라이언트 연결을 끊을 수 있습니다.

**중요**  
이러한 요청은 [IAM 권한 부여](apigateway-websocket-control-access-iam.md)를 사용하므로 [서명 버전 4(SigV4)](https://docs.aws.amazon.com/IAM/latest/UserGuide/create-signed-request.html)로 서명해야 합니다. 이를 수행하기 위해 API Gateway 관리 API를 사용할 수 있습니다. 자세한 내용은 [ApiGatewayManagementApi](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/apigatewaymanagementapi.html)를 참조하십시오.

다음 명령에서 `{api-id}`를 실제 API ID, 즉 API Gateway 콘솔에 표시되거나 AWS CLI [create-api](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/create-api.html) 명령에서 반환하는 ID로 바꿔야 합니다. 이 명령을 사용하기 전에 연결을 설정해야 합니다.

클라이언트에게 콜백 메시지를 전송하려면 다음을 사용합니다.

```
POST https://{api-id}.execute-api.us-east-1.amazonaws.com/{stage}/@connections/{connection_id}
```

`[Postman](https://www.postman.com/)`을 사용하거나 다음 예와 같이 `[awscurl](https://github.com/okigan/awscurl)`를 호출하여 이 요청을 테스트할 수 있습니다.

```
awscurl --service execute-api -X POST -d "hello world" https://{prefix}.execute-api.us-east-1.amazonaws.com/{stage}/@connections/{connection_id}
```

다음 예제와 같이 명령을 URL 인코딩해야 합니다.

```
awscurl --service execute-api -X POST -d "hello world" https://aabbccddee.execute-api.us-east-1.amazonaws.com/prod/%40connections/R0oXAdfD0kwCH6w%3D
```

클라이언트의 가장 최신 연결 상태를 얻으려면 다음을 사용합니다.

```
GET https://{api-id}.execute-api.us-east-1.amazonaws.com/{stage}/@connections/{connection_id}
```

클라이언트의 연결을 해제하려면 다음을 사용합니다.

```
DELETE https://{api-id}.execute-api.us-east-1.amazonaws.com/{stage}/@connections/{connection_id}
```

통합에 `$context` 변수를 사용하여 동적으로 콜백 URL을 구성할 수 있습니다. 예를 들어 Lambda 프록시 통합과 `Node.js` Lambda 함수를 사용하는 경우 다음과 같이 URL을 구성하고 연결된 클라이언트에 메시지를 보낼 수 있습니다.

```
import {
  ApiGatewayManagementApiClient,
  PostToConnectionCommand,
} from "@aws-sdk/client-apigatewaymanagementapi";

export const handler = async (event) => {
  const domain = event.requestContext.domainName;
  const stage = event.requestContext.stage;
  const connectionId = event.requestContext.connectionId;
  const callbackUrl = `https://${domain}/${stage}`;
  const client = new ApiGatewayManagementApiClient({ endpoint: callbackUrl });

  const requestParams = {
    ConnectionId: connectionId,
    Data: "Hello!",
  };

  const command = new PostToConnectionCommand(requestParams);

  try {
    await client.send(command);
  } catch (error) {
    console.log(error);
  }

  return {
    statusCode: 200,
  };
};
```

WebSocket API에 사용자 지정 도메인 이름을 사용하는 경우 함수 코드에서 `stage` 변수를 제거합니다.

콜백 메시지를 보낼 때는 Lambda 함수에 API Gateway Management API를 직접 호출할 권한이 있어야 합니다. 연결이 설정되기 전 또는 클라이언트 연결이 끊긴 후에 메시지를 게시하면 `GoneException`을 포함하는 오류가 발생할 수 있습니다.