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
'Node.js' 카테고리의 다른 글
[Node.js] AWS SDK - S3 (0) | 2021.05.31 |
---|---|
[Node.js] 원하는 길이만큼 유니크 아이디 만들기 (0) | 2021.05.27 |
[Node.js] XLSX 파일 JSON 파일로 만들기 (0) | 2021.05.26 |
[Node.js] Swagger 도입하기 (0) | 2021.05.11 |
[Node.js] Mac OS 업데이트 이후 npm install 시 gyp 오류가 날 경우 (0) | 2021.04.26 |