Node.js 애플리케이션에서 AWS DynamoDB 사용

주요 시사점

  • DynamoDB는 성능, 내구성 또는 안정성을 저하시키지 않고 대량의 다양한 데이터를 처리할 수 있는 AWS에서 제공하는 강력한 NoSQL 데이터베이스입니다.
  • Node.js에서 DynamoDB를 시작하려면 aws-sdk에서 client-dynamodb 패키지를 설치하고 자격 증명을 구성해야 합니다.
  • DynamoDB를 사용하면 클라이언트의 메서드와 매개 변수를 사용하여 쉽게 테이블을 생성하고, 데이터를 쓰고 읽고, 레코드를 업데이트하고, 레코드를 삭제할 수 있습니다. 효율적인 애플리케이션 개발을 위한 유연성과 확장성을 제공합니다.

최신 앱 개발의 상당 부분에는 강력한 프로그래밍 언어와 강력한 데이터베이스의 혼합이 필요합니다.

Amazon Web Services(AWS)가 제공하는 솔루션 중 하나는 데이터 관리를 혁신할 수 있는 도구인 DynamoDB입니다. 이를 사용하면 대량의 다양한 데이터를 처리하는 데이터베이스를 신속하게 프로비저닝할 수 있습니다.

DynamoDB란 무엇입니까?

AWS는 관계형 데이터베이스용 Amazon RDS, MongoDB와 같은 문서 데이터베이스용 DocumentDB 등 다양한 데이터베이스 요구 사항에 맞는 서비스를 제공합니다. DynamoDB는 키-값 형식으로 데이터를 저장하기 위한 NoSQL 데이터베이스입니다.

DynamoDB는 성능, 내구성 또는 안정성을 저하시키지 않고 분산 인프라 전체에서 대량의 데이터를 처리할 수 있습니다. 유연한 모델을 제공하므로 구조화된 데이터든 구조화되지 않은 데이터든 쉽게 저장하고 쿼리할 수 있습니다.

DynamoDB를 다양한 유형의 애플리케이션에 대한 데이터베이스로 사용할 수 있습니다. AWS 웹 콘솔에서 직접 액세스하고 AWS-CLI를 통해 프로그래밍 방식으로 액세스하거나 AWS-SDK를 사용하여 웹 애플리케이션에서 액세스할 수 있습니다.

Node.js에서 DynamoDB 시작하기

Node.js에는 백엔드 API를 구축하기 위한 많은 도구가 있으며 이러한 도구를 사용할 때 API에 대한 데이터베이스를 자유롭게 선택할 수 있습니다. Node.js는 AWS DynamoDB와 같은 데이터베이스를 포함한 외부 서비스에 대한 광범위한 지원을 제공합니다.

Node 앱에서 AWS 서비스에 액세스하려면 해당 서비스에 대한 클라이언트 aws-sdk 패키지만 있으면 됩니다. 예를 들어 DynamoDB에 액세스하려면 aws-sdk 아래에 client-dynamodb 패키지를 설치해야 합니다.

패키지를 설치하려면 프로젝트 디렉터리에서 다음 명령을 실행하세요.

 npm install @aws-sdk/client-dynamodb

Node.js 프로젝트에 aws-sdk/client-dynamodb를 설치한 후 DynamoDB 테이블과 상호 작용하기 전에 구성에 해당 영역을 추가해야 합니다. DynamoDB 클라이언트를 초기화할 때 이 작업을 수행하게 됩니다.

  iPhone에서 암호를 변경하는 방법

이전에 컴퓨터에 AWS-CLI를 설치하고 사용한 적이 있다면 아마도 환경에 이미 AWS 자격 증명이 설정되어 있을 것이며 SDK는 환경에서 자동으로 값을 가져옵니다.

하지만 그렇지 않은 경우 다음으로 향할 수 있습니다. AWS ID 액세스 관리(IAM) 콘솔에서 서비스를 제공하고 새 사용자를 생성하세요. 사용자를 생성한 후 개인 자격 증명인 액세스 키 ID와 비밀 키를 얻을 수 있습니다.

플랫폼에 대해 다음 터미널 명령을 실행하여 환경에 이러한 자격 증명을 추가합니다.

Unix, Linux 또는 macOS의 경우:

 export AWS_ACCESS_KEY_ID='your access key ID'
