JavaScript를 사용한 Amazon DynamoDB 프로그래밍 - Amazon DynamoDB

JavaScript를 사용한 Amazon DynamoDB 프로그래밍

이 안내서는 JavaScript를 통해 Amazon DynamoDB를 사용하려는 프로그래머에게 지침을 제공합니다. AWS SDK for JavaScript, 사용 가능한 추상화 계층, 연결 구성, 오류 처리, 재시도 정책 정의, 연결 유지 관리 등에 대해 알아봅니다.

AWS SDK for JavaScript 정보

AWS SDK for JavaScript에서는 브라우저 스크립트 또는 Node.js를 사용하여 AWS 서비스에 액세스할 수 있습니다. 이 문서에서는 최신 버전의 SDK(V3)에 중점을 둡니다. AWS SDK for JavaScript V3는 GitHub에서 호스팅되는 오픈 소스 프로젝트로 AWS에서 유지 관리합니다. 문제 및 기능 요청은 공개되며 GitHub 리포지토리의 문제 페이지에서 액세스할 수 있습니다.

JavaScript V2는 V3와 비슷하지만 구문 차이가 있습니다. V3는 더 모듈화되어 더 작은 종속성을 더 쉽게 제공할 수 있으며 최고 수준의 TypeScript를 지원합니다. SDK는 최신 버전을 사용하는 것이 좋습니다.

AWS SDK for JavaScript V3 사용

노드 패키지 관리자를 사용하여 Node.js 애플리케이션에 SDK를 추가할 수 있습니다. 아래 예는 DynamoDB 작업을 위한 가장 일반적인 SDK 패키지를 추가하는 방법을 보여줍니다.

  • npm install @aws-sdk/client-dynamodb

  • npm install @aws-sdk/lib-dynamodb

  • npm install @aws-sdk/util-dynamodb

패키지를 설치하면 package.json 프로젝트 파일의 종속성 섹션에 대한 참조가 추가됩니다. 최신 ECMAScript 모듈 구문을 사용할 수 있는 옵션이 있습니다. 이 두 가지 접근 방식에 대한 자세한 내용은 고려 사항 섹션을 참조하세요.

JavScript 설명서 액세스

다음 리소스로 JavaScript 설명서 사용을 시작하세요.

  • 핵심 JavaScript 설명서를 보려면 개발자 안내서를 참조하세요. 설치 지침은 설정 섹션에 있습니다.

  • API 참조 설명서에 액세스하여 사용 가능한 모든 클래스와 메서드를 살펴보세요.

  • SDK for JavaScript는 DynamoDB 외에도 많은 AWS 서비스를 지원합니다. DynamoDB에 대한 구체적인 API 적용 범위를 찾으려면 다음 절차를 따르세요.

    1. 서비스에서 DynamoDB 및 라이브러리를 선택합니다. 이는 하위 수준 클라이언트를 문서화합니다.

    2. lib-dynamodb를 선택합니다. 이는 상위 수준 클라이언트를 문서화합니다. 두 클라이언트는 사용자가 사용하기 위해 선택할 수 있는 두 가지 추상화 계층을 나타냅니다. 추상화 계층에 대한 자세한 내용은 아래 섹션을 참조하세요.

추상화 계층

SDK for JavaScript V3에는 하위 수준 클라이언트(DynamoDBClient)와 상위 수준 클라이언트(DynamoDBDocumentClient)가 있습니다.

하위 수준 클라이언트(DynamoDBClient)

하위 수준 클라이언트는 기본 유선 프로토콜에 대한 추가 추상화를 제공하지 않습니다. 통신의 모든 측면을 완벽하게 제어할 수 있지만 추상화가 없으므로 DynamoDB JSON 형식을 사용하여 항목 정의를 제공하는 등의 작업을 수행해야 합니다.

아래 예시에서 볼 수 있듯이 이 형식을 사용할 경우 데이터 유형을 명시적으로 지정해야 합니다. S는 문자열 값을 나타내고 N은 숫자 값을 나타냅니다. 회선의 숫자는 정밀도가 떨어지지 않도록 항상 숫자 유형 태그가 지정된 문자열로 전송됩니다. 하위 수준 API 직접 호출에는 PutItemCommandGetItemCommand와 같은 이름 지정 패턴이 있습니다.

