๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ”ญComputer Science๐Ÿ”ญ/๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

DynamoDB๋ฅผ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•ด๋ณด์ž

DynamoDB

DynamoDB๋Š” ํ…Œ์ด๋ธ”, ํ•ญ๋ชฉ, ์†์„ฑ์„ ํ•ต์‹ฌ ๊ตฌ์„ฑ์š”์†Œ๋กœ ๊ฐ€์ง„๋‹ค.

ํ…Œ์ด๋ธ” → ํ•ญ๋ชฉ์˜ ์ปฌ๋ ‰์…˜

ํ•ญ๋ชฉ(์•„์ดํ…œ) → ์†์„ฑ์˜ ์ปฌ๋ ‰์…˜ (RDB์˜ ๋ ˆ์ฝ”๋“œ)

์†์„ฑ → (RDB์˜ ํ•„๋“œ)

DynamoDB์˜ ํŠน์ง•

  • ๋ณดํ†ต DB Resource๊ฐ€ TCP ๊ธฐ๋ฐ˜ ์—ฐ๊ฒฐ์ธ๋ฐ ๋น„ํ•ด DynamoDB๋Š” HTTP์—ฐ๊ฒฐ๋กœ ๋น„์—ฐ๊ฒฐ์„ฑ์ด๋‹ค.
  • ์ด๋Š” ์š”์ฒญ์ด ์˜ฌ๋•Œ๋งŒ ์ƒ์„ฑ๋˜์–ด ์‹คํ–‰๋˜๋Š” ์„œ๋ฒ„๋ฆฌ์Šค ๊ธฐ์ˆ ์ธ AWS Lambda์™€ ๋งค์šฐ ์ž˜ ์–ด์šธ๋ฆฐ๋‹ค.
  • key์™ธ์˜ ์ •ํ•ด์ง„ schema๊ฐ€ ์—†๋‹ค.

DynamoDB๋Š” ๊ธฐ๋ณธ ํ‚ค(Primary Key)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ”์˜ ๊ฐ ํ•ญ๋ชฉ์„ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„

  • ํŒŒํ‹ฐ์…˜ ํ‚ค (ํ•ด์‹œ ์†์„ฑ)
    • ํŒŒํ‹ฐ์…˜ ํ‚ค ํ•˜๋‚˜๋งŒ์œผ๋กœ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด ์ด ํ‚ค๋Š” ์œ ์ผํ•œ ๊ฐ’์ด๋œ๋‹ค.
  • ๋ณตํ•ฉ ๊ธฐ๋ณธ ํ‚ค ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ํŒŒํ‹ฐ์…˜ ํ‚ค์™€ ์ •๋ ฌ ํ‚ค ๋‘๊ฐœ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ด ๊ฒฝ์šฐ์—” ์—ฌ๋Ÿฌ ํ•ญ๋ชฉ์ด ๋™์ผํ•œ ํŒŒํ‹ฐ์…˜ ํ‚ค ๊ฐ’๋„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค
    • (ํŒŒํ‹ฐ์…˜ ํ‚ค, ์ •๋ ฌ ํ‚ค)๊ฐ€ ๋ชจ๋‘ ๊ฐ™์œผ๋ฉด ์•ˆ๋œ๋‹ค.
    • ์ •๋ ฌ ํ‚ค๋Š” ‘๋ฒ”์œ„ ์†์„ฑ’์ด๋ฉฐ ์ด๋Š” ํŒŒํ‹ฐ์…˜ ํ‚ค๊ฐ€ ๋™์ผํ•œ ํ•ญ๋ชฉ๋“ค์„ ์ •๋ ฌ ํ‚ค ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฐ€๊น๊ฒŒ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค.

GameScores ํ…Œ์ด๋ธ” ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์˜ˆ์‹œ

  • ๊ธฐ๋ณธ ํ‚ค๋Š” (ํŒŒํ‹ฐ์…˜ ํ‚ค, ์ •๋ ฌ ํ‚ค) = (UserId, GameTitle) ๊ตฌ์„ฑ

UserId๊ธฐ์ค€์œผ๋กœ ์„œ๋กœ ๊ฐ€๊น๊ฒŒ ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฉฐ GameTitle๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค.

DynamoDB์˜ ๋ฐ์ดํ„ฐ ํ•ธ๋“ค๋ง ๋ฐฉ์‹ 3๊ฐ€์ง€

  1. Item-based actions
    • Item์€ RDB์˜ Row์— ํ•ด๋‹นํ•˜๋ฉฐ Read์ด์™ธ์˜ ‘Write, Delete, Update’๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ์—ฌ๋Ÿฌ ๋Œ€์ƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  Primary key๋ฅผ ์ œ๊ณตํ•ด์„œ ํ•˜๋‚˜์˜ ๋Œ€์ƒ์—๋งŒ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ex) GameScoresํ…Œ์ด๋ธ”์˜ userId 101๋ฒˆ ์•„์ด๋””์˜ ์•„์ดํ…œ์„ ํ•œ๋ฒˆ์— ๋ชจ๋‘ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผํ•œ๋‹ค.
  2. Query
    • ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ์œ„ํ•œ Read-only action
    • ํŒŒํ‹ฐ์…˜ ํ‚ค๋ฅผ ์ œ๊ณตํ•ด์•ผํ•˜๋ฉฐ ์ถ”๊ฐ€์ ์œผ๋กœ ์ •๋ ฌํ‚ค์™€ ์„ธ๋ถ€ ์กฐ๊ฑด์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ex) userId 101๋ฒˆ์˜ GameTitle G, M์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ•ญ๋ชฉ์„ ๊ฐ€์ ธ์™€๋‹ฌ๋ผ๊ณ  ์š”์ฒญ
  3. Scan
    • ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์•„์ดํ…œ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ๋Šฅ
    • ํ…Œ์ด๋ธ”์— ๋“ค์–ด์žˆ๋Š” ์•„์ดํ…œ์ด ๋งŽ๋‹ค๋ฉด ์„ฑ๋Šฅ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ex) GameScores ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์•„์ดํ…œ์„ ๊ฐ€์ ธ์˜ด

 

