

# Node.js 및 DAX
<a name="DAX.client.run-application-nodejs-3"></a>

Node.js v3.x용 DAX SDK는 [Node.js v3.x용 AWS SDK](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/introduction/)와 호환됩니다. Node.js v3.x용 DAX SDK는 [집계된](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/introduction/#high-level-concepts) 클라이언트 사용을 지원합니다. DAX는 기본 클라이언트 만들기를 지원하지 않습니다. 지원되지 않는 기능에 대한 자세한 내용은 [AWS SDK V3와 동등하지 않은 기능](#DAX.client.run-application-nodejs-3-not-in-parity) 섹션을 참조하세요.

다음 단계에 따라 Amazon EC2 인스턴스에서 Node.js 샘플 애플리케이션을 실행합니다.

**DAX에 대한 Node.js 샘플을 실행하려면**

1. 다음과 같이 Amazon EC2 인스턴스에서 Node.js를 설치합니다.

   1. 노드 버전 관리자(`nvm`)를 설치합니다.

      ```
      curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
      ```

   1. nvm을 사용하여 Node.js를 설치합니다.

      ```
      nvm install 18
      ```

   1. nvm을 사용하여 노드 18 사용

      ```
      nvm use 18
      ```

   1. Node.js가 설치되었고 올바르게 실행되는지 테스트합니다.

      ```
      node -e "console.log('Running Node.js ' + process.version)"
      ```

      다음 메시지가 표시되어야 합니다.

      `Running Node.js v18.x.x`

1. 노드 패키지 관리자(`npm`)를 사용하여 DaxDocument Node.js 클라이언트를 설치합니다.

   ```
   npm install @amazon-dax-sdk/lib-dax
   ```

## TryDax 샘플 코드
<a name="DAX.client.run-application-nodejs-3-TryDax-sample-code"></a>

DynamoDB Accelerator(DAX)의 성능 이점을 평가하려면 다음 단계에 따라 표준 DynamoDB와 DAX 클러스터 간의 읽기 작업 시간을 비교하는 샘플 테스트를 실행합니다.

1. 작업 영역을 설정하고 `lib-dax`를 종속 항목으로 설치한 후 [TryDax.js](DAX.client.tutorial-TryDax.md)를 프로젝트에 복사합니다.

1. DAX 클러스터에 대해 프로그램을 실행합니다. DAX 클러스터의 엔드포인트를 정의하려면 다음 중 하나를 선택합니다.
   +  **Using the DynamoDB console(DynamoDB 콘솔 사용)** - DAX 클러스터를 선택합니다. 다음 예제와 같이 클러스터 엔드포인트가 콘솔에 표시됩니다.

     ```
     dax://my-cluster.l6fzcv.dax-clusters.us-east-1.amazonaws.com
     ```
   + **AWS CLI 사용** - 다음 명령을 입력합니다.

     ```
     aws dax describe-clusters --query "Clusters[*].ClusterDiscoveryEndpoint"
     ```

     다음 예제와 같이 클러스터 엔드포인트가 출력에 표시됩니다.

     ```
     {
         "Address": "my-cluster.l6fzcv.dax-clusters.us-east-1.amazonaws.com",
         "Port": 8111,
         "URL": "dax://my-cluster.l6fzcv.dax-clusters.us-east-1.amazonaws.com"
     }
     ```

1. 클러스터 엔드포인트를 명령줄 파라미터로 지정하여 프로그램을 실행합니다.

   ```
   node TryDax.js dax://my-cluster.l6fzcv.dax-clusters.us-east-1.amazonaws.com
   ```

   다음과 유사한 출력 화면이 표시되어야 합니다.

   ```
   Attempting to create table; please wait...
   Successfully created table. Table status: ACTIVE
   Writing data to the table...
   Writing 20 items for partition key:  1
   Writing 20 items for partition key:  2
   Writing 20 items for partition key:  3
   ...
   Running GetItem Test
           Total time: 153555.10 µs - Avg time: 383.89 µs
           Total time: 44679.96 µs - Avg time: 111.70 µs
           Total time: 36885.86 µs - Avg time: 92.21 µs
           Total time: 32467.25 µs - Avg time: 81.17 µs
           Total time: 32202.60 µs - Avg time: 80.51 µs
   Running Query Test
           Total time: 14869.25 µs - Avg time: 2973.85 µs
           Total time: 3036.31 µs - Avg time: 607.26 µs
           Total time: 2468.92 µs - Avg time: 493.78 µs
           Total time: 2062.53 µs - Avg time: 412.51 µs
           Total time: 2178.22 µs - Avg time: 435.64 µs
   Running Scan Test
           Total time: 2395.88 µs - Avg time: 479.18 µs
           Total time: 2207.16 µs - Avg time: 441.43 µs
           Total time: 2443.14 µs - Avg time: 488.63 µs
           Total time: 2038.24 µs - Avg time: 407.65 µs
           Total time: 1972.17 µs - Avg time: 394.43 µs
   Running Pagination Test
   Scan Pagination
   [
     { pk: 1, sk: 1, someData: 'XXXXXXXXXX' },
     { pk: 1, sk: 2, someData: 'XXXXXXXXXX' },
     { pk: 1, sk: 3, someData: 'XXXXXXXXXX' }
   ]
   [
     { pk: 1, sk: 4, someData: 'XXXXXXXXXX' },
     { pk: 1, sk: 5, someData: 'XXXXXXXXXX' },
     { pk: 1, sk: 6, someData: 'XXXXXXXXXX' }
   ]
   ...
   Query Pagination
   [
     { pk: 1, sk: 1, someData: 'XXXXXXXXXX' },
     { pk: 1, sk: 2, someData: 'XXXXXXXXXX' },
     { pk: 1, sk: 3, someData: 'XXXXXXXXXX' }
   ]
   [
     { pk: 1, sk: 4, someData: 'XXXXXXXXXX' },
     { pk: 1, sk: 5, someData: 'XXXXXXXXXX' },
     { pk: 1, sk: 6, someData: 'XXXXXXXXXX' }
   ]
   ...
   Attempting to delete table; please wait...
   Successfully deleted table.
   ```

   타이밍 정보를 기록해 둡니다. `GetItem`, `Query`, `Scan` 테스트에 필요한 마이크로초의 수입니다.

1. 이 경우 DAX 클러스터에 대해 프로그램을 실행했습니다. 이제 프로그램을 다시 실행하는데, 이번에는 DynamoDB 클러스터에 대해 실행합니다.

1. 이제 프로그램을 다시 실행합니다. 이번에는 클러스터 엔드포인트 URL을 명령줄 파라미터로 지정합니다.

   ```
   node TryDax.js
   ```

   출력을 확인하여 타이밍 정보를 기록해 둡니다. `GetItem`, `Query` 및 `Scan`에 대한 경과 시간은 DAX가 DynamoDB보다 현저히 적어야 합니다.

## AWS SDK V3와 동등하지 않은 기능
<a name="DAX.client.run-application-nodejs-3-not-in-parity"></a>
+ [기본](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/introduction/#high-level-concepts) 클라이언트 - Dax Node.js V3는 기본 클라이언트를 지원하지 않습니다.

  ```
  const dynamoDBClient = new DynamoDBClient({ region: 'us-west-2' });
  const regularParams = {
      TableName: 'TryDaxTable',
      Key: {
          pk: 1,
          sk: 1
      }
  };
  // The DynamoDB client supports the send operation.
  const dynamoResult = await dynamoDBClient.send(new GetCommand(regularParams));
  
  // However, the DaxDocument client does not support the send operation.
  const daxClient = new DaxDocument({
      endpoints: ['your-dax-endpoint'],
      region: 'us-west-2',
  });
  
  const params = {
      TableName: 'TryDaxTable',
      Key: {
          pk: 1,
          sk: 1
      }
  };
  
  // This will throw an error - send operation is not supported for DAX. Please refer to documentation.
  const result = await daxClient.send(new GetCommand(params));
  console.log(result);
  ```
+ [미들웨어 스택](https://aws.amazon.com/blogs/developer/middleware-stack-modular-aws-sdk-js/) - Dax Node.js V3는 미들웨어 함수 사용을 지원하지 않습니다.

  ```
  const dynamoDBClient = new DynamoDBClient({ region: 'us-west-2' });
  // The DynamoDB client supports the middlewareStack.
  dynamoDBClient.middlewareStack.add(
    (next, context) =>> async (args) => {
      console.log("Before operation:", args);
      const result = await next(args);
      console.log("After operation:", result);
      return result;
    },
    {
      step: "initialize", // or "build", "finalizeRequest", "deserialize"
      name: "loggingMiddleware",
    }
  );
  
  // However, the DaxDocument client does not support the middlewareStack.
  const daxClient = new DaxDocument({
      endpoints: ['your-dax-endpoint'],
      region: 'us-west-2',
  });
  
  // This will throw an error - custom middleware and middlewareStacks are not supported for DAX. Please refer to documentation.
  daxClient.middlewareStack.add(
    (next, context) => async (args) => {
      console.log("Before operation:", args);
      const result = await next(args);
      console.log("After operation:", result);
      return result;
    },
    {
      step: "initialize", // or "build", "finalizeRequest", "deserialize"
      name: "loggingMiddleware",
    }
  );
  ```