[DynamoDB] DynamoDB๋ž€

2025. 3. 18. 12:28ยท๐Ÿ’ป CS/Database

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' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[DynamoDB] DynamoDB ๋กœ์ปฌ ์—ฐ๊ฒฐ  (2) 2025.07.25
[DynamoDB] ํ‚ค ๋””์ž์ธ ํŒจํ„ด  (0) 2025.07.17
[์˜ค๋ผํด] MERGE INTO  (0) 2025.01.16
[์˜ค๋ผํด] WITH ๊ตฌ๋ฌธ  (0) 2025.01.16
[์˜ค๋ผํด] NULL๊ณผ ๊ณต๋ฐฑ  (0) 2025.01.10
'๐Ÿ’ป CS/Database' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [DynamoDB] DynamoDB ๋กœ์ปฌ ์—ฐ๊ฒฐ
  • [DynamoDB] ํ‚ค ๋””์ž์ธ ํŒจํ„ด
  • [์˜ค๋ผํด] MERGE INTO
  • [์˜ค๋ผํด] WITH ๊ตฌ๋ฌธ
jinnkimm7
jinnkimm7
[Nothing changes if nothing changes] ๊ฐœ๋ฐœ ๊ด€๋ จ ๊ธ€ ์œ„์ฃผ๋กœ ํฌ์ŠคํŒ… ํ•  ์˜ˆ์ •์ด๋ฉฐ, ๊ทธ ๋ฐ–์— ์ž๊ธฐ๊ฐœ๋ฐœ/์ผ์ƒ/์—ฌํ–‰์— ๊ด€ํ•œ ์ •๋ณด๋„ ํฌ์ŠคํŒ… ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
  • jinnkimm7
    Jin's log
    jinnkimm7
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • โœ๏ธ๊ธ€์“ฐ๊ธฐ ๐Ÿฆบ๊ด€๋ฆฌ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (86)
      • ๐Ÿ“š Record (0)
      • ๐Ÿ‘จ‍๐Ÿ’ป Programming (10)
        • JavaScript (3)
        • React (1)
        • Next.js (2)
        • HTML (0)
        • CSS (1)
        • Java (3)
        • Spring (0)
      • ๐Ÿ’ป CS (13)
        • Computer Architecture (1)
        • Operation System (2)
        • Data Structure (0)
        • Algorithm (2)
        • Database (7)
        • Network (1)
      • โš™๏ธ Tool (12)
        • AWS (2)
        • git (3)
        • VS Code (2)
        • IntelliJ (0)
        • Eclipse (1)
        • Excel (4)
      • ๐Ÿ“ Coding Test (37)
        • Programmers Lv0 (6)
        • Programmers Lv1 (1)
        • Programmers Lv2 (2)
        • Programmers Lv3 (1)
        • ๋ฐฑ์ค€ Bronze (0)
        • ๋ฐฑ์ค€ Sliver (3)
        • SQL (24)
      • ๐Ÿ“– Study (9)
      • ๐Ÿ”  English (0)
      • ๐ŸŽ’ Travel (0)
      • ๐Ÿ’ฐ Finance (0)
      • ๐Ÿ“Œ Etc (3)
  • ๋งํฌ

    • Resume
  • ์ธ๊ธฐ ๊ธ€

  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • ํƒœ๊ทธ

    MYSQL
    ์˜ค๋ธ”์™„
    vscode
    ํ‹ฐ์Šคํ† ๋ฆฌ์ฑŒ๋ฆฐ์ง€
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์ค€๋น„
    99ํด๋Ÿฝ
    ๋ฐฑ์ค€
    ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
    next.js
    ์˜ค๋ผํด
    java
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—ฐ์Šต
    ๋ฐ˜๋„์ฒด8๋Œ€๊ณต์ •
    ํ•ญํ•ด99
    dynamodb
    AWS
    SQL
    ํด๋ž˜์Šค
    git
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
jinnkimm7
[DynamoDB] DynamoDB๋ž€
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”