

 [AWS SDK for JavaScript V3 API 참조 안내서](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/)는 AWS SDK for JavaScript 버전 3(V3)의 모든 API 작업을 자세히 설명합니다.

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 비동기식 서비스 직접 호출
<a name="calling-services-asynchronously"></a>

SDK를 통해 수행한 모든 요청은 비동기식입니다. 브라우저 스크립트를 작성할 때 이 점을 항상 주의해야 합니다. 웹 브라우저에서 실행 중인 JavaScript에는 일반적으로 실행 스레드가 하나 뿐입니다. AWS 서비스에 대한 비동기식 호출을 수행한 후 브라우저 스크립트는 계속 실행되며 프로세스에서 반환되기 전에 해당 비동기식 결과에 의존하는 코드를 실행하려고 시도할 수 있습니다.

 AWS 서비스에 대한 비동기식 호출에는 해당 호출을 관리하여 데이터를 사용할 수 있기 전에 코드가 데이터를 사용하려고 하지 않도록 하는 것이 포함됩니다. 이 섹션의 주제에서는 비동기식 호출 관리의 필요성과 비동기식 호출 관리에 사용할 수 있는 다양한 기법에 대해 자세히 다룹니다.

이러한 기법 중 하나를 사용하여 비동기 직접 호출을 관리할 수 있지만, 모든 새 코드에 async/await를 사용하는 것이 좋습니다.

async/await  
이 기법은 V3의 기본 동작이므로 사용하는 것이 좋습니다.

promise  
async/await를 지원하지 않는 브라우저에서 이 기법을 사용하세요.

callback  
매우 간단한 경우를 제외하고는 콜백을 사용하지 마세요. 하지만 마이그레이션 시나리오에는 유용할 수 있습니다.

**Topics**
+ [비동기 직접 호출 관리](making-asynchronous-calls.md)
+ [비동기/대기 사용](using-async-await.md)
+ [JavaScript Promise 사용](using-promises.md)
+ [익명 콜백 함수 사용](using-a-callback-function.md)

# 비동기 직접 호출 관리
<a name="making-asynchronous-calls"></a>

예를 들어, 전자 상거래 웹 사이트의 홈 페이지에서는 재방문 고객이 로그인할 수 있습니다. 로그인한 고객을 위한 혜택의 일부로 로그인 후 사이트에서는 고객의 특정 기본 설정에 맞춰 사이트를 맞춤화합니다. 사이트를 맞춤화하려면 다음을 수행해야 합니다.

1. 고객이 로그인하고 로그인 보안 인증으로 검증되어야 합니다.

1. 고객 데이터베이스에서 고객의 기본 설정이 요청됩니다.

1. 데이터베이스에서는 페이지 로드 전에 사이트를 맞춤화하는 데 사용되는 고객의 기본 설정을 제공합니다.

이러한 작업이 동기식으로 실행되면 다음 작업을 시작하기 전에 각 작업이 끝나야 합니다. 따라서 고객 기본 설정이 데이터베이스에서 반환될 때까지 웹 페이지 로딩을 완료할 수 없습니다. 그러나 데이터베이스 쿼리가 서버로 전송된 후 네트워크 병목 현상, 예외적으로 높은 데이터베이스 트래픽 또는 불안한 모바일 디바이스 연결 등으로 인해 고객 데이터 수신이 지연되거나 실패할 수 있습니다.

이러한 상황에서도 웹 사이트가 멈추지 않도록 하기 위해 데이터베이스를 비동기식으로 직접 호출합니다. 데이터베이스 호출을 실행한 후 비동기 요청을 보내면 코드가 계속해서 예상대로 실행됩니다. 비동기 호출의 응답을 적절하게 관리하지 못하면 데이터를 아직 사용할 수 없는데도 코드가 데이터베이스에서 다시 필요한 정보를 사용하려고 시도할 수 있습니다.