다음은 DynamoDB JSON을 사용하여 Item을 정의한 하위 수준 클라이언트를 사용하는 예시입니다.

const { DynamoDBClient, PutItemCommand } = require("@aws-sdk/client-dynamodb"); const client = new DynamoDBClient({}); async function addProduct() { const params = { TableName: "products", Item: { "id": { S: "Product01" }, "description": { S: "Hiking Boots" }, "category": { S: "footwear" }, "sku": { S: "hiking-sku-01" }, "size": { N: "9" } } }; try { const data = await client.send(new PutItemCommand(params)); console.log('result : ' + JSON.stringify(data)); } catch (error) { console.error("Error:", error); } } addProduct();

상위 수준 클라이언트(DynamoDBDocumentClient)

상위 수준 DynamoDB 문서 클라이언트는 데이터를 수동으로 마샬링할 필요가 없고 표준 JavaScript 객체를 사용하여 직접 읽고 쓸 수 있는 등 편리한 기능을 제공합니다. lib-dynamodb 설명서에는 장점 목록이 나와 있습니다.

DynamoDBDocumentClient를 인스턴스화하려면 하위 수준 DynamoDBClient를 구성한 다음 DynamoDBDocumentClient로 래핑하세요. 함수 명명 규칙은 두 패키지가 약간 다릅니다. 예를 들어, 하위 수준에서는 PutItemCommand를, 상위 수준에서는 PutCommand를 사용합니다. 이름이 서로 다르기 때문에 두 함수가 같은 컨텍스트에서 공존할 수 있으므로 동일한 스크립트에서 두 함수를 혼용할 수 있습니다.

const { DynamoDBClient } = require("@aws-sdk/client-dynamodb"); const { DynamoDBDocumentClient, PutCommand } = require("@aws-sdk/lib-dynamodb"); const client = new DynamoDBClient({}); const docClient = DynamoDBDocumentClient.from(client); async function addProduct() { const params = { TableName: "products", Item: { id: "Product01", description: "Hiking Boots", category: "footwear", sku: "hiking-sku-01", size: 9, }, }; try { const data = await docClient.send(new PutCommand(params)); console.log('result : ' + JSON.stringify(data)); } catch (error) { console.error("Error:", error); } } addProduct();

GetItem, Query 또는 Scan 같은 API 작업을 사용하여 항목을 읽을 때 사용 패턴이 일관됩니다.

마셜 유틸리티 함수 사용

하위 수준 클라이언트를 사용하고 직접 데이터 유형을 마셜링하거나 언마셜링할 수 있습니다. 유틸리티 패키지인 util-dynamodb에는 JSON을 받아들이고 DynamoDB JSON을 생성하는 marshall() 유틸리티 함수와 그 반대의 작업을 수행하는 unmarshall() 함수가 있습니다. 다음 예시에서는 marshall() 직접 호출로 데이터 마셜링을 처리하는 하위 수준 클라이언트를 사용합니다.

const { DynamoDBClient, PutItemCommand } = require("@aws-sdk/client-dynamodb"); const { marshall } = require("@aws-sdk/util-dynamodb"); const client = new DynamoDBClient({}); async function addProduct() { const params = { TableName: "products", Item: marshall({ id: "Product01", description: "Hiking Boots", category: "footwear", sku: "hiking-sku-01", size: 9, }), }; try { const data = await client.send(new PutItemCommand(params)); } catch (error) { console.error("Error:", error); } } addProduct();

항목 읽기

DynamoDB에서 단일 항목을 읽으려면 GetItem API 작업을 사용합니다. PutItem 명령과 마찬가지로 하위 수준 클라이언트 또는 상위 수준 Document 클라이언트를 사용할 수 있습니다. 아래 예시는 상위 수준 Document 클라이언트를 사용하여 항목을 가져오는 방법을 보여줍니다.

const { DynamoDBClient } = require("@aws-sdk/client-dynamodb"); const { DynamoDBDocumentClient, GetCommand } = require("@aws-sdk/lib-dynamodb"); const client = new DynamoDBClient({}); const docClient = DynamoDBDocumentClient.from(client); async function getProduct() { const params = { TableName: "products", Key: { id: "Product01", }, }; try { const data = await docClient.send(new GetCommand(params)); console.log('result : ' + JSON.stringify(data)); } catch (error) { console.error("Error:", error); } } getProduct();

