AWS

[AWS] DynamoDB - CRUD 코드 작성 (with Node.js)

itaeiou 2021. 12. 8. 18:01
반응형

AWS DynamoDB

이제 Node.js 서버에서 DynamoDB를 활용한 CRUD 코드 작성에 대해 알아보겠습니다.

아래 링크의 공식 도큐먼트를 참고했으나, 세부 코드는 조금씩 다를 수 있습니다.

https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/GettingStarted.NodeJs.03.html

 

3단계: 항목 생성, 읽기, 업데이트 및 삭제 - Amazon DynamoDB

기본 키가 필요합니다. 이 코드는 기본 키(year, title) 및 info 속성을 지닌 항목을 추가합니다. info 속성은 영화에 대한 자세한 정보를 제공하는 샘플 JSON을 저장합니다.

docs.aws.amazon.com

 

예제 테이블 생성

시작하기 전에 예제로 사용할 알림 정보 테이블을 생성합니다.

 

테이블 명 : NOTIFICATION

파티션 키 : user_id

정렬 키 : uuid

로컬인덱스1 : create_datetime-index (파티션: user_id, 정렬: create_dataetime, 프로젝션: ALL)

로컬인덱스2 : read_yn-index (파티션: user_id, 정렬: read_yn, 프로젝션: ALL)

 

https://jane-aeiou.tistory.com/63

 

[AWS] DynamoDB - 테이블 생성하기

AWS DynamoDB AWS DynamoDB는 AWS에서 제공하는 서버리스 NoSQL입니다. Key-Value 데이터베이스로 스키마가 복잡하지 않다는 것이 장점입니다. 비용은 사용한 만큼만 내면 되기 때문에 많은 비용이 들지 않

jane-aeiou.tistory.com

 

1. aws-sdk 설치

npm install aws-sdk

위 명령어로 AWS SDK를 설치합니다.

 

2. config

AWS 공식 Document의 설정 방법입니다.

config update를 사용해 설정하고 docClient를 사용합니다.

// 공식 Doc
const AWS = require('aws-sdk');

// 한국 리전 사용
AWS.config.update({
    accessKeyId: "myAccessKeyId",
    secretAccessKey: "mySecretAccessKey",
    region: 'ap-northeast-2',
    endpoint: "http://dynamodb.ap-northeast-2.amazonaws.com"
});

// 로컬 DynamoDB 사용시
AWS.config.update({
    region: 'ap-northeast-2',
    endpoint: "http://localhost:8000"
});

const docClient = new AWS.DynamoDB.DocumentClient();

저는 AWS 관련 코드를 awsConfig.js 파일에 모두 모아뒀습니다.

config update를 사용하면 S3, Cognito 등 다른 서비스 설정이 꼬여서 파라미터로 설정했습니다.

const AWS = require('aws-sdk');

const docClient = new AWS.DynamoDB.DocumentClient({
    accessKeyId: "myAccessKeyId",
    secretAccessKey: "mySecretAccessKey",
    region: 'ap-northeast-2',
    endpoint: "http://dynamodb.ap-northeast-2.amazonaws.com"
});

 

3. Create 항목 추가

CRUD의 첫번째 Create는 put 함수를 사용합니다.

파라미터는 TableNameItem의 파티션키(user_id), 정렬키(uuid)는 필수로 넣어줘야하고,

그 외의 Item은 자유롭게 작성하시면 됩니다.

var params = {
    TableName: "NOTIFICATION",
    Item: {
        "uuid": uuid(),
        "user_id": user_id,
        "category": category,
        "message": message,
        "create_datetime": moment().format('YYYY-MM-DD HH:mm:ss'),
        "read_yn": "N"
    }
}

docClient.put(params).promise()
    .then(data => {
        console.log("Added item:", data);
    })
    .catch(err => {
        console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));
    });

 

4. Read 항목 읽기

DynamoDB의 Read는 종류가 여러개이기 때문에, 따로 설명하겠습니다.

여기를 참고해주세요.

 

5. Update 항목 업데이트

Update는 동일하게 update함수를 사용합니다.

params에서 TableName과 Key는 필수 입력 조건입니다.

어떤 항목을 수정할지 정해줍니다. 지정된 1개의 항목만 수정할 수 있습니다.

 

UpdateExpression 에서는 수정할 컬럼을 지정합니다. 여러개라면 콤마(,)로 이어서 작성하시면 됩니다.

콜론(:)으로 시작하는 것은 변수라 생각하시면 됩니다.

ExpressionAttributeValues 에서는 수정할 값을 입력합니다.

var params = {
	TableName: "NOTIFICATION",
	Key: {
		"user_id": data.user_id,
		"uuid": data.uuid,
	},
	UpdateExpression: "set read_yn = :read_yn",
	ExpressionAttributeValues: {
		":read_yn": "Y"
	}
}

docClient.update(params).promise()
	.then(res => {
		console.log(res);
	})
	.catch(err => {
		console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));
	});

 

6. Delete 항목 삭제

Delete역시 동명의 delete 함수를 사용합니다.

마찬가지로 TableName과 Key는 필수로 입력해야하며, 1개의 항목을 삭제합니다.

 

삭제 시 조건을 걸 수도 있으나, 조건에 해당하는 항목들을 모두 삭제하는 것이 아닌

해당 항목이 조건을 만족할 때만 삭제됩니다.

 

ConditionExpression 에 조건문을 입력하고

ExpressionAttributeValues 에서 변수 값을 입력합니다.

var params = {
	TableName: "NOTIFICATION",
	Key: {
		"user_id": data.user_id,
		"uuid": data.uuid,
	},
	ConditionExpression: "create_datetime <= :create_datetime",
	ExpressionAttributeValues: {
		":create_datetime": "2000-01-01"
	}
}

docClient.delete(params).promise()
	.then(res => {
		console.log(res);
	})
	.catch(err => {
		console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));
	});
반응형