export AWS_SECRET_ACCESS_KEY='you secret access key'

Windows(CMD)의 경우:

 set AWS_ACCESS_KEY_ID='your access key ID'
set AWS_SECRET_ACCESS_KEY='you secret access key'

Windows(PowerShell)의 경우:

 $env:AWS_ACCESS_KEY_ID='your access key ID'
$env:AWS_SECRET_ACCESS_KEY='you secret access key'

그런 다음 Node.js 프로젝트로 돌아가서 새 파일을 생성하고 이름을 dynamodb.js로 지정합니다. 이 파일에서 다음 코드를 사용하여 새 AWS DynamoDB 클라이언트를 인스턴스화합니다.

 const { DynamoDB } = require('@aws-sdk/client-dynamodb')

const region = "us-east-1"

const client = new DynamoDB({ region })

매우 간단합니다! AWS는 코드에 보안 자격 증명이 노출되지 않도록 하기 때문에 위의 코드가 클라이언트 생성을 시도하는 동안 먼저 환경에서 액세스 키와 비밀 키를 읽습니다.

새로 생성된 클라이언트를 사용하면 테이블 생성, 데이터 읽기 및 쓰기와 같은 다양한 작업을 수행할 수 있습니다.

DynamoDB는 다른 NoSQL 데이터베이스와 마찬가지로 스키마가 없으므로 언제든지 테이블에 새 속성(필드)을 추가할 수 있습니다. 이것이 바로 DynamoDB 테이블을 생성할 때 기본 키 역할을 할 속성만 추가하면 되는 이유입니다.

DynamoDB에서 새 테이블(고객)을 생성하는 다음 코드를 확인하세요.

 const createCustomerTable = async () => {
    const params = {
        TableName: "Customer",
        AttributeDefinitions: [
            {
                AttributeName: "Email",
                AttributeType: "S"
            },
        ],
        KeySchema: [
            {
                AttributeName: "Email",
                KeyType: "HASH"
            }
        ],
        ProvisionedThroughput: {
            ReadCapacityUnits: 5,
            WriteCapacityUnits: 5
        }
    };

    client.createTable(params, (err, data) => {
        if (err) {
           console.log(err);
        } else {
            console.log(data);
        }
    });
}

createCustomerTable();

AttributeDefinitions 필드는 테이블의 주요 속성과 해당 유형을 정의하는 곳입니다. 여기에서 Email 속성의 유형은 S입니다. 이는 필드가 해당 값으로 문자열을 예상함을 의미합니다. 사용 가능한 세 가지 속성 유형은 S, N 및 B(문자열, 숫자 및 이진수)입니다.

  밝은 날씨는 Android용 또 다른 멋진 날씨 앱 및 위젯입니다.

항목을 빠르게 찾고 구성하는 데 도움이 되는 기본 키를 정의하려면 KeySchema가 필요합니다. DynamoDB는 테이블을 생성할 때 추가하는 속성을 주요 속성으로 예상하므로 여기서는 이메일이 기본 키입니다. KeySchema에 추가하고 KeyType(HASH)을 지정해야 합니다.

사용 가능한 다른 KeyType 값은 정렬 키에 사용되는 RANGE입니다. 정렬 키는 테이블에 동일한 HASH 키가 있는 데이터가 있고 날짜나 색상과 같은 일부 추가 데이터에 따라 그룹화하려는 경우에 유용합니다. 추가 데이터를 RANGE 키로 만들 수 있습니다.

위 코드에서 세 번째 중요한 매개변수는 ProvisionedThroughput입니다. 여기에서 DynamoDb가 초당 테이블에 허용할 읽기 및 쓰기 수를 정의합니다.

위의 코드를 실행하면 다음과 같은 출력이 표시됩니다.

웹 콘솔에서 DynamoDB 테이블 대시보드를 확인하면 테이블이 아직 프로비저닝 중이거나 이미 활성 상태인 것을 볼 수 있습니다.

ReadCapacityUnits 및 WriteCapacityUnits를 지정할 때 항상 애플리케이션 요구 사항을 고려하십시오. 부적절한 값은 성능 문제 또는 계정의 높은 청구 비용으로 이어질 수 있기 때문입니다.

테이블이 이미 활성화되어 있다고 확신하면 해당 테이블에 대해 CRUD 작업을 수행할 수 있습니다.