Query API 작업을 사용하여 여러 항목을 읽을 수 있습니다. 하위 수준 클라이언트 또는 Document 클라이언트를 사용할 수 있습니다. 아래 예에서는 상위 수준 Document 클라이언트를 사용합니다.

const { DynamoDBClient } = require("@aws-sdk/client-dynamodb"); const { DynamoDBDocumentClient, QueryCommand, } = require("@aws-sdk/lib-dynamodb"); const client = new DynamoDBClient({}); const docClient = DynamoDBDocumentClient.from(client); async function productSearch() { const params = { TableName: "products", IndexName: "GSI1", KeyConditionExpression: "#category = :category and begins_with(#sku, :sku)", ExpressionAttributeNames: { "#category": "category", "#sku": "sku", }, ExpressionAttributeValues: { ":category": "footwear", ":sku": "hiking", }, }; try { const data = await docClient.send(new QueryCommand(params)); console.log('result : ' + JSON.stringify(data)); } catch (error) { console.error("Error:", error); } } productSearch();

조건부 쓰기

DynamoDB 쓰기 작업은 쓰기가 진행되려면 true로 평가되어야 하는 논리적 조건식을 지정할 수 있습니다. 조건이 true로 평가되지 않으면 쓰기 작업에서 예외가 발생합니다. 조건 표현식은 항목이 이미 존재하는지 또는 항목의 속성이 특정 제약 조건과 일치하는지 확인할 수 있습니다.

ConditionExpression = "version = :ver AND size(VideoClip) < :maxsize"

조건식이 실패할 경우 ReturnValuesOnConditionCheckFailure를 사용하여 조건을 충족하지 못한 항목을 오류 응답에 포함하도록 요청하여 문제가 무엇인지 추론할 수 있습니다. 자세한 내용은 Handle conditional write errors in high concurrency scenarios with Amazon DynamoDB를 참조하세요.

try { const response = await client.send(new PutCommand({ TableName: "YourTableName", Item: item, ConditionExpression: "attribute_not_exists(pk)", ReturnValuesOnConditionCheckFailure: "ALL_OLD" })); } catch (e) { if (e.name === 'ConditionalCheckFailedException') { console.log('Item already exists:', e.Item); } else { throw e; } }

JavaScript SDK V3 사용의 다른 측면을 보여주는 추가 코드 예시는 JavaScript SDK V3 설명서DynamoDB-SDK-Examples GitHub 리포지토리에서 확인할 수 있습니다.

페이지 매김

Scan 또는 Query와 같은 읽기 요청은 데이터세트의 여러 항목을 반환할 가능성이 큽니다. Limit 파라미터와 함께 Scan 또는 Query를 수행하는 경우 시스템에서 해당 수의 항목을 읽은 후 부분적인 응답이 전송되므로 추가 항목을 가져오려면 페이지를 매겨야 합니다.

시스템은 요청당 최대 1메가바이트의 데이터만 읽습니다. Filter 표현식을 포함하는 경우 시스템은 여전히 디스크에서 최대 1메가바이트의 데이터를 읽지만 해당 메가바이트에서 필터와 일치하는 항목을 반환합니다. 필터 작업 시 한 페이지에 0개의 항목이 반환되어도 검색이 모두 끝나려면 페이지 매김을 더 해야 할 수도 있습니다.

데이터 검색을 계속하려면 응답에서 LastEvaluatedKey를 찾아 후속 요청에서 ExclusiveStartKey 파라미터로 사용해야 합니다. 이는 다음 예에서 볼 수 있듯이 북마크 역할을 합니다.

참고

샘플은 첫 번째 반복에서와 같이 null lastEvaluatedKeyExclusiveStartKey로 전달하는데 이 동작은 허용됩니다.

LastEvaluatedKey 사용 예시:

const { DynamoDBClient, ScanCommand } = require("@aws-sdk/client-dynamodb"); const client = new DynamoDBClient({}); async function paginatedScan() { let lastEvaluatedKey; let pageCount = 0; do { const params = { TableName: "products", ExclusiveStartKey: lastEvaluatedKey, }; const response = await client.send(new ScanCommand(params)); pageCount++; console.log(`Page ${pageCount}, Items:`, response.Items); lastEvaluatedKey = response.LastEvaluatedKey; } while (lastEvaluatedKey); } paginatedScan().catch((err) => { console.error(err); });

paginateScan 편의 메서드 사용

SDK는 이 작업을 사용자를 대신해서 수행하고 백그라운드에서 반복적인 요청을 수행하는 편의 메서드 paginateScanpaginateQuery를 제공합니다. 표준 Limit 파라미터를 사용하여 요청당 읽을 수 있는 최대 항목 수를 지정합니다.

const { DynamoDBClient, paginateScan } = require("@aws-sdk/client-dynamodb"); const client = new DynamoDBClient({}); async function paginatedScanUsingPaginator() { const params = { TableName: "products", Limit: 100 }; const paginator = paginateScan({client}, params); let pageCount = 0; for await (const page of paginator) { pageCount++; console.log(`Page ${pageCount}, Items:`, page.Items); } } paginatedScanUsingPaginator().catch((err) => { console.error(err); });
참고

테이블이 작지 않은 이상 전체 테이블 스캔을 정기적으로 수행하는 것은 권장되지 않는 액세스 패턴입니다.

구성 지정

DynamoDBClient를 설정할 때 구성 객체를 생성자에 전달하여 다양한 구성 재정의를 지정할 수 있습니다. 예를 들어, 직접 호출하는 컨텍스트나 사용할 엔드포인트 URL에 아직 알려지지 않은 경우 연결할 리전을 지정할 수 있습니다. 이는 DynamoDB 로컬 인스턴스를 개발 목적으로 대상으로 지정하려는 경우에 유용합니다.

const client = new DynamoDBClient({ region: "eu-west-1", endpoint: "http://localhost:8000", });

제한 시간을 위한 Config

DynamoDB는 클라이언트와 서버 간 통신을 위해 HTTPS를 사용합니다. NodeHttpHandler 객체를 제공하여 HTTP 계층의 일부 측면을 제어할 수 있습니다. 예를 들어, 키 제한 시간 값 connectionTimeoutrequestTimeout을 조정할 수 있습니다. connectionTimeout은 클라이언트가 연결을 포기하기 전까지 연결을 시도하는 동안 기다리는 최대 시간(밀리초)입니다.

requestTimeout은 요청이 전송된 후 클라이언트가 응답을 기다리는 시간(밀리초)입니다. 둘 다 기본값은 0입니다. 즉, 제한 시간이 비활성화되어 있고 응답이 도착하지 않을 경우 클라이언트가 대기하는 시간에는 제한이 없다는 뜻입니다. 네트워크 문제 발생 시 요청에 오류가 발생하여 새 요청을 시작할 수 있도록 제한 시간을 적절한 수준으로 설정해야 합니다. 예:

import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; import { NodeHttpHandler } from "@smithy/node-http-handler"; const requestHandler = new NodeHttpHandler({ connectionTimeout: 2000, requestTimeout: 2000, }); const client = new DynamoDBClient({ requestHandler });
참고

제공된 예시에서는 Smithy 가져오기를 사용합니다. Smithy는 오픈 소스이며 AWS가 유지 관리하며 서비스와 SDK를 정의하는 언어입니다.

제한 시간 값을 구성하는 것 외에도 최대 소켓 수를 설정하여 오리진당 동시 연결 수를 늘릴 수 있습니다. 개발자 안내서에는 maxSockets 파라미터 구성에 대한 세부 정보가 포함되어 있습니다.

연결 유지를 위한 Config

HTTPS를 사용하는 경우 첫 번째 요청은 보안 연결을 설정하기 위해 항상 주고받는 통신이 필요합니다. HTTP 연결 유지를 사용하면 후속 요청에서 이미 설정된 연결을 재사용할 수 있으므로 요청의 효율성을 높이고 지연 시간을 줄일 수 있습니다. JavaScript V3에서는 HTTP 연결 유지가 기본적으로 활성화되어 있습니다.