![\[동기식 실행과 비동기식 실행 간의 차이\]](http://docs.aws.amazon.com/ko_kr/sdk-for-javascript/v3/developer-guide/images/async-vs-sync.png)


# 비동기/대기 사용
<a name="using-async-await"></a>

promise보다는 비동기/대기 사용을 고려해야 합니다. 비동기 함수는 promise를 사용하는 것보다 간단하고 보일러플레이트가 더 적게 필요합니다. 대기는 비동기적으로 값을 기다리기 위해 비동기 함수에서만 사용할 수 있습니다.

다음 예에서는 async/await를 사용하여 ` us-west-2`의 모든 Amazon DynamoDB 테이블을 나열합니다.

**참고**  
이 예를 실행하려면 다음을 수행합니다.  
프로젝트의 명령줄`npm install @aws-sdk/client-dynamodb`에를 입력하여 AWS SDK for JavaScript DynamoDB 클라이언트를 설치합니다.
자격 AWS 증명을 올바르게 구성했는지 확인합니다. 자세한 내용은 [자격 증명 설정](setting-credentials.md) 단원을 참조하십시오.

```
import {
  DynamoDBClient,
  ListTablesCommand
} from "@aws-sdk/client-dynamodb";
(async function () {
  const dbClient = new DynamoDBClient({ region: "us-west-2" });
  const command = new ListTablesCommand({});

  try {
    const results = await dbClient.send(command);
    console.log(results.TableNames.join('\n'));
  } catch (err) {
    console.error(err)
  }
})();
```

**참고**  
 모든 브라우저가 async/await를 지원하는 것은 아닙니다. async/await를 지원하는 브라우저 목록은 [Async functions](https://caniuse.com/#feat=async-functions)를 참조하세요.

# JavaScript Promise 사용
<a name="using-promises"></a>

서비스 클라이언트의 AWS SDK for JavaScript v3 메서드(`ListTablesCommand`)를 사용하여 콜백을 사용하는 대신 서비스를 호출하고 비동기 흐름을 관리합니다. 다음 예는 `us-west-2`에서 Amazon DynamoDB 테이블의 이름을 가져오는 방법을 보여줍니다.

```
import {
  DynamoDBClient,
  ListTablesCommand
} from "@aws-sdk/client-dynamodb";
const dbClient = new DynamoDBClient({ region: 'us-west-2' });

dbClient.listtables(new ListTablesCommand({}))
  .then(response => {
    console.log(response.TableNames.join('\n'));
  })
  .catch((error) => {
    console.error(error);
  });
```

## 여러 Promise 조정
<a name="multiple-promises"></a>

경우에 따라 코드는 여러 비동기식 호출이 모두 성공적으로 반환된 경우에만 조치가 필요한 여러 비동기식 호출을 수행해야 합니다. promise를 사용하지 않고 개별 비동기 메서드 호출을 관리하는 경우 `all` 메서드를 사용하는 추가 promise를 생성할 수 있습니다.

이 메서드는 메서드에 전달한 promise 배열이 이행되는 경우 umbrella promise를 이행합니다. 콜백 함수는 `all` 메서드에 전달되는 promises의 값 배열로 전달됩니다.

다음 예제에서 AWS Lambda 함수는 Amazon DynamoDB에 대해 세 개의 비동기 호출을 수행해야 하지만 각 호출에 대한 promise가 이행된 후에만 완료될 수 있습니다.

```
const values = await Promise.all([firstPromise, secondPromise, thirdPromise]);

console.log("Value 0 is " + values[0].toString);
console.log("Value 1 is " + values[1].toString);
console.log("Value 2 is " + values[2].toString);

return values;
```

## promise에 대한 브라우저 및 Node.js 지원
<a name="browser-node-promise-support"></a>

기본 JavaScript promise(ECMAScript 2015)에 대한 지원은 모드가 실행되는 JavaScript 엔진 및 버전에 따라 달라집니다. 코드를 실행해야 하는 각 환경에서 JavaScript promise에 대한 지원을 확인하려면 GitHub의 [ECMAScript compatibility table](https://compat-table.github.io/compat-table/es6/)을 참조하세요.

# 익명 콜백 함수 사용
<a name="using-a-callback-function"></a>

각 서비스 객체 메서드는 익명 콜백 함수를 마지막 파라미터로 수락할 수 있습니다. 이 콜백 함수의 시그니처는 다음과 같습니다.

```
function(error, data) {
    // callback handling code
};
```

이 콜백 함수는 성공적인 응답 또는 오류 데이터 반환 시 실행됩니다. 메서드 호출에 성공하면 `data` 파라미터에서 응답 내용을 콜백 함수에 사용할 수 있습니다. 호출에 실패하면 `error` 파라미터에 자세한 실패 정보가 제공됩니다.

일반적으로 콜백 함수 내 코드는 오류가 있는지 테스트하는데, 오류가 반환되면 처리합니다. 오류가 반환되지 않으면 코드는 응답의 `data` 파라미터에서 데이터를 검색합니다. 콜백 함수의 기본 형식은 다음 예제와 같습니다.

```
function(error, data) {
    if (error) {
        // error handling code
        console.log(error);
    } else {
        // data handling code
        console.log(data);
    }
};
```

이전 예제에서는 오류 또는 반환되는 데이터에 대한 자세한 내용이 콘솔에 로깅됩니다. 다음은 서비스 객체에 대한 메서드 호출의 일부로 전달되는 콜백 함수를 보여주는 예제입니다.

```
ec2.describeInstances(function(error, data) {
  if (error) {
    console.log(error); // an error occurred
  } else {
    console.log(data); // request succeeded
  }
});
```