DynamoDB ๋„์ž…๊ธฐ (๋ถ€์ œ: ์‚ฌ์šฉ์ค‘์ธ ์˜คํ”ˆ์†Œ์Šค์˜ ๋ฒ„๊ทธ ์ˆ˜์ •ํ•˜๊ธฐ 2ํƒ„)

youngki
  • #wonderwall
  • #fromm
  • #DynamoDB
  • #Dynamoose
  • #NoSQL
  • #ORM
  • #opensource

๋“ค์–ด๊ฐ€๋ฉฐ

์•ˆ๋…•ํ•˜์„ธ์š”. ๋…ธ๋จธ์Šค์—์„œ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์„ ํ•˜๊ณ  ์žˆ๋Š” ์œ ์˜๊ธฐ์ž…๋‹ˆ๋‹ค.

ํšŒ์‚ฌ์˜ ์„ฑ์žฅ๊ณผ ๋”๋ถˆ์–ด, ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€๋กœ ๋„๋ฉ”์ธ์— ๋”ฐ๋ฅธ ๋ฐ์ดํ„ฐ(DB) ๋ถ„๋ฆฌ๋ฅผ ๊ณ ๋ฏผํ•˜๋Š” ์ƒํ™ฉ์ด ๋„๋ž˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋จธ์Šค ์ฃผ์š”์„œ๋น„์Šค์ธ fromm ๋ฉ”์‹œ์ง€ ์„œ๋น„์Šค์˜ ํ–ฅํ›„ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ  ํ™•๋ณด๋„ ๊ฐ™์ด ๊ณ ๋ คํ•˜์—ฌ, ์ธ์ฆ์„œ๋ฒ„๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด์„œ DynamoDB(NoSQL)๋ฅผ ๋„์ž…ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ

์ค€๋น„

MongoDB์— ๋Œ€ํ•ด ์•ฝ๊ฐ„์˜ ๊ฒฝํ—˜์ด ์žˆ์—ˆ์ง€๋งŒ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ paradigm ๋ณ€ํ™”๋Š” DB์—์„œ๋„ ํ•œ์ˆœ๊ฐ„์— ์ •๋ฆฌ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ํŠนํžˆ, ์‹ฑ๊ธ€ ํ…Œ์ด๋ธ” ๋””์ž์ธ์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์ „ ์ž๋ฃŒ ์—†์ด RDB์  ์‚ฌ๊ณ ์—์„œ๋Š” ์ „๊ฐœ๋˜๊ธฐ ์–ด๋ ค์› ์„ ๊ฐœ๋… ๊ฐ™์Šต๋‹ˆ๋‹ค.
(๊ทธ๋ž˜์„œ ์œ„ ๋‘ ์˜์ƒ์„ ๊ผญ ๋ณด์„ธ์š”.)

์ง„๋„์˜ ๋ฌผ๊ผฌ๋ฅผ ํ‹”์šด ๊ฒƒ์ด ํ‚ค ๋””์ž์ธ ํ’€์‚ฌ์ดํด ์ค‘์— ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ํŒจํ„ด ์ •๋ฆฌํ•˜๊ธฐ ์˜€์Šต๋‹ˆ๋‹ค.
AWS Solutions Architect ๊ป˜์„œ๋„ ์–ธ๊ธ‰ํ•˜์ง€๋งŒ, ์ฐฝ์—… ์ดˆ๊ธฐ ๋น„์ฆˆ๋‹ˆ์Šค์˜ ์š”๊ตฌ์‚ฌํ•ญ์ด ์ž์ฃผ ๋ณ€ํ•  ๋•Œ์—๋Š” RDB์˜ ์‚ฌ์šฉ์„ ๊ถŒํ•˜๊ณ ,
๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ํŒจํ„ด์ด ์ •ํ•ด์ง€๊ณ  ํŠธ๋ž˜ํ”ฝ์ด ์ฆ๊ฐ€ํ•  ๋•Œ, DynamoDB ๊ฐ™์€ NoSQL์˜ ๊ฒ€ํ† ๊ฐ€ ์œ ์šฉํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์„ค๊ณ„

AWS์˜ ๊ถŒ๊ณ ์— ๋”ฐ๋ผ, partition key๋Š” pk, sort key๋Š” sk๋กœ ์ •ํ•˜์˜€๊ณ , ๊ฒฐ๊ณผ์ ์œผ๋กœ Secondary Index๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ฐฑ์—”๋“œํŒ€์›๋“ค ๋ชจ๋‘๊ฐ€ DynamoDB์˜ Partition ์ œ์•ฝ์กฐ๊ฑด ๋ฐ Capability, ๋น„์šฉ, ๋ณตํ•ฉํ‚ค ๋“ฑ์„ ๊ณต๋ถ€ํ•˜๊ณ , ๊ฐ์ž๊ฐ€ ์ธ์ฆ์„œ๋ฒ„์˜ DynamoDB ํ…Œ์ด๋ธ”์„ ์„ค๊ณ„ํ•ด ์™€์„œ, ๋…ผ์˜ ํ•˜๋Š” ์ž๋ฆฌ๋ฅผ ๋งˆ๋ จํ•˜์˜€์Šต๋‹ˆ๋‹ค.
์ด ํšŒ์˜์—์„œ ์ข…ํ•ฉ๋œ ๊ตฌ์กฐ๋กœ DynamoDB์˜ ํ…Œ์ด๋ธ”์„ ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
(์ด ๊ณผ์ •์—์„œ AWS ์ œ๊ณตํ•˜๋Š” DynamoDB์šฉ NoSQL Workbench๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.)

