DynamoDB
- AWS์ ๋ํ์ ์ธ NoSQL ๊ธฐ๋ฐ ์๋ฒ๋ฆฌ์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋น์ค์ ๋๋ค.
- key-value์ ๋ฌธ์ ๊ธฐ๋ฐ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ง์ํฉ๋๋ค.
- ์ฌ์ฉํ๋งํผ ๋น์ฉ์ ์ง๋ถํ๊ณ , ๋ฒ์ ์ ๊ทธ๋ ์ด๋, ๊ฐ๋ ์ค๋จ ๋ฑ ์ ์ง๊ด๋ฆฌ๊ฐ ํ์์์ต๋๋ค.
- ์ด์ธ์ ํน์ง์ผ๋ก ์ด๋ฏธ์ง, ๋์์ ๋ฑ ์ด๋ ํ ํํ๋ ์ ์ฅ์ด ๊ฐ๋ฅํ๊ณ , ์ง์ ์๋๊ฐ ๋น ๋ฅด๊ณ , ํ ์ด๋ธ ์์ฑ์ ์คํค๋ง ์์ฑ์ด ํ์์๋ค๋ ํน์ง์ด ์์ต๋๋ค.
- ๊ธฐ์กด RDBMS์ ๋ค๋ฅด๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฐ ๋ฐฉ์์ผ๋ก ์ ์ฅํ๋ฏ๋ก ์ํํ์ฅ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ด๋ป๊ฒ ์๋ํ๋๊ฐ
- Tables & Items : ๋ก์ฐ์ ์ปฌ๋ผ ๋์ ์, ๋ค์ด๋๋ชจ DB๋ items(JSON๊ณผ ๊ฐ์ ๊ฐ์ฒด)์ ํ ์ด๋ธ์ ์ ์ฅํฉ๋๋ค.
- Primary Keys : ๊ฐ๊ฐ์ item๋ค์ ๊ณ ์ ํ primary key๋ฅผ ๊ฐ์ ธ์ผํฉ๋๋ค. primaryํค๋ partition key ๋จ๋ ์ด๊ฑฐ๋ partition key์ sort key์ ์กฐํฉ์ด์ฌ์ผ ํฉ๋๋ค.
- Indexes : ํจ๊ณผ์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์ํด Global Secondary Indexes (GSI)์ Local Secondary Indexes (LSI)๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- Automatic Scaling : ๋ค์ด๋๋ชจ DB๋ ์๊ตฌ์ ๊ธฐ๋ฐํ์ฌ ์๋์ ์ผ๋ก ์ค์ผ์ผ์ ๊ณผ ์ค์ผ์ผ ๋ค์ดํฉ๋๋ค.
Item
Item์ ํ ์ด๋ธ์ ์ ์ฅ๋ ๊ทผ๋ณธ์ ์ธ ๋ฐ์ดํฐ ๋จ์์ด๊ณ , ๊ด๊ณํ DB์ ๋ก์ฐ๋ ์ ์ฌํ๋ค๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค. ๊ฐ ๊ฐ์ ์์ดํ ์ ํ๋ ํน์ ๊ทธ ์ด์์ ์์ฑ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๊ณ , ํ ์ด๋ธ ๋ด์์ ๋ ํนํ๊ฒ ์๋ณ๋๊ธฐ ์ํด ๊ธฐ๋ณธํค๋ฅผ ๊ฐ์ ธ์ผํฉ๋๋ค. ๊ธฐ๋ณธํค๋ ์์์ ๋งํ๋ฏ์ด ํํฐ์ ํค ๋จ๋ ์ด๊ฑฐ๋ ํํฐ์ ํค์ ์ ๋ ฌํค์ ์กฐํฉ์ด์ฌ์ผ ํฉ๋๋ค.
Data Type
๋ค์ด๋๋ชจ DB๋ ์์ดํ ์ ์์ฑ์ ๋ํด ๋ค์ํ ํ์ ์ ์ง์ํฉ๋๋ค. ์ฃผ๋ก ์๋์ ๋ฐ๋ผ ๋ถ๋ฅ๋ฉ๋๋ค.
- Scalar Types : Number, String, Binary, Boolean, Null
- Document Types : List, Map
- Set Types : Number Set, String Set, Binary Set
Partition Key (Hash)
ํํฐ์ ํค๋ ๋ ํนํ ์๋ณ์์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํํฐ์ ํค๋ scalability(ํ์ฅ์ฑ)์ ์ํด ๋ฐ์ดํฐ๋ฅผ ํํฐ์ ์ ์ญ์ ๋ถ๋ฐฐํฉ๋๋ค. ํด์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ์คํ ๋ฆฌ์ง ์์น๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ํํฐ์ ํค๋ฅผ ์ ์ ํํ๋ฉด ๊ณ ๋ฅธ ๋ฐ์ดํฐ ๋ถ๋ฐฐ๋ฅผ ๋ณด์ฅํ ์ ์๊ณ , ๋ณ๋ชฉํ์์ ๋ง์ ์ ์์ต๋๋ค.(์ต๋ํ ๋ง์ด ๋ถ์ฐ์์ผ์ผํฉ๋๋ค. Distribute parition keys as much as possible) ํจ์จ์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์ํด ์ ๋ ฌํค์ ํจ๊ป ๋ณตํฉ ๊ธฐ๋ณธํค๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
Sort Key (Range)
์ ๋ ฌํค๋ ํํฐ์ ํค์ ํจ๊ป ๋ณตํฉ ๊ธฐ๋ณธํค๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. Range-based query๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ ๋ ฌํค๋ ํจ์จ์ ์ธ ์ ๋ ฌ๊ณผ ํํฐ์ ๋ด์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ ์๋๋กํฉ๋๋ค.
Primary Key
๊ธฐ๋ณธํค๋ ํ ์ด๋ธ ๋ด์์ ๊ฐ๊ฐ์ ์์ดํ ์ ์๋ณํ ์ ์์ต๋๋ค. primaryํค๋ partition key ๋จ๋ ์ด๊ฑฐ๋ partition key์ sort key์ ์กฐํฉ์ด์ฌ์ผ ํฉ๋๋ค.
Query
์ฟผ๋ฆฌํ๊ธฐ ์ํด ํํฐ์ ํค๋ฅผ ์ ๋ฌํด์ฃผ์ด์ผํฉ๋๋ค. ๊ทธ๋์ ์ ์ ํ ํํฐ์ ํค๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ฟผ๋ฆฌ ์๋์ ํ ์ด๋ธ ๋ด์ ํํฐ์ ํค์ ๋งค์นํ๋ ์์ดํ ๋ค์ ๋ฆฌํดํฉ๋๋ค. ์ ๋ ฌํค๋ ํํฐ์ ์์ดํ ์ ์ ๋ ฌํ๋๋ฐ ์ ์ฉํ์ง๋ง ํ์์ ์ผ๋ก ์ ํํด์ผํ๋ ๊ฒ์ ์๋๋๋ค.
Scan
์ค์บ ๋์์ ํ ์ด๋ธ์ ๊ฒฐ๊ณผ๋ฅผ ํจ์นํ๊ธฐ ์ํด ํํฐ์ ํค ํน์ ์ ๋ ฌํค๋ฅผ ํ์๋ก ํ์ง ์์ต๋๋ค. ์ด๋ฆ์ด ์์ํ๋ฏ ์ค์บ์ ์ ์ฒด ํ ์ด๋ธ์ ์ค์บํ์ฌ ํํฐ๋ก์จ ์ ๋ฌ๋ ์์ฑ ๊ฐ์ ๊ธฐ๋ฐํ ๊ฒฐ๊ณผ๋ค์ ํํฐ๋งํฉ๋๋ค.
Pagination
๋ค์ด๋๋ชจ DB ์ฟผ๋ฆฌ/์ค์บ ์๋ต์ ์์ฒญ ํ๋๋น 1MB๋ก ์ ํ๋ฉ๋๋ค. ๋ง์ฝ ๊ฒฐ๊ณผ๊ฐ 1MB๋ฅผ ์ด๊ณผํ๋ค๋ฉด, ์๋์ ์ผ๋ก ํ์ด์ง๋ค์ด์ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ด๋๋ชจ DB๋ LastEvaluatedKey๋ฅผ ์ ๊ณตํ๊ณ , ์ด๊ฒ์ ํตํด ๋ค์ ํ์ด์ง๋ฅผ ํจ์นํ ์ ์์ต๋๋ค. LastEvaluatedKey๋ฅผ ExclusiveStartKey๋ก์ ๋ค์ ์์ฒญ์ ์ ๋ฌํด ์ฃผ์ด์ผํฉ๋๋ค.
Sorting
์ ๋ ฌํค์ ๊ธฐ๋ฐํ์ฌ ์ค๋ฆ์ฐจ์์ผ๋ก ๋ค์ด๋๋ชจ DB ์ฟผ๋ฆฌ/์ค์บ ๊ฒฐ๊ณผ๊ฐ ์ ๋ ฌ๋ฉ๋๋ค. ๋ด๋ฆผ์ฐจ์์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ฐพ๊ธฐ ์ํด์ ScanIndexForward๋ฅผ false ์ฒ๋ฆฌํด์ผํฉ๋๋ค. ๋ง์ฝ ์ ๋ ฌํค๊ฐ ์ซ์๋ผ๋ฉด, ๊ฒฐ๊ณผ๋ ์ซ์์ ์ผ๋ก ์ ๋ ฌ๋๊ณ ๊ทธ๋ ์ง ์๋ค๋ฉด UTF-8 byte ์์๋ฅผ ๋ฐ๋ฆ ๋๋ค.
์ค์ต
const { DynamoDBClient, CreateTableCommand, PutItemCommand, GetItemCommand, DeleteItemCommand, UpdateItemCommand } = require('@aws-sdk/client-dynamodb');
const REGION = 'ap-southeast-2';
const ddbClient = new DynamoDBClient({region: REGION});
const TABLE_NAME = "EspressoDrinks";
async function createTable() {
const createParam = {
TableName: TABLE_NAME,
AttributeDefinitions: [
{
AttributeName: "DrinkName",
AttributeType: "S",
}
],
KeySchema: [
{
AttributeName: "DrinkName",
KeyType: "HASH",
},
],
BillingMode: "PAY_PER_REQUEST",
};
await ddbClient.send(new CreateTableCommand(createParam));
console.log('Table created!!');
}
// PutItemCommand
async function insertDrink(drinkName, price) {
const params = {
TableName: TABLE_NAME,
Item: {
DrinkName : { S: drinkName },
Price : { N: price.toString()}
}
};
await ddbClient.send(new PutItemCommand(params));
console.log(`${drinkName} inserted!! `);
}
// GetItemCommand
async function getDrink(drinkName) {
const params = {
TableName : TABLE_NAME,
Key: {
DrinkName : { S: drinkName}
}
};
const { Item } = await ddbClient.send(new GetItemCommand(params));
console.log('Get Drink : ', Item);
}
// UpdateItemCommand
async function updateDrink(drinkName, price) {
const params = {
TableName: TABLE_NAME,
Key: {
DrinkName: { S : drinkName },
},
UpdateExpression: 'SET #Price = :Price',
ExpressionAttributeNames: {
'#Price': 'Price',
},
ExpressionAttributeValues: {
':Price' : { N : price.toString()}
}
};
await ddbClient.send(new UpdateItemCommand(params));
console.log("Drink's price updated!");
}
// DeleteItemCommand
async function deleteDrink(drinkName) {
const params = {
TableName: TABLE_NAME,
Key: {
DrinkName : { S: drinkName }
},
};
await ddbClient.send(new DeleteItemCommand(params));
console.log("Item Deleted");
}
async function main() {
// await createTable();
// await insertDrink('Coffee', 2000);
// await insertDrink('Latte', 3000);
// await getDrink('Coffee');
// await updateDrink('Latte', 4000);
// await deleteDrink('Latte');
}
main();
'๐ป CS > Database' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ค๋ผํด] MERGE INTO (0) | 2025.01.16 |
---|---|
[์ค๋ผํด] WITH ๊ตฌ๋ฌธ (0) | 2025.01.16 |
[์ค๋ผํด] NULL๊ณผ ๊ณต๋ฐฑ (0) | 2025.01.10 |
[Oracle] ์ค๋ผํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฒ์ ํ์ธ ์ฟผ๋ฆฌ (0) | 2024.12.19 |