본문 바로가기
Node.js

[Node.js] AWS SDK - DynamoDB

by yonikim 2021. 5. 26.
728x90

aws-sdk 를 이용하여 AWS DynamoDB 를 다뤄보자. (DynamoDB 참고글은 [DDB] DynamoDB 세팅하기)

 


AWS SDK - DynamoDB


 

aws-sdk 설치하기

$ npm install aws-sdk

 

▷ lib/dynamodb.js

1. AWS config 세팅하기

const AWS = require('aws-sdk')

const AWS_region = process.env.AWS_REGION || 'ap-northeast-2'
AWS.config.update({ region: AWS_region })

const docClient = new AWS.DynamoDB.DocumentClient()

 

[ INSERT ]

1. 항목 한개 입력

module.exports.putItem = (tableName) => async (item) => {
  const params = {
    TableName: tableName,
    Item: item,
  }
  
  console.log(params)
  return docClient.put(params).promise()
}

 

2. 항목 여러개 입력 (최대 25개)

module.exports.batchLoad = (tableName) => async (array) => {
  const params = {
    RequestItems: {
      [tableName]: array.map((o) => ({ PutRequest: { Item: o } })),
    },
  }
  
  console.log(params.RequestItems[tableName].length)
  return docClient.batchWrite(params).promise()
}

 

[ SELECT ]

1. 쿼리를 이용하여 항목 검색

module.exports.queryItem =
  (tableName) =>
  async ({ pk, sk, keyConditionExpression, filterExpression, expressionAttributeNames, expressionAttributeValues }) => {
    const params = {
      TableName: tableName,
      Key: {
        pk: pk,
      },
    }
    if (sk) params.Key.sk = sk
    if (keyConditionExpression) params.KeyConditionExpression = keyConditionExpression
    if (expressionAttributeNames) params.ExpressionAttributeNames = expressionAttributeNames
    if (filterExpression) params.FilterExpression = filterExpression
    if (expressionAttributeValues) params.ExpressionAttributeValues = expressionAttributeValues

    console.log(params)
    return new Promise((resolve, reject) => {
      docClient.query(params, function (err, data) {
        if (err) {
          console.error(err)
          reject(err)
        } else {
          resolve(data.Items)
        }
      })
    })
  }

 

2. PartiQL 을 이용하여 항목 검색

module.exports.queryWithPartiQL =
  (resultArray) =>
  async (sql, nextToken = null) => {
    const statement = sql
    const results = await dynamodb.executeStatement({ Statement: statement, NextToken: nextToken }).promise()
    if (results.NextToken) {
      //끝까지 다 가져옴
      if (results.Items.length > 0) resultArray.push(results.Items.map(AWS.DynamoDB.Converter.unmarshall))
      return queryWithPartiQL(resultArray)(sql, results.NextToken)
    } else {
      if (results.Items.length > 0) resultArray.push(results.Items.map(AWS.DynamoDB.Converter.unmarshall))
    }
    return resultArray.flatMap((a) => a)
  }

 

[ UPDATE ]

1. 항목 업데이트

module.exports.updateItem =
  (tableName) =>
  async ({ pk, sk, expressionAttributeNames, expressionAttributeValues, updateExpression, returnValues }) => {
    const params = {
      TableName: tableName,
      Key: {
        pk: pk,
      },
    }
    if (sk) Object.assign(params.Key, sk)
    if (expressionAttributeNames) params.ExpressionAttributeNames = expressionAttributeNames
    if (expressionAttributeValues) params.ExpressionAttributeValues = expressionAttributeValues
    if (updateExpression) params.UpdateExpression = updateExpression
    if (returnValues) params.ReturnValues = returnValues

    console.log(params)
    return new Promise((resolve, reject) => {
      docClient.update(params, function (err, data) {
        if (err) {
          console.error(err)
          reject(err)
        } else {
          resolve(data)
        }
      })
    })
  }

 

[ DELETE ]

1. 항목 삭제

module.exports.deleteItem =
  (tableName) =>
  async ({ pk, sk, conditionExpression }) => {
    const params = {
      TableName: tableName,
      Key: {
        pk: pk,
      },
    }
    if (sk) params.Key.sk = sk
    if (conditionExpression) params.ConditionExpression = conditionExpression

    console.log(params)
    await docClient.delete(params).promise()
  }

 


 

▷ index.js

const { putItem, batchLoad, queryItem, queryWithPartiQL, updateItem, deleteItem } = require('./lib/dynamodb')

;(async () => {
  const tableName = 'MarketSku'

  // putItem
  const item = {
    pk: 'sample#CREATE',
    sk: '2021',
    title: '요니킴 짱',
    info: {
      rank: 1,
    },
  }
  await putItem(tableName)(item)

  // batchLoad
  const items = []
  for (i = 0; i < 25; i++) {
    item.sk = String(Number(item.sk) + 1)
    items.push(item)
  }
  await batchLoad(tableName)(items)

  // queryItem
  const params = {
    pk: 'sample#CREATE',
    sk: '2021',
  }
  await queryItem(tableName)(params)

  // queryWithPartiQL
  const query = `SELECT title, info.rank FROM ${tableName} WHERE pk = 'sample#CREATE' AND sk = '2021'`
  await queryWithPartiQL([])(query)

  // updateItem
  const params = {
    pk: 'sample#CREATE',
    sk: '2022',
    updateExpression: 'set title=:title, info.rank = :rank',
    expressionAttributeValues: {
      ':title': '요니킴 킹왕짱',
      ':rank': 0,
    },
    returnValues: 'UPDATED_NEW',
  }
  await updateItem(tableName)(params)

  // deleteItem
  const params = {
    pk: 'sample#CREATE',
    sk: '2040',
  }
  await deleteItem(params)
})()

 

728x90