유휴 연결을 유지할 수 있는 기간에는 한도가 있습니다. 연결이 유휴 상태이지만 다음 요청에서 이미 설정된 연결을 사용하도록 하려면 주기적으로(예: 1분마다) 요청을 보내는 것을 고려하세요.

참고

참고로 SDK의 이전 V2에서는 연결 유지가 기본적으로 꺼져 있었습니다. 즉, 각 연결은 사용 후 즉시 닫혔습니다. V2를 사용하는 경우 이 설정을 재정의할 수 있습니다.

재시도를 위한 Config

SDK에서 오류 응답을 수신하고 SDK의 판단에 따라 오류를 재개할 수 있는 경우(예: 제한 예외 또는 임시 서비스 예외) SDK는 다시 재시도합니다. 요청이 성공하는 데 시간이 더 오래 걸렸다는 점을 제외하면 호출자 입장에서는 이러한 상황이 눈에 띄지 않게 발생합니다.

SDK for JavaScript V3는 기본적으로 총 3번의 요청을 한 후 포기하고 직접 호출하는 컨텍스트로 오류를 전달합니다. 이러한 재시도 횟수와 빈도를 조정할 수 있습니다.

DynamoDBClient 생성자는 시도 횟수를 제한하는 maxAttempts 설정을 허용합니다. 아래 예시는 값을 기본값인 3에서 총 5로 올립니다. 0 또는 1로 설정하면 자동 재시도를 원하지 않으며 catch 블록 내에서 재개 가능한 오류를 직접 처리하고 싶다는 뜻입니다.

const client = new DynamoDBClient({ maxAttempts: 5, });

사용자 지정 재시도 전략을 사용하여 재시도 타이밍을 제어할 수도 있습니다. 이렇게 하려면 util-retry 유틸리티 패키지를 가져와서 현재 재시도 횟수를 기반으로 재시도 간 대기 시간을 계산하는 사용자 지정 백오프 함수를 만드세요.

아래 예시에서는 첫 번째 시도가 실패할 경우 지연 시간이 15, 30, 90, 360밀리초인 상태에서 최대 5회 시도하도록 되어 있습니다. 사용자 지정 백오프 함수인 calculateRetryBackoff는 재시도 횟수(첫 번째 재시도는 1로 시작)를 수락하여 지연을 계산하고 해당 요청을 기다리는 데 걸리는 시간(밀리초)을 반환합니다.