์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด Query๋กœ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์›ํ•˜๋Š” ์†์„ฑ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ํŒŒํ‹ฐ์…˜์— ์†ํ•ด์žˆ๋‹ค๋ฉด ๋‹ค๋ฅธ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

 

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ํ…Œ์ด๋ธ”์„ Scanํ•œ ํ›„ Filtering Expression์„ ํ†ตํ•ด ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๊ฑธ๋Ÿฌ๋‚ด๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š๋‹ค. (๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ์ตœ๋Œ€ ์šฉ๋Ÿ‰์ด ํฌ์ง€ ์•Š์•„์„œ ์—ฌ๋Ÿฌ๋ฒˆ ์š”์ฒญํ•ด์•ผํ•ด์„œ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆผ)

 

๋”ฐ๋ผ์„œ, ํ…Œ์ด๋ธ”์ด ํฌ๋‹ค๋ฉด scanํ•˜์ง€๋ง๊ณ  ๊ธฐ๋ณธํ‚ค๋‚˜ ๋ณด์กฐ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค์ž.

๋ณด์กฐ์ธ๋ฑ์Šค (Secondary Indexes)

  • ํ‚ค๊ฐ€ ์•„๋‹Œ ์†์„ฑ์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ
  • ์ธ๋ฑ์Šค๋Š” ๊ธฐ๋ณธํ…Œ์ด๋ธ”์— ์†ํ•ด์žˆ์œผ๋ฉฐ ์ด ์ธ๋ฑ์Šค๋ฅผ DynamoDB๊ฐ€ ๊ด€๋ฆฌ(์ถ”๊ฐ€, ์—…๋ฐ์ดํŠธ, ์‚ญ์ œ)
  • https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/GSI.html [๊ณต์‹๋ฌธ์„œ ์ฐธ๊ณ ]

๋ณด์กฐ์ธ๋ฑ์Šค ์‚ฌ์šฉ ์˜ˆ์‹œ

  • ์œ„์˜ GameScores ํ…Œ์ด๋ธ”์—์„œ ‘ํŠน์ • ๊ฒŒ์ž„์˜ ์ตœ๊ณ  ์ ์ˆ˜’๋ฅผ ์•Œ์•„๋‚ด๊ณ  ์‹ถ์„ ๋•Œ..
  • ํ‚ค๊ฐ€ ์•„๋‹Œ ์†์„ฑ์˜ ์ฟผ๋ฆฌ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ธ๋ฑ์Šค๋ฅผ ์ ์šฉ
  • ๊ธฐ๋ณธ ํ‚ค๋Š”(ํŒŒํ‹ฐ์…˜ ํ‚ค, ์ •๋ ฌ ํ‚ค) = (GameTitle, TopScore)๊ตฌ์„ฑ (์ •๋ ฌํ‚ค๋Š” ํ•„์ˆ˜ X)

  • UserId๋Š” ๊ธฐ๋ณธ ํ…Œ์ด๋ธ”์˜ ํ‚ค ์†์„ฑ์ด๋ฏ€๋กœ ์ธ๋ฑ์Šค์— ํ•จ๊ป˜ ํ‘œ์‹œ๋จ
  • ์ด์ œ GameTitleIndex๋ฅผ ์ฟผ๋ฆฌํ•˜๋ฉด ํŠน์ • ํƒ€์ดํ‹€์˜ ์ตœ๊ณ  ์ ์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

DocumentClient

DynamoDB DocumentClient๋Š” ์†์„ฑ ๊ฐ’์˜ ๊ฐœ๋…์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ์ž‘์—…์„ ๊ฐ„์†Œํ™”

 

[AWS DocumentClient ๊ณต์‹๋ฌธ์„œ ์ฐธ๊ณ ]

https://docs.aws.amazon.com/ko_kr/sdk-for-javascript/v2/developer-guide/dynamodb-example-document-client.html

 

DynamoDB ๋ฌธ์„œ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์šฉ - AWS SDK for JavaScript

์ด ํŽ˜์ด์ง€์— ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์„ ์•Œ๋ ค ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์‹ค๋ง์‹œ์ผœ ๋“œ๋ ค ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ž ๊น ์‹œ๊ฐ„์„ ๋‚ด์–ด ์„ค๋ช…์„œ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ง์”€ํ•ด ์ฃผ์‹ญ์‹œ์˜ค.

docs.aws.amazon.com

 

https://github.com/Parkyunhwan/AWSLambda-crud-ex

 

GitHub - Parkyunhwan/AWSLambda-crud-ex: SAM-Lambda-DynamoDB crud API example

SAM-Lambda-DynamoDB crud API example. Contribute to Parkyunhwan/AWSLambda-crud-ex development by creating an account on GitHub.

github.com

ํ”„๋กœ์ ํŠธ์˜ lambdaํด๋”๋กœ ๊ฐ€์‹œ๋ฉด documentClient์˜ CRUD์˜ˆ์‹œ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.