@aws-sdk/lib-dynamodb 와 @aws-sdk/client-dynamodb의 차이[AWS]

SnowCat·2023년 9월 5일
0
  • 블로그 개발을 하면서 aws-sdk를 참고하기 위해 공식 가이드를 자주 참고했다.
  • 공식 가이드에서는 client 객체는 @aws-sdk/client-dynamodb에서 가져와 생성하고, document를 읽는 client를 다시 @aws-sdk/lib-dynamodb에서 가져와 감싸는 식으로 클라이언트 객체를 생성했다.
  • 그런데 DynamoDB 작업을 위한 커맨드들은 @aws-sdk/lib-dynamodb, @aws-sdk/client-dynamodb 양쪽에 모두 정의되어있어 어느쪽을 이용해도 사용이 가능할 것처럼 보였다.
  • 그렇다면 둘의 차이는 무엇일까?

@aws-sdk/lib-dynamodb

  • aws sdk에서 대부분은 aws-sdk/client-(서비스 이름) 식으로 이름이 작명되어 있지만, storage, dynamodb의 경우 client 대신 lib을 가진 패키지가 추가로 존재한다.

  • @aws-sdk/client-dynamodb의 경우 공식 API 문서에서 다음과 같이 패키지를 소개하고 있다.
    The document client simplifies working with items in Amazon DynamoDB by abstracting away the notion of attribute values. This abstraction annotates native JavaScript types supplied as input parameters, as well as converts annotated response data to native JavaScript types.

  • input과 output이 자바스크립트 타입으로 변환되어 lib 모듈에 비해 간단히 사용을 할 수 있다는 이야기를 하고 있다.

  • 둘의 동작 차이를 확인하기 위해 QueryCommand를 통해 자세히 확인해보자.

/*
 * DB 데이터로 반환되는 Item은 다음과 같다 가정
 * {
 *   OriginCountry: Ethiopia,
 *	 roastDate: 2023-05-02,
 *   CoffeeBeanID: 123
 * }
 * @aws-sdk/lib-dynamodb를 사용한 경우
 */
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import { QueryCommand, DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb";

const client = new DynamoDBClient({});
const docClient = DynamoDBDocumentClient.from(client);

export const main = async () => {
  const command = new QueryCommand({
    TableName: "CoffeeCrop",
    KeyConditionExpression:
      "OriginCountry = :originCountry AND RoastDate > :roastDate",
    ExpressionAttributeValues: {
      ":originCountry": "Ethiopia",
      ":roastDate": "2023-05-01",
    },
    ConsistentRead: true,
  });

  const {Items} = await docClient.send(command);
  /*
  	[{
     OriginCountry: Ethiopia,
  	 roastDate: 2023-05-02,
     CoffeeBeanID: 123
   }]
  */
  console.log(Items)
  return response;
};

/*
 * @aws-sdk/client-dynamodb를 사용한 경우
 */
const client = new DynamoDBClient({});

export const main = async () => {
  const command = new QueryCommand({
    TableName: "CoffeeCrop",
    KeyConditionExpression:
      "OriginCountry = :originCountry AND RoastDate > :roastDate",
    ExpressionAttributeValues: {
      ":originCountry": {
        S: "Ethiopia"
      },
      ":roastDate": {
        S: "2023-05-01"
      },
    },
    ConsistentRead: true,
  });

  const {Items} = await client.send(command);
  /*
  	[{
     OriginCountry: {
       "S": Ethiopia
     },
  	 roastDate: {
       "S": 2023-05-02
     },
     CoffeeBeanID: {
       "N": 123
     }
   }]
  */
  console.log(Items)
  return response;
};
  • 동작에 있어서는 차이가 없다. 하지만 client-dynamodb에서는 Key-Value 형식으로 타입 정보와 값을 제공해야 했지만, lib-dynamodb에서는 값만을 제공하면 됨을 알 수 있다.
  • 즉, 불필요한 타입 제공을 생략하고 이 과정을 추상화해 client 사용을 편하게 도와주는 라이브러리라 할 수 있다.

@aws-sdk/lib-storage

  • dynamodb와 비슷하게 blob, buffer 등의 업로드를 편리하게 하기 위해 @aws-sdk/lib-storage가 존재한다.
  • 공식문서에 따르면 내부적으로는 멀티파트 업로드로 구현되어 있으며, 가능한 경우 여러 이미지를 동시에 올릴 수도 있다고 한다.
import { Upload } from "@aws-sdk/lib-storage";
import { S3Client, S3 } from "@aws-sdk/client-s3";

try {
  const parallelUploads3 = new Upload({
    client: new S3({}) || new S3Client({}),
    params: { Bucket, Key, Body },

    tags: [
      /*...*/
    ], // optional tags
    queueSize: 4, // optional concurrency configuration
    partSize: 1024 * 1024 * 5, // optional size of each part, in bytes, at least 5MB
    leavePartsOnError: false, // optional manually handle dropped parts
  });

  parallelUploads3.on("httpUploadProgress", (progress) => {
    console.log(progress);
  });

  await parallelUploads3.done();
} catch (e) {
  console.log(e);
}

Reference:
https://docs.aws.amazon.com/ko_kr/sdk-for-javascript/v3/developer-guide/dynamodb-example-dynamodb-utilities.html#dynamodb-example-document-client-query
https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-lib-dynamodb/
https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-lib-storage/

profile
냐아아아아아아아아앙

0개의 댓글