๊ตฌํ˜„

์„ค๊ณ„ ๊ณผ์ •์—์„œ๋ถ€ํ„ฐ ์ง€์› Data type, ์ง€์› Command, ์ง€์› ์—ฐ์‚ฐ์ž ๋“ฑ์„ ์กฐ์‚ฌํ•ด ๋ณด์•˜๊ณ , ํŠนํžˆ ๋ณตํ•ฉํ‚ค์™€ BEGINS_WITH, BETWEEN ์—ฐ์‚ฐ์ž ํ™œ์šฉ์ด ํฅ๋ฏธ๋กœ์™”์Šต๋‹ˆ๋‹ค.

์ •๋ ฌ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๋ชจ๋ฒ” ์‚ฌ๋ก€

DynamoDB ORM์— ๋Œ€ํ•ด ์–•๊ฒŒ ๊ฒ€์ƒ‰ํ•ด ๋ณด๊ณ , ๋Œ€์ค‘์ ์ธ๊ฒŒ ์—†๋‹ค๋Š” ์ƒ๊ฐ์— ์ฒ˜์Œ์—๋Š” AWS SDK๋กœ Service Layer๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๊ฐ€,
์ƒˆ๋กœ ์ž…์‚ฌํ•˜์‹  ์„ ํ˜•๋‹˜๊ป˜์„œ Dynamoose ์กด์žฌ๋ฅผ ์•Œ๋ ค์ฃผ์…”์„œ ORM์„ ์ ์šฉํ•˜์˜€๋Š”๋ฐ, ๊ธฐ์กด RDB์—์„œ TypeORM์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋“ฏ์ด, ์นœ์ˆ™ํ•˜๊ณ  ์ฝ”๋“œ๋„ ๊น”๋”ํ•ด ์กŒ์Šต๋‹ˆ๋‹ค.


๊ทธ๋Ÿฐ๋ฐ, ์ด ๊ณผ์ •์—์„œ Dynamoose ORM์˜ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ๊ฒฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ €ํฌ๋Š” ๊ฐ stage์— ๋”ฐ๋ผ WAS & DB ์„œ๋ฒ„๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๊ณ , DynamoDB๋Š” AWS ๋™์ผ ๊ณ„์ •์—์„œ ํ…Œ์ด๋ธ”๋ช…์œผ๋กœ stage๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š”๊ฒŒ ์ ์ ˆํ•˜๋‹ค๋Š” ํŒ๋‹จ์—
https://dynamoosejs.com/guide/Table ์—์„œ ์ œ๊ณตํ•˜๋Š” prefix ํ˜น์€ suffix ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ,
transaction ์•ˆ์—์„œ๋Š” tableName์˜ prefix ํ˜น์€ suffix๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ํ˜„์ƒ์ด ๋ฐœ๊ฒฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ์„ ์€ prefix ํ˜น์€ suffix ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , tableName ์ž์ฒด๋ฅผ stage์— ๋”ฐ๋ผ ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
์ดํ›„, ์ œ ์ด์ „ ๋ธ”๋กœ๊ทธ ๊ธ€(์‚ฌ์šฉ์ค‘์ธ ์˜คํ”ˆ์†Œ์Šค์˜ ๋ฒ„๊ทธ ์ˆ˜์ •ํ•˜๊ธฐ)์˜ ์ถ”์ฒœ ์ฒ˜๋Ÿผ ์˜คํ”ˆ ์†Œ์Šค repository์— ๋ฐฉ๋ฌธํ•˜์—ฌ, PR ์„ ๋ฐœํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
๊ฐœ์„  ์‚ฌํ•ญ์€ v3.3.0 ์— ๋ฆด๋ฆฌ์ฆˆ ๋˜์—ˆ๊ณ , ํ˜„์žฌ ์ €ํฌ๋Š” ์ด ๊ฐœ์„ ์ด ํฌํ•จ๋œ v4.0.0 ์œผ๋กœ prefix ํ˜น์€ suffix ์˜ต์…˜์„ ์„ค์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์น˜๋ฉฐ

DynamoDB ์ด์ „๋ถ€ํ„ฐ NoSQL์„ ์ ์ง„์ ์œผ๋กœ ์ ‘ํ•ด ์™”์ง€๋งŒ, ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ๋Š๋‚€ ๋ถ€๋ถ„์„ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.
img.png
ETL(Extract, Transform, Load) ๊ด€์ ์œผ๋กœ ๋ณผ๋•Œ, ๋ฐ์ดํ„ฐ ์ €์žฅ ์‹œ์ ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ DB๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์œ ๋„๋จ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

โ† ๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

Art Changes Life

๋…ธ๋จธ์Šค์™€ ํ•จ๊ป˜ ์—”ํ„ฐํ…Œํฌ ์‚ฐ์—…์„ ํ˜์‹ ํ•ด๋‚˜๊ฐˆ ๋ฉค๋ฒ„๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

์ฑ„์šฉ ์ค‘์ธ ๊ณต๊ณ  ๋ณด๊ธฐ