const { ConfiguredRetryStrategy } = require("@aws-sdk/util-retry"); const calculateRetryBackoff = (attempt) => { const backoffTimes = [15, 30, 90, 360]; return backoffTimes[attempt - 1] || 0; }; const client = new DynamoDBClient({ retryStrategy: new ConfiguredRetryStrategy( 5, // max attempts. calculateRetryBackoff // backoff function. ), });

Waiters

DynamoDB 클라이언트에는 테이블을 생성, 수정 또는 삭제할 때 테이블 수정이 완료될 때까지 코드가 진행되기를 기다리는 데 사용할 수 있는 두 가지 유용한 웨이터 함수가 포함되어 있습니다. 예를 들어 테이블을 배포하고 waitUntilTableExists 함수를 호출하면 테이블이 활성 상태가 될 때까지 코드가 차단됩니다. 웨이터는 20초마다 describe-table을 사용하여 DynamoDB 서비스를 내부적으로 폴링합니다.

import {waitUntilTableExists, waitUntilTableNotExists} from "@aws-sdk/client-dynamodb"; … <create table details> const results = await waitUntilTableExists({client: client, maxWaitTime: 180}, {TableName: "products"}); if (results.state == 'SUCCESS') { return results.reason.Table } console.error(`${results.state} ${results.reason}`);

waitUntilTableExists 기능은 테이블 상태를 활성으로 표시하는 describe-table 명령을 수행할 수 있는 경우에만 제어권을 반환합니다. 이렇게 하면 waitUntilTableExists를 사용하여 테이블 생성뿐만 아니라 GSI 인덱스 추가와 같은 수정이 완료될 때까지 기다릴 수 있습니다. 이때 테이블이 활성 상태로 돌아가려면 적용하는 데 시간이 다소 걸릴 수 있습니다.

오류 처리

여기의 초기 예시에서는 모든 오류를 광범위하게 찾아냈습니다. 하지만 실제 상황에서는 다양한 오류 유형을 구분하고 보다 정확한 오류 처리를 구현하는 것이 중요합니다.

DynamoDB 오류 응답에는 오류 이름을 비롯한 메타데이터가 포함됩니다. 오류를 발견한 다음 오류 조건에 해당할 수 있는 문자열 이름을 비교하여 처리 방법을 결정할 수 있습니다. 서버 측 오류의 경우 @aws-sdk/client-dynamodb 패키지에서 내보낸 오류 유형과 함께 instanceof 연산자를 활용하여 오류 처리를 효율적으로 관리할 수 있습니다.

이러한 오류는 모든 재시도를 모두 완료한 후에만 발생한다는 점에 유의해야 합니다. 오류가 재시도되어 결국 성공적인 직접 호출이 발생하는 경우 코드의 관점에서 보면 오류가 나타나지 않고 지연 시간이 약간 길어질 뿐입니다. 재시도는 Amazon CloudWatch 차트에 제한 또는 오류 요청과 같은 실패한 요청으로 표시됩니다. 클라이언트가 최대 재시도 횟수에 도달하면 이를 포기하고 예외가 발생합니다. 이는 클라이언트가 재시도하지 않겠다고 말하는 방식입니다.

다음은 오류를 포착하고 반환된 오류 유형에 따라 조치를 취하는 스니펫입니다.

import { ResourceNotFoundException ProvisionedThroughputExceededException, DynamoDBServiceException, } from "@aws-sdk/client-dynamodb"; try { await client.send(someCommand); } catch (e) { if (e instanceof ResourceNotFoundException) { // Handle ResourceNotFoundException } else if (e instanceof ProvisionedThroughputExceededException) { // Handle ProvisionedThroughputExceededException } else if (e instanceof DynamoDBServiceException) { // Handle DynamoDBServiceException } else { // Other errors such as those from the SDK if (e.name === "TimeoutError") { // Handle SDK TimeoutError. } else { // Handle other errors. } } }

DynamoDB 개발자 안내서의 일반적인 오류 문자열은 DynamoDB 관련 오류 처리 섹션을 참조하세요. 특정 API 직접 호출에서 발생할 수 있는 정확한 오류는 해당 API 직접 호출에 대한 설명서(예: Query API 문서)에서 찾을 수 있습니다.

오류의 메타데이터에는 오류에 따라 추가 속성이 포함됩니다. TimeoutError의 경우 메타데이터에는 아래와 같이 시도한 횟수와 totalRetryDelay가 포함됩니다.

{ "name": "TimeoutError", "$metadata": { "attempts": 3, "totalRetryDelay": 199 } }

자체 재시도 정책을 관리하는 경우 제한과 오류를 구분하는 것이 좋습니다.

  • 제한( ProvisionedThroughputExceededException 또는 ThrottlingException으로 표시됨)은 정상 서비스에서 DynamoDB 테이블 또는 파티션의 읽기 또는 쓰기 용량을 초과했음을 알리는 것입니다. 밀리초가 지날 때마다 약간 더 많은 읽기 또는 쓰기 용량을 사용할 수 있게 되므로 빠르게(예: 50ms마다) 재시도하여 새로 확보된 용량에 액세스하려고 시도할 수 있습니다.

    제한을 사용하면 지수 백오프가 특별히 필요하지 않습니다. 제한은 DynamoDB가 반환하기에 가볍고 요청당 요금이 부과되지 않기 때문입니다. 지수 백오프는 이미 가장 오래 기다린 클라이언트 스레드에 더 긴 지연을 할당하여 통계적으로 p50과 p99를 밖으로 확장합니다.

  • 오류(특히 InternalServerError 또는 ServiceUnavailable로 표시됨)는 서비스에 일시적인 문제가 있음을 나타냅니다. 전체 테이블에 문제가 있을 수도 있고, 읽거나 쓰고 있는 파티션에만 문제가 있을 수도 있습니다. 오류가 발생하면 재시도 전에 더 오래(예: 250ms 또는 500ms) 중단하고 지터를 사용하여 재시도에 시차를 줄 수 있습니다.

로깅

로깅을 켜면 SDK가 수행하는 작업에 대한 자세한 내용을 확인할 수 있습니다. 아래 예시와 같이 DynamoDBClient에서 파라미터를 설정할 수 있습니다. 콘솔에 더 많은 로그 정보가 표시되며 여기에는 상태 코드 및 사용된 용량과 같은 메타데이터가 포함됩니다. 터미널 창에서 로컬로 코드를 실행하면 로그가 해당 창에 나타납니다. AWS Lambda에서 코드를 실행하고 Amazon CloudWatch 로그를 설정하면 콘솔 출력이 해당 로그에 기록됩니다.

const client = new DynamoDBClient({ logger: console });

또한 내부 SDK 활동에 연결하여 특정 이벤트가 발생할 때 사용자 지정 로깅을 수행할 수 있습니다. 아래 예시는 클라이언트의 middlewareStack을 사용하여 SDK에서 전송되는 각 요청을 가로채고 요청이 발생하는 대로 로깅합니다.

const client = new DynamoDBClient({}); client.middlewareStack.add( (next) => async (args) => { console.log("Sending request from AWS SDK", { request: args.request }); return next(args); }, { step: "build", name: "log-ddb-calls", } );

MiddlewareStack은 SDK 동작을 관찰하고 제어할 수 있는 강력한 후크를 제공합니다. 자세한 내용은 Introducing Middleware Stack in Modular AWS SDK for JavaScript 블로그를 참조하세요.

고려 사항

프로젝트에 AWS SDK for JavaScript를 구현할 때 다음과 같이 추가로 고려해야 할 요소가 있습니다.

모듈 시스템

SDK는 CommonJS와 ES(ECMAScript)라는 두 가지 모듈 시스템을 지원합니다. CommonJS는 require 함수를 사용하고 ES는 import 키워드를 사용합니다.

  1. Common JSconst { DynamoDBClient, PutItemCommand } = require("@aws-sdk/client-dynamodb");

  2. ES(ECMAScript)import { DynamoDBClient, PutItemCommand } from "@aws-sdk/client-dynamodb";

프로젝트 유형에 따라 사용할 모듈 시스템이 결정되며 package.json 파일의 유형 섹션에 명시되어 있습니다. 기본값은 CommonJS입니다. ES 프로젝트를 나타내려면 "type": "module"을 사용합니다. CommonJS 패키지 형식을 사용하는 기존 Node.JS 프로젝트가 있는 경우에도 함수 파일 이름을 .mjs 확장자로 지정하여 최신 SDK V3 Import 구문으로 함수를 추가할 수 있습니다. 이렇게 하면 코드 파일을 ES(ECMAScript)로 처리할 수 있습니다.

비동기식 운영

콜백을 사용하고 DynamoDB 작업의 결과를 처리하도록 약속하는 많은 코드 샘플을 보게 될 것입니다. 최신 JavaScript를 사용하면 이러한 복잡성이 더 이상 필요하지 않으며 개발자는 비동기식 작업에 더 간결하고 읽기 쉬운 async/await 구문을 활용할 수 있습니다.

웹 브라우저 런타임

React 또는 React Native로 빌드하는 웹 및 모바일 개발자는 프로젝트에서 SDK for JavaScript를 사용할 수 있습니다. SDK의 초기 V2에서는 웹 개발자가 https://sdk.amazonaws.com/js/에서 호스팅되는 SDK 이미지를 참조하여 전체 SDK를 브라우저에 로드해야 했습니다.

V3를 사용하면 SDK 설명서의 Getting started in a browser script 섹션에 설명된 대로 Webpack을 사용하여 필수 V3 클라이언트 모듈과 모든 필수 JavaScript 함수를 단일 JavaScript 파일로 번들링하고 이를 HTML 페이지의 <head>에 있는 스크립트 태그에 추가할 수 있습니다

DAX 데이터 영역 작업

SDK for JavaScript V3는 현재 Amazon DynamoDB Streams Accelerator(DAX) 데이터 영역 작업을 지원하지 않습니다. DAX 지원을 요청하는 경우 DAX 데이터 영역 작업을 지원하는 SDK for JavaScript V2를 사용해 보세요.