

# 연결된 사용자 및 클라이언트 앱 관리: `$connect` 및 `$disconnect` 라우팅
<a name="apigateway-websocket-api-route-keys-connect-disconnect"></a>

다음 섹션에서는 WebSocket API에 `$connect` 및 `$disconnect` 라우팅을 사용하는 방법을 설명합니다.

**Topics**
+ [`$connect` 라우팅](#apigateway-websocket-api-routes-about-connect)
+ [`$connect` 라우팅에서 연결 정보 전달](#apigateway-websocket-api-passing-connectionId-on-connect)
+ [`$disconnect` 라우팅](#apigateway-websocket-api-routes-about-disconnect)

## `$connect` 라우팅
<a name="apigateway-websocket-api-routes-about-connect"></a>

클라이언트 앱은 WebSocket 업그레이드 요청을 전송하여 WebSocket API에 연결합니다. 요청이 성공하면 연결이 설정되는 동안 `$connect` 라우팅이 실행됩니다.

WebSocket 연결은 상태 저장 연결이므로 `$connect` 라우팅에서만 권한 부여를 구성할 수 있습니다. `AuthN`/`AuthZ`은 연결 시점에만 수행됩니다.

`$connect` 라우팅과 연결된 통합 실행이 완료될 때까지 업그레이드 요청은 대기 중이고 실제 연결이 설정되지 않습니다. `$connect` 요청이 실패하면(예: `AuthN`/`AuthZ` 실패 또는 통합 실패로 인해) 연결이 이루어지지 않습니다.

**참고**  
`$connect`에서 권한 부여에 실패하면 연결이 설정되지 않고 클라이언트는 `401` 또는 `403` 응답을 받게 됩니다.

`$connect`에 대한 통합 설정은 선택 사항입니다. 다음의 경우 `$connect` 통합 설정을 고려해야 합니다.
+ 클라이언트가 `Sec-WebSocket-Protocol` 필드를 사용하여 서브프로토콜을 지정할 수 있도록 하고 싶습니다. 예제 코드는 [WebSocket 하위 프로토콜이 필요한 `$connect` 라우팅 설정](websocket-connect-route-subprotocol.md) 단원을 참조하세요.
+ 클라이언트가 연결될 때 알림을 받고 싶습니다.
+ 연결을 조절하거나 연결하는 사람을 통제하고 싶습니다.
+ 백엔드가 콜백 URL을 사용하여 클라이언트로 메시지를 다시 보내도록 하고 싶습니다.
+ 각 연결 ID 및 기타 정보를 데이터베이스(예: Amazon DynamoDB)에 저장하고 싶습니다.

## `$connect` 라우팅에서 연결 정보 전달
<a name="apigateway-websocket-api-passing-connectionId-on-connect"></a>

 프록시 및 비프록시 통합을 모두 사용하여 `$connect` 경로에서 데이터베이스 또는 기타 AWS 서비스 서비스로 정보를 전달할 수 있습니다.

### 프록시 통합을 사용하여 연결 정보 전달
<a name="websocket-connect-proxy-integration"></a>

이벤트의 Lambda 프록시 통합에서 연결 정보에 액세스할 수 있습니다. 다른 AWS 서비스 또는 AWS Lambda 함수를 사용하여 연결에 게시합니다.

다음 Lambda 함수는 `requestContext` 객체를 사용하여 연결 ID, 도메인 이름, 단계 이름 및 쿼리 문자열을 기록하는 방법을 보여줍니다.

------
#### [ Node.js ]

```
 export const handler = async(event, context) => {
    const connectId = event["requestContext"]["connectionId"]
    const domainName = event["requestContext"]["domainName"]
    const stageName = event["requestContext"]["stage"]
    const qs = event['queryStringParameters']
    console.log('Connection ID: ', connectId, 'Domain Name: ', domainName, 'Stage Name: ', stageName, 'Query Strings: ', qs )
    return {"statusCode" : 200}
};
```

------
#### [ Python ]

```
import json
import logging
logger = logging.getLogger()
logger.setLevel("INFO")


def lambda_handler(event, context):
    connectId = event["requestContext"]["connectionId"]
    domainName = event["requestContext"]["domainName"]
    stageName = event["requestContext"]["stage"]
    qs = event['queryStringParameters']
    connectionInfo = {
        'Connection ID': connectId,
        'Domain Name': domainName,
        'Stage Name': stageName,
        'Query Strings': qs}
    logging.info(connectionInfo)
    return {"statusCode": 200}
```

------

### 비프록시 통합을 사용하여 연결 정보 전달
<a name="websocket-connect-non-proxy-integration"></a>
+ 비프록시 통합으로 연결 정보에 액세스할 수 있습니다. 통합 요청을 설정하고 WebSocket API 요청 템플릿을 제공합니다. 다음 [Velocity Template Language(VTL)](https://velocity.apache.org/engine/devel/vtl-reference.html) 매핑 템플릿은 통합 요청을 제공합니다. 이 요청은 다음 세부 정보를 비프록시 통합에 전송합니다.
  + 연결 ID
  + 도메인 이름
  + 단계 이름
  + 경로
  + 헤더
  + 쿼리 문자열

  이 요청은 연결 ID, 도메인 이름, 단계 이름, 경로, 헤더 및 쿼리 문자열을 비프록시 통합으로 보냅니다.

  ```
  {
      "connectionId": "$context.connectionId",
      "domain": "$context.domainName",
      "stage": "$context.stage",
      "params": "$input.params()"
  }
  ```

  데이터 변환 설정에 대한 자세한 내용은 [API Gateway에서 WebSocket API의 데이터 변환](websocket-api-data-transformations.md) 섹션을 참조하세요.

  통합 요청을 완료하려면 통합 응답에 `StatusCode: 200`을 설정합니다. 통합 응답 설정에 대한 자세한 내용은 [API Gateway 콘솔을 사용하여 통합 응답 설정](apigateway-websocket-api-integration-responses.md#apigateway-websocket-api-integration-response-using-console) 섹션을 참조하세요.

## `$disconnect` 라우팅
<a name="apigateway-websocket-api-routes-about-disconnect"></a>

연결이 종료된 후 `$disconnect` 라우팅이 실행됩니다.

서버 또는 클라이언트에 의해 연결이 종료될 수 있습니다. 실행될 때 연결이 이미 종결되었기 때문에, `$disconnect`가 최선의 이벤트입니다. API Gateway는 통합에 `$disconnect` 이벤트를 전달하기 위해 최선을 다하지만 전달을 보장할 수는 없습니다.

백엔드는 `@connections` API를 사용하여 연결 해제를 시작할 수 있습니다. 자세한 내용은 [백엔드 서비스에서 `@connections` 명령 사용](apigateway-how-to-call-websocket-api-connections.md) 섹션을 참조하세요.