다음은 Customer 테이블에서 데이터를 쓰고 읽는 방법을 보여주는 몇 가지 코드 예제입니다.

  • 테이블에 데이터를 추가합니다. 테이블에 데이터를 쓰려면 클라이언트의 putItem 메서드가 필요합니다. 아래 코드는 DynamoDB의 Customer 테이블에 새 고객을 추가합니다.
     const createCustomer = async (customer) => {
        const params = {
            TableName: "Customer",
            Item: customer
        }

        client.putItem(params, (err, data) => {
            if (err) {
               console.error(err)
            } else {
                console.log(data)
            }
        })
    }

    const customerData = {
        Name: { "S": "Timilehin O." },
        Email: { "S": "[email protected]" },
        Age: { "N": "18"},
        Country: { "S": "Nigeria" }
    }

    createCustomer(customerData)

    params 객체에는 작성 중인 테이블인 TableName과 특정 유형으로 추가하는 데이터가 포함된 Item 필드가 포함되어 있습니다. 처음에는 테이블에 없었던 새 필드에 주목하세요. 이것이 DynamoDB가 유연하게 작동하는 방식입니다. 다음과 같이 콘솔에서 데이터베이스의 데이터를 볼 수 있습니다.

  • 테이블에서 데이터를 읽습니다. DynamoDB를 사용하면 다양한 방법으로 데이터를 읽을 수 있습니다. SDK의 스캔 기능은 전체 테이블을 읽는 반면, getItem은 특정 데이터만 읽습니다. 예를 들어 아래 코드는 모든 고객을 가져옵니다.
     const getAllCustomers = async () => {
        const params = {
            TableName: "Customer"
        }

        const customers = await client.scan(params)
        console.log(customers)
    }

    다음 코드는 이메일 값으로 사용자를 가져옵니다.

     const getCustomerByEmail = async (email) => {
        const params = {
            TableName: "Customer",
            Key: {
                Email: { "S": email }
            }
        }

        const customer = await client.getItem(params)
        console.log(customer)
    }

    getCustomerByEmail("[email protected]")

  • 테이블의 데이터를 업데이트합니다. 테이블의 기존 데이터를 업데이트하려면 SDK의 updateItem 함수를 사용하세요. 다음 코드는 특정 레코드를 업데이트하는 방법을 보여줍니다.
      const updateCustomerLocation = async (email, age) => {
         const params = {
             TableName: "Customer",
             Key: {
                 Email: { "S": email }
             },
             UpdateExpression: "SET Age = :newAge",
             ExpressionAttributeValues: {
                 ':newAge': { "N": age }
             },
             ReturnValues: "ALL_NEW"
         }

         const updatedCustomer = await client.updateItem(params)
         console.log(updatedCustomer.Attributes)
     }

    업데이트 데이터에서 업데이트 표현식을 작성하여 함수를 동적으로 만들 수도 있습니다. DynamoDB의 유연성 덕분에 필요에 따라 모든 작업을 처리할 수 있습니다.

      Apple Watch가 알림을 받지 못하는 문제를 해결하는 방법
  • 테이블에서 데이터를 삭제합니다. DynamoDB에서 레코드를 삭제하려면 deleteItem 함수와 특정 레코드의 키가 필요합니다. 구현 방법은 다음과 같습니다.
     const deleteCustomer = async (email) => {
        const params = {
            TableName: "Customer",
            Key: {
                Email: { "S": email }
            }
        }

        client.deleteItem(params, (err, data) => {
            if (err) {
               console.error(err)
            } else {
                console.log("Customer deleted successfully")
            }
        })
    }

    deleteCustomer("[email protected]")

  • DynamoDB를 사용하여 효율적인 애플리케이션 구축

    Amazon Web Services는 계속해서 성장하고 있습니다. 효율적이고 안전한 디지털 솔루션을 제공하는 데 사용할 수 있는 액세스 가능한 플랫폼을 제공합니다. 인프라나 보안에 대한 걱정 없이 실행할 데이터베이스를 찾고 있다면 DynamoDB가 완벽한 선택입니다.

    이제 Node.js에서 DynamoDB를 시작하는 데 필요한 모든 기능을 갖추고 있으므로 다음 Node.js 애플리케이션을 위해 자신 있게 DynamoDB를 선택할 수 있습니다.