์ด ๋ฌธ์„œ์˜ ์›๋ณธ์€ ์™ธ๋ถ€ ์œ„ํ‚ค์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
1. ๊ฐœ์š”2. ์ •์˜3. ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ4. ํŠน์ง•
4.1. ์ผ๊ด€์„ฑ๊ณผ ํ™•์žฅ์„ฑ ์‚ฌ์ด์˜ Trade-off4.2. ๋ถ„์‚ฐ ์ €์žฅ4.3. ๋ฐ์ดํ„ฐ ์ผ์น˜4.4. Schema-less
5. ์ข…๋ฅ˜
5.1. ์ง‘ํ•ฉ-์ง€ํ–ฅ (Aggregate-oriented) ๋ชจ๋ธ
5.1.1. Key-value5.1.2. Document5.1.3. Column-Family
5.2. ๊ทธ๋ž˜ํ”„ (Graph) ๋ชจ๋ธ
6. ์˜์˜7. ์ข…๋ฅ˜

1. ๊ฐœ์š”[ํŽธ์ง‘]

๋‹จ์–ด ๋œป ๊ทธ ์ž์ฒด๋ฅผ ๋”ฐ์ง€์ž๋ฉด "Not only SQL"๋กœ, SQL๋งŒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(DBMS)์„ ์ง€์นญํ•˜๋Š” ๋‹จ์–ด์ด๋‹ค. ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ์•„๋‹Œ, ์—ฌ๋Ÿฌ ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์งํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋ฆฌ์ŠคํŠธ, ํ•ด์‹œ ํ…Œ์ด๋ธ”, ํŠธ๋ฆฌ, ๊ทธ๋ž˜ํ”„ ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๊ณ  ๊ฐ๊ฐ์€ ์žฅ์ ๊ณผ ๋‹จ์ ์ด ๋ช…ํ™•ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ˆœํžˆ NoSQL์ด๋ผ๊ณ ๋งŒ ํ•ด์„œ๋Š” ๋„ˆ๋ฌด ๋œฌ๊ตฌ๋ฆ„ ์žก๋Š” ์–˜๊ธฐ๊ฐ€ ๋œ๋‹ค. NoSQL์ด๋ผ๋Š” ๋‹จ์–ด๋Š” RDBMS๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋…์ ์ ์ธ ์ง€์œ„๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š” ํ˜„์žฌ ์ƒํ™ฉ์— ๋ฐ˜๋ฐœํ•˜๋Š” ์ •์‹ ์„ ๋‹ด๊ณ  ์žˆ๋‹ค.

2. ์ •์˜[ํŽธ์ง‘]

โ€œNot Only SQLโ€ : ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ์—๋Š” SQL ์™ธ์— ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋“ค๋„ ์žˆ๋‹ค.

NoSQL์ด๋ผ๊ณ  ํ•˜๋Š” ๋ง์€ No 'English'๋ผ๊ณ  ํ•˜๋Š” ๋ง๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. ์„ธ์ƒ์—๋Š” ์˜์–ด ๋ง๊ณ ๋„ ์ˆ˜๋งŽ์€ ์–ธ์–ด๊ฐ€ ์กด์žฌํ•œ๋‹ค. MongoDB์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ ์–ธ์–ด์™€ CouchDB์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ ์–ธ์–ด๋Š” ์„œ๋กœ ์ „ํ˜€ ๋‹ค๋ฅด๋‹ค. ๊ทธ๋Ÿผ์—๋„ ์ด ๋‘ ์ฟผ๋ฆฌ ์–ธ์–ด๋Š” ๊ฐ™์€ NoSQL ์นดํ…Œ๊ณ ๋ฆฌ์— ์†ํ•œ๋‹ค. ์–ด์จŒ๊ฑฐ๋‚˜ SQL์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋˜ํ•œ NoSQL์ด No RDBMS๋ฅผ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. BerkeleyDB๊ฐ™์€ ์˜ˆ์™ธ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  No RDBMS๊ฐ€ NoSQL์ธ ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค. SQLํ˜ธํ™˜ ๋ ˆ์ด์–ด๋ฅผ ์ œ๊ณตํ•˜๋Š” KV-store๋ผ๋Š” ์˜ˆ์™ธ๊ฐ€ ์—ญ์‹œ ์กด์žฌํ•œ๋‹ค. ๋ฌผ๋ก  KV-store์˜ ํŠน์ง•์ƒ range query๋ฅผ where์ ˆ์— ๋„ฃ์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์™„์ „ํ•œ SQL์€ ๋ชป ๋˜๊ณ  SQL์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ ์ •๋„๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์‚ฌ์‹ค ์•„์ง๊นŒ์ง€ NoSQL์— ๋‚ด๋ ค์ง„ ๊ตฌ์ฒด์ ์ธ ์ •์˜๋Š” ์—†๋‹ค. ํ•˜์ง€๋งŒ NoSQL์ด๋ผ ๋ถˆ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋“ค์€ ๋Œ€์ฒด๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณตํ†ต์ ์ธ ์„ฑํ–ฅ์„ ๋ณด์ธ๋‹ค.
  • ๋Œ€๋ถ€๋ถ„ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ํ•  ๋ชฉ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋˜๋„๋ก ๋งž์ถฐ์ง„ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด NoSQL ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ์ค‘ ํ•˜๋‚˜์ธ ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋น„์Šทํ•œ ๋ถ„์‚ฐ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์˜คํ”ˆ ์†Œ์Šค์ด๋‹ค. ๋น„์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋„ ์žˆ๊ธด ํ•˜์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„ ๊ทธ๋ ‡๋‹ค.
  • ๋ณดํ†ต 21์„ธ๊ธฐ ์ดˆ๋ฐ˜ ์›น ํ™˜๊ฒฝ์˜ ํ•„์š”์— ๊ธฐ์ดˆ๋ฅผ ๋‘๊ณ  ์žˆ์–ด์„œ, ์ด ์‹œ๊ธฐ์— ๊ฐœ๋ฐœ๋œ ์‹œ์Šคํ…œ๋งŒ์„ NoSQL์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ ์ด์ „์— ๋งŒ๋“ค์–ด์ง„ ODBMS(Objective Database Management System)์€ NoSQL์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์Šคํ‚ค๋งˆ ์—†์ด ๋™์ž‘ํ•˜๋ฉฐ, ๊ตฌ์กฐ์— ๋Œ€ํ•œ ์ •์˜๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š” ์—†์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ ˆ์ฝ”๋“œ์— ์ž์œ ๋กญ๊ฒŒ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด, ๋Œ€๋ถ€๋ถ„์ด ์˜คํ”ˆ์†Œ์Šค๊ณ , 21์„ธ๊ธฐ ์ดˆ๋ฐ˜์— ๊ฐœ๋ฐœ๋˜์—ˆ์œผ๋ฉฐ, SQL์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” Schema-less ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งํ•œ๋‹ค.

3. ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ[ํŽธ์ง‘]

์ง€๋‚œ 20๋…„๊ฐ„, ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ์—๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜์„ ํ†ตํ•œ ์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ด์Šˆ์˜€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ์›น 2.0 ํ™˜๊ฒฝ๊ณผ ๋น…๋ฐ์ดํ„ฐ๊ฐ€ ๋“ฑ์žฅํ•˜๋ฉด์„œ RDBMS๋Š” ๋‚œ๊ด€์— ๋ถ€๋”ชํžˆ๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ๋ฐ”๋กœ โ€˜๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋น„์šฉ์˜ ์ฆ๊ฐ€โ€™๋•Œ๋ฌธ์ด๋‹ค. ๋ฐ์ดํ„ฐ์™€ ํŠธ๋ž˜ํ”ฝ์˜ ์–‘์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ํ•œ ๋Œ€์—์„œ ์‹คํ–‰๋˜๋„๋ก ์„ค๊ณ„๋œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ•˜๋“œ์›จ์–ด์ ์œผ๋กœ ํฐ ๋น„์šฉ์ด ๋“ค๊ฒŒ ๋˜์—ˆ๋‹ค. ์žฅ๋น„์˜ ์„ฑ๋Šฅ์ด ์ข‹์„์ˆ˜๋ก, ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ(Scale-up : ์ˆ˜์ง์  ํ™•์žฅ) ๋น„์šฉ์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

NoSQL์€ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์•ฝ๊ฐ„ ํฌ๊ธฐํ•œ ๋Œ€์‹  ์—ฌ๋Ÿฌ ๋Œ€์˜ ์ปดํ“จํ„ฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์‚ฐํ•˜์—ฌ ์ €์žฅํ•˜๋Š” ๊ฒƒ(Scale-out : ์ˆ˜ํ‰์  ํ™•์žฅ)์„ ๋ชฉํ‘œ๋กœ ๋“ฑ์žฅํ•˜์˜€๋‹ค. NoSQL์˜ ๋“ฑ์žฅ์œผ๋กœ ์ž‘๊ณ  ๊ฐ’์‹ผ ์žฅ๋น„ ์—ฌ๋Ÿฌ ๋Œ€๋กœ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ์™€ ์ปดํ“จํŒ… ๋ถ€ํ•˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

4. ํŠน์ง•[ํŽธ์ง‘]

4.1. ์ผ๊ด€์„ฑ๊ณผ ํ™•์žฅ์„ฑ ์‚ฌ์ด์˜ Trade-off[ํŽธ์ง‘]

์ผ๊ด€์„ฑ(Consistency)์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ ˆ๋Œ€์ ์ธ ์š”์†Œ๊ฐ€ ์•„๋‹˜์„ ์ฃผ์žฅํ•˜๋Š” ์›€์ง์ž„์ด ์ƒ๊ธฐ๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.[1] ์ด๋“ค์€ ๋น„์ผ๊ด€์„ฑ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‘ ๊ฐ€์ง€ ์ด์œ ๋กœ ๊ฐ์ˆ˜ํ•  ๋งŒํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ฃผ์žฅํ–ˆ๋‹ค.
  • ๋‹ค์ˆ˜๊ฐ€ ๋™์‹œ์— ์ฝ๊ณ  ์“ฐ๋Š”(Read and write) ์ƒํ™ฉ์—์„œ์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด์„œ.
  • ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ๋…ธ๋“œ๋“ค์ด ์ž˜ ์ž‘๋™ํ•˜๊ณ  ์žˆ์Œ์—๋„, ์‹œ์Šคํ…œ์˜ ์ผ๋ถ€๊ฐ€ ๊ณ ์žฅ๋‚˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ.

4.2. ๋ถ„์‚ฐ ์ €์žฅ[ํŽธ์ง‘]

๋ฐ์ดํ„ฐ์™€ ํŠธ๋ž˜ํ”ฝ์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ๊ธฐ์กด์˜ ์žฅ๋น„๋กœ๋Š” ์›ํ™œํ•œ ๋ฐ์ดํ„ฐ์˜ ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์กŒ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์ฒ˜๋ฆฌํ•˜๋Š” ์žฅ๋น„์˜ ์„ฑ๋Šฅ์„ ํ‚ค์šฐ๋Š” ์ˆ˜์ง์  ํ™•์žฅ(Scale-up)๊ณผ ์ฒ˜๋ฆฌํ•˜๋Š” ์žฅ๋น„์˜ ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๋Š” ์ˆ˜ํ‰์  ํ™•์žฅ(Scale-out)์ด ์žˆ๋‹ค. ์œ„์—์„œ ์„œ์ˆ ํ–ˆ๋“ฏ์ด ์ˆ˜์ง์  ํ™•์žฅ์€ ๋น„์šฉ์ ์ธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ˆ˜ํ‰์  ํ™•์žฅ์„ ํ†ตํ•ด ์„ฑ๋Šฅ์„ ์˜ฌ๋ ค์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์—์„œ ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ์„ค๊ณ„๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ์ ์ด๋‹ค.

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

์ƒค๋”ฉ(Sharding)์€ ์ƒค๋“œ ํ‚ค(Shard key)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์„ ์ˆ˜ํ‰ ๋ถ„ํ• ํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ํด๋Ÿฌ์Šคํ„ฐ์— ๋ถ„์‚ฐ ์ €์žฅํ•˜๊ณ  ์งˆ์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋„ ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ ๋ชจ๋“  ์ƒค๋”ฉ์„ ์ œ์–ดํ•ด์•ผ ํ•œ๋‹ค. (์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋А ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š”์ง€ ๋“ฑ) ๋˜ํ•œ ์—ฌ๋Ÿฌ ์ƒค๋“œ์— ๊ฑธ์น˜๋Š” ์ฟผ๋ฆฌ๋‚˜ ์ฐธ์กฐ ์ •ํ•ฉ์„ฑ, ํŠธ๋žœ์žญ์…˜, ์ผ๊ด€์„ฑ์˜ ์ œ์–ด์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
๋ถ„์‚ฐ ์ €์žฅ์„ ์ง€์›ํ•˜๋Š” NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ฒฝ์šฐ, ์ง‘ํ•ฉ-์ง€ํ–ฅ(Aggregate-oriented) ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค. ์—ฐ๊ด€๋œ ๋ฐ์ดํ„ฐ๋“ค์ด ํ•จ๊ป˜ ๋ถ„์‚ฐ๋˜๋ฏ€๋กœ, ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ์—์„œ์ฒ˜๋Ÿผ ๋ณต์žกํ•œ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

4.3. ๋ฐ์ดํ„ฐ ์ผ์น˜[ํŽธ์ง‘]

RDBMS์—์„œ ๊ด€๊ณ„ํ˜• ํŠœํ”Œ ์•ˆ์˜ ๊ฐ’์€ ๋‹จ์ˆœํ•ด์•ผ ํ•˜๋ฉฐ ์ค‘์ฒฉ๋œ ๋ ˆ์ฝ”๋“œ๋‚˜ ๋ฆฌ์ŠคํŠธ ๋“ฑ ๋‹ค๋ฅธ ๊ตฌ์กฐ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์—†๋Š” ๋ฐ˜๋ฉด, ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—์„œ๋Š” ์ด๋Ÿฐ ์ œ์•ฝ์ด ์—†์–ด ํ›จ์”ฌ ๋ณต์žกํ•œ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (ex : ๋ฆฌ์ŠคํŠธ, ๋”•์…”๋„ˆ๋ฆฌ, ์ค‘์ฒฉ๋œ ๊ฐ์ฒด ๊ตฌ์กฐ) ๊ทธ ๊ฒฐ๊ณผ ๋ณต์žกํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋ ค๋ฉด ๋จผ์ € ๊ด€๊ณ„ํ˜• ํ‘œํ˜„์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค. ๋ฌผ๋ก  ์ด๋Š” ORM(Objective-Relational Mapping : ๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํ•‘) ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ฌ์ „ํžˆ ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๊ฐ„์—๋Š” ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜๋Š” ์กด์žฌํ•œ๋‹ค. ์ด๋ฅผ Impedance mismatch๋ผ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ NoSQL์€ ๊ทธ๋Ÿฐ ๊ฒŒ ์—†๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ๊ตฌ์กฐ์ด๋“ ์ง€ ์ƒ๊ด€ํ•˜์ง€ ์•Š๊ณ  ํ•˜๋‚˜์˜ Aggregation์œผ๋กœ ์ทจ๊ธ‰ํ•˜์—ฌ ์ €์žฅํ•ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ NoSQL์—์„œ๋Š” ORM ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.

4.4. Schema-less[ํŽธ์ง‘]

NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ณตํ†ต์ ์ธ ํŠน์ง•์€ ์Šคํ‚ค๋งˆ ์—†์ด ๋™์ž‘ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋ฏธ๋ฆฌ ์ •์˜ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ์‹œ๊ฐ„์ด ์ง€๋‚˜๋”๋ผ๋„ ์–ธ์ œ๋“ ์ง€ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํ˜•์‹์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์šฉ์ดํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์Šคํ‚ค๋งˆ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•  ๋ฟ, ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ๋”ฐ๋ฅธ ์•”๋ฌต์ ์ธ ์Šคํ‚ค๋งˆ๋Š” ์—ฌ์ „ํžˆ ์กด์žฌํ•œ๋‹ค. ์ด ๋•Œ๋ฌธ์— ๋‹จ์ผ ๊ฐ’์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์—์„œ ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํ•„๋“œ์˜ ์ด๋ฆ„์„ โ€œQuantityโ€๋ผ๊ณ  ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค๊ณ  ํ•˜์ž. ์ด๊ฒƒ์€ ์•ž์œผ๋กœ ์ €์žฅํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ํ•„๋“œ์˜ ์ด๋ฆ„์„ โ€œQuantityโ€๋ผ๊ณ  ์ €์žฅํ•˜๊ฒ ๋‹ค๋Š” ์•”๋ฌต์ ์ธ ์Šคํ‚ค๋งˆ๊ฐ€ ๋œ๋‹ค. ์•”๋ฌต์ ์ธ ์Šคํ‚ค๋งˆ๋ฅผ ๋ฌด์‹œํ•  ๊ฒฝ์šฐ Quantity๋ฅผ quantity, qty, QUANTITY ๋“ฑ์œผ๋กœ ์ €์žฅํ• ์ง€๋„ ๋ชจ๋ฅธ๋‹ค. ๋œฌ๊ธˆ์—†์ด qty, quantity๊ฐ™์€ ์ƒˆ๋กœ์šด ํ•„๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์ด๋‚˜ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค. ์ด๋Š” NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์•”๋ฌต์ ์ธ ์Šคํ‚ค๋งˆ์— ๋Œ€ํ•ด ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•˜๋ฉฐ, ์ด๋ฅผ ๊ฐ•์ œํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ์ผ์ด๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋•Œ๋ฌธ์— NoSQL์„ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

5. ์ข…๋ฅ˜[ํŽธ์ง‘]

NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํฌ๊ฒŒ ๋„ค ๊ฐ€์ง€ ๋ชจ๋ธ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
  • Key-value
  • Document
  • Column-family
  • Graph

์ด ์ค‘ ๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์„ธ ๋ชจ๋ธ์€ ์ง‘ํ•ฉ-์ง€ํ–ฅ(Aggregate-oriented) ๋ชจ๋ธ์ด๋‹ค.

5.1. ์ง‘ํ•ฉ-์ง€ํ–ฅ (Aggregate-oriented) ๋ชจ๋ธ[ํŽธ์ง‘]

์ง‘ํ•ฉ(Aggregate)์ด๋ž€ ์—ฐ์‚ฐ์˜ ํ•œ ๋‹จ์œ„๋กœ ์ทจ๊ธ‰๋˜๋Š” ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋“ค์˜ ์ง‘ํ•ฉ์ด๋‹ค. ์ง‘ํ•ฉ ์ง€ํ–ฅ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ง‘ํ•ฉ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ์ฒ˜๋Ÿผ ํ•˜๋‚˜์˜ ์—”ํ‹ฐํ‹ฐ์— ๋Œ€ํ•œ ACID ํŠธ๋žœ์žญ์…˜[3]์„ ์ง€์›ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ํ•˜๋‚˜์˜ ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ์—ฐ์‚ฐ์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•œ๋‹ค.

์ง‘ํ•ฉ ์ง€ํ–ฅ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์—ฌ๋Ÿฌ ๋Œ€์˜ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์ด๋ฃจ์–ด์ง„ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์ ํ•ฉํ•˜๋‹ค. ๋‹ค์‹œ ๋งํ•ด ์ˆ˜ํ‰์  ํ™•์žฅ์ด ์šฉ์ดํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€๋Š” ๋‹ฌ๋ฆฌ ์—ฐ๊ด€๋œ ๋ฐ์ดํ„ฐ๋“ค์ด ํ•จ๊ป˜ ์›€์ง์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์˜ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์ง‘ํ•ฉ ๊ฐ„ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ์ผ์น˜ํ•˜๋ฏ€๋กœ, ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ฒ˜๋Ÿผ ๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํ•‘ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค. ๋ฐ์ดํ„ฐ์˜ ๊ฒ€์ƒ‰๋„ ์•„์ฃผ ์‰ฌ์šด ํŽธ์œผ๋กœ, ํ‚ค๋‚˜ ID๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ์ง‘ํ•ฉ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

์ง‘ํ•ฉ ์ง€ํ–ฅ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์กฐ์ธ ์—ฐ์‚ฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ๋ฐ, ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด MongoDB๋‚˜ Cassandra๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” ๋งต ๋ฆฌ๋“€์Šค(MapReduce) ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•จ์œผ๋กœ์จ ์กฐ์ธ๊ณผ ์œ ์‚ฌํ•œ ์—ฐ์‚ฐ์„ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„ํ–ˆ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ถ„์„๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์‚ฌ์šฉ๋ฒ•์ด ์–ด๋ ต๊ณ  Hadoop์˜ ๋งต ๋ฆฌ๋“€์Šค์— ๋น„ํ•˜๋ฉด ์†๋„๋„ ๋งค์šฐ ๋А๋ฆฌ๋‹ค.

5.1.1. Key-value[ํŽธ์ง‘]

ํ‚ค ๊ฐ’(Key-value) ์ €์žฅ์†Œ๋Š” ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ํ˜•ํƒœ์˜ NoSQL์œผ๋กœ, ์ˆ˜ํ‰์  ํ™•์žฅ์ด ์šฉ์ดํ•˜๋‹ค. ๋˜ํ•œ ์•„์ฃผ ๊ฐ„๋‹จํ•œ API๋งŒ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด ์–ด๋ ต์ง€ ์•Š๋‹ค.[4] ํ•˜์ง€๋งŒ ๊ฐ’์˜ ๋‚ด์šฉ์„ ์‚ฌ์šฉํ•œ ์ฟผ๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ’์„ ์ฝ์–ด๋“ค์ธ ๋’ค, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ‚ค์™€ ๊ฐ’์˜ ์Œ์œผ๋กœ ์ €์žฅ๋œ๋‹ค. ํ‚ค๋Š” ๊ฐ’์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ๊ฐ’์€ ์–ด๋– ํ•œ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ผ๋„ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค. ์‹ฌ์ง€์–ด๋Š” ์ด๋ฏธ์ง€๋‚˜ ๋น„๋””์˜ค๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜ํ•œ ๊ฐ„๋‹จํ•œ API๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋งŒํผ ์งˆ์˜์˜ ์†๋„๊ฐ€ ๊ต‰์žฅํžˆ ๋น ๋ฅธ ํŽธ์ด๋‹ค.

Key-value ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š” NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋Š” Memcached, Riak, Redis, Amazon Dynamo DB, LevelDB ๋“ฑ์ด ์žˆ๋‹ค.

5.1.2. Document[ํŽธ์ง‘]

ํ‚ค-๊ฐ’ ๋ชจ๋ธ์—์„œ ํ•œ์ธต ์ง„ํ™”ํ•œ ๋ชจ๋ธ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ํ‚ค์™€ ๋„ํ๋จผํŠธ(Document)์˜ ํ˜•ํƒœ๋กœ ์ €์žฅ๋œ๋‹ค. ํ‚ค-๊ฐ’ ๋ชจ๋ธ๊ณผ ๋‹ค๋ฅธ ์ ์ด๋ผ๋ฉด Value๊ฐ€ ๊ณ„์ธต์ ์ธ ํ˜•ํƒœ์ธ ๋„ํ๋จผํŠธ๋กœ ์ €์žฅ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅ์—์„œ์˜ ๊ฐ์ฒด์™€ ์œ ์‚ฌํ•˜๋ฉฐ, ์ด๋“ค์€ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ์ทจ๊ธ‰๋˜์–ด ์ €์žฅ๋œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…Œ์ด๋ธ”์— ๋‚˜๋ˆ  ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค๋Š” ๋œป์ด๋‹ค. ๋˜ํ•œ Document ๋ชจ๋ธ์—์„œ๋Š” ๋„ํ๋จผํŠธ ๋‚ด์˜ item์„ ์ด์šฉํ•œ ์ฟผ๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹ค๋งŒ ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” Xquery๋‚˜ ๋‹ค๋ฅธ ๋„ํ๋จผํŠธ ์งˆ์˜ ์–ธ์–ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์ฃผ์š”ํ•œ ํŠน์ง•์œผ๋กœ๋Š” ๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํ•‘์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค. ๊ฐ์ฒด๋ฅผ ๋„ํ๋จผํŠธ์˜ ํ˜•ํƒœ๋กœ ๋ฐ”๋กœ ์ €์žฅ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋˜ํ•œ ๊ฒ€์ƒ‰์— ์ตœ์ ํ™”๋˜์–ด ์žˆ๋Š”๋ฐ, ์ด๋Š” ํ‚ค-๊ฐ’ ๋ชจ๋ธ์˜ ํŠน์ง•๊ณผ ๋™์ผํ•˜๋‹ค. ๋‹จ์ ์ด๋ผ๋ฉด ์‚ฌ์šฉ์ด ๋ฒˆ๊ฑฐ๋กญ๊ณ  ์ฟผ๋ฆฌ๊ฐ€ SQL๊ณผ๋Š” ๋‹ค๋ฅด๋‹ค๋Š” ์ ์ด๋‹ค. ๋„ํ๋จผํŠธ ๋ชจ๋ธ์—์„œ๋Š” ์งˆ์˜์˜ ๊ฒฐ๊ณผ๊ฐ€ JSON์ด๋‚˜ xml ํ˜•ํƒœ๋กœ ์ถœ๋ ฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด RDBMS์—์„œ์˜ ์งˆ์˜ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋‹ค๋ฅด๋‹ค. ๋˜ํ•œ ์งˆ์˜ ์–ธ์–ด๊ฐ€ SQL๊ณผ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์— ์ต์ˆ™ํ•ด์ง€๊ธฐ๊นŒ์ง€ ๋‹ค์†Œ ์–ด๋ ค์›€์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

Document ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š” NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋Š” MongoDB, CouchDB, MarkLogic ๋“ฑ์ด ์žˆ๋‹ค.

5.1.3. Column-Family[ํŽธ์ง‘]

์ปฌ๋Ÿผ-ํŒจ๋ฐ€๋ฆฌ(Column-family) ๋ชจ๋ธ์€ ์œ„์˜ ๋‘ ๋ชจ๋ธ[5]๊ณผ๋Š” ๋‹ค์†Œ ์ฐจ์ด๊ฐ€ ์žˆ์ง€๋งŒ ์ง‘ํ•ฉ-์ง€ํ–ฅ ๋ชจ๋ธ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค. ์ด์ „์˜ ๋ชจ๋ธ๋“ค์ด ํ‚ค-๊ฐ’ ์Œ ์ค‘ ๊ฐ’์„ ์ด์šฉํ•ด ํ•„๋“œ๋ฅผ ๊ฒฐ์ •ํ–ˆ๋‹ค๋ฉด, ํŠน์ดํ•˜๊ฒŒ๋„ ์ด ๋ชจ๋ธ์€ ํ‚ค์—์„œ ํ•„๋“œ๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ํ‚ค๋Š” Row(ํ‚ค ๊ฐ’)์™€ Column-family, Column-name์„ ๊ฐ€์ง„๋‹ค. ์—ฐ๊ด€๋œ ๋ฐ์ดํ„ฐ๋“ค์€ ๊ฐ™์€ Column-family ์•ˆ์— ์†ํ•ด ์žˆ์œผ๋ฉฐ, ๊ฐ์ž์˜ Column-name์„ ๊ฐ€์ง„๋‹ค. ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ๋กœ ์„ค๋ช…ํ•˜์ž๋ฉด ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ๊ณ„์ธต์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์…ˆ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ํ•˜๋‚˜์˜ ์ปค๋‹ค๋ž€ ํ…Œ์ด๋ธ”๋กœ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์งˆ์˜๋Š” Row, Column-family, Column-name์„ ํ†ตํ•ด ์ˆ˜ํ–‰๋œ๋‹ค.

์ด๋Ÿฌํ•œ ํŠน์ง• ๋•์— ์ปฌ๋Ÿผ-ํŒจ๋ฐ€๋ฆฌ ๋ชจ๋ธ์€ ํด๋Ÿฌ์Šคํ„ฐ๋ง์ด ์‰ฝ๊ฒŒ ์ด๋ค„์ง€๋ฉฐ, Time stamp๊ฐ€ ์กด์žฌํ•ด ๊ฐ’์ด ์ˆ˜์ •๋œ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ๊ฐ’๋“ค์€ ์ผ๋ จ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋กœ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ผ๋„ ์ €์žฅ๋  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋งŒ ์œ„์˜ ๋‘ ๋ชจ๋ธ๋“ค๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ Blob ๋‹จ์œ„์˜ ์ฟผ๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ, Row์™€ Column์˜ ์ดˆ๊ธฐ ๋””์ž์ธ์ด ์ค‘์š”ํ•˜๋‹ค. Schema-less์ด๊ธด ํ•˜์ง€๋งŒ ์ƒˆ๋กœ์šด ํ•„๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ๋“œ๋Š” ๋น„์šฉ์ด ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์‹ค์ƒ ๊ฒฐ์ •๋œ ์Šคํ‚ค๋งˆ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต๋‹ค.

Column-family ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š” NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋Š” HBase, Cassandra, Hypertable ๋“ฑ์ด ์žˆ๋‹ค.

5.2. ๊ทธ๋ž˜ํ”„ (Graph) ๋ชจ๋ธ[ํŽธ์ง‘]

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

๊ฐœ์ฒด์™€ ๊ด€๊ณ„๋ฅผ ๊ทธ๋ž˜ํ”„ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ํƒ์ƒ‰์˜ ํ‚ค์ผ ๊ฒฝ์šฐ์— ์ ํ•ฉํ•˜๋‹ค. ํŽ˜์ด์Šค๋ถ์ด๋‚˜ ํŠธ์œ„ํ„ฐ ๊ฐ™์€ ์†Œ์…œ ๋„คํŠธ์›Œํฌ์—์„œ(๋‚ด ์นœ๊ตฌ์˜ ์นœ๊ตฌ๋ฅผ ์ฐพ๋Š” ์งˆ์˜ ๋“ฑ) ์ ํ•ฉํ•˜๊ณ , ์—ฐ๊ด€๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ฒœํ•ด์ฃผ๋Š” ์ถ”์ฒœ ์—”์ง„์ด๋‚˜ ํŒจํ„ด ์ธ์‹ ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋„ ์ ํ•ฉํ•˜๋‹ค. ๋˜ํ•œ ์ง‘ํ•ฉ ์ง€ํ–ฅ ๋ชจ๋ธ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ๊ฐœ์ฒด์˜ ACID ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•œ๋‹ค.

๋‹ค๋งŒ ๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ์€ ํด๋Ÿฌ์Šคํ„ฐ๋ง์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค. ๋˜ํ•œ ์งˆ์˜ ์–ธ์–ด๋„ ํŠนํ™”๋˜์–ด ์žˆ์–ด ๋ฐฐ์šฐ๊ธฐ ์–ด๋ ต๋‹ค.

6. ์˜์˜[ํŽธ์ง‘]

๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ NoSQL์ด RDBMS๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ ๋Š” ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ์—๋Š” RDBMS๊ฐ€ ๊ฐ€์ง„ ์žฅ์ ์ด ๋„ˆ๋ฌด๋‚˜ ๋ช…ํ™•ํ•˜๊ณ , ๋˜ํ•œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด RDBMS์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์ต์ˆ™ํ•ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  NoSQL์ด ๊ฐ๊ด‘๋ฐ›๊ณ  ์žˆ๋Š” ๊นŒ๋‹ญ์€ NoSQL๋งŒ์˜ ์žฅ์ ์ด ๋šœ๋ ทํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๊ตฌ๋งค ๋‚ด์—ญ์ด๋‚˜ ๊ฒŒ์ž„์˜ ๋กœ๊ทธ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋“ค์€ ๋งค ์ดˆ๋งˆ๋‹ค ์—„์ฒญ๋‚œ ์–‘์ด ์ƒ์„ฑ๋˜์ง€๋งŒ ํ•œ๋ฒˆ ์ €์žฅ๋˜๊ณ  ๋‚œ ๋’ค์—๋Š” ์ˆ˜์ •๋  ์ผ์ด ๊ฑฐ์˜ ์—†๋‹ค. ์ด๋Ÿฐ ๋ฐ์ดํ„ฐ๋“ค์„ ์ €์žฅํ•˜๋Š” ๋ฐ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ACID ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•  ํ•„์š”๋Š” ์—†์„ ๊ฒƒ์ด๋‹ค. ๊ฑฐ๊ธฐ๋‹ค ์ƒ์„ฑ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์–‘๋„ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์žฅ๋น„์˜ ์„ฑ๋Šฅ์—๋„ ์ƒ๋‹นํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฒƒ์ด๋‹ค. NoSQL์€ ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ ํšจ์œจ์ ์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๋Ÿฌ ๋Œ€์˜ ์žฅ๋น„์— ๋น ๋ฅธ ์†๋„๋กœ ์ €์žฅ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ๋ˆ„์ ๋˜๋”๋ผ๋„ ์–ผ๋งˆ๋“ ์ง€ ์ˆ˜ํ‰์  ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์‹ค์ œ๋กœ ํŽ˜์ด์Šค๋ถ์ด๋‚˜ ํŠธ์œ„ํ„ฐ ๊ฐ™์€ ์†Œ์…œ ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค์—์„œ๋Š” ๊ฒŒ์‹œ๊ธ€๋“ค์„ ์ €์žฅํ•˜๋Š” ๋ฐ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.[6] ๋งค ์ดˆ์— ์ˆ˜๋ฐฑ ๊ธฐ๊ฐ€~์ˆ˜ ํ…Œ๋ผ ๋ฐ”์ดํŠธ์”ฉ ์ƒ์„ฑ๋˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ RDBMS๋ฅผ ์‚ฌ์šฉํ•ด ์ €์žฅํ•œ๋‹ค๋ฉด, ๊ธ€ ์ž‘์„ฑ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ ํ›„ ๊ธ€์ด ์ค‘์•™ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๊ธฐ๊นŒ์ง€ ํ•œ์ฐธ์„ ๊ธฐ๋‹ค๋ ค์•ผ ๊ธ€์„ ์„ฑ๊ณต์ ์œผ๋กœ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ NoSQL์˜ ๋ถ„์‚ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ถ€ํ•˜๊ฐ€ ๋ถ„์‚ฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๊ฐ€ ๊ธ€์“ฐ๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ณ  ํ•œ์ฐธ์„ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†๊ฒŒ ๋œ๋‹ค. ๋˜ํ•œ ๊ฐ์ข… ๊ฒ€์ƒ‰ ์—”์ง„์—๋„ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด NoSQL์ธ๋ฐ, ์›น ํŽ˜์ด์ง€ ๋‚ด์˜ ํ…์ŠคํŠธ๋“ค์„ ํ˜•ํƒœ์†Œ ๋‹จ์œ„์˜ ํ† ํฐ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ํ† ํฐ๊ณผ ํ•ด๋‹น ํ† ํฐ์ด ํฌํ•จ๋œ ํŽ˜์ด์ง€๋“ค์˜ URL์„ ๋งตํ•‘ํ•˜๋Š” Inverted Index(์—ญ ์ธ๋ฑ์Šค) ๊ตฌ์กฐ๋ฅผ NoSQL์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•œ๋‹ค. ์ด๋Ÿฐ ๊ธฐ๋Šฅ์„ ์ผ๋ฐ˜์ ์ธ RDMBS๋กœ ๊ตฌํ˜„ํ–ˆ์„ ๊ฒฝ์šฐ ๊ฒ€์ƒ‰ ์ฐฝ์— ๋‹จ์–ด๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๋•Œ๋งˆ๋‹ค ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์ด ๋ณด์žฅ๋˜์–ด์•ผ ํ•˜๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ๋ฒˆ์˜ ์กฐ์ธ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ผ๋ฉด NoSQL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค RDBMS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋‹ค. NoSQL์€ RDBMS๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ์ƒํ˜ธ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด๋ฉฐ, ๋”ฐ๋ผ์„œ ๋ชฉ์ ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

C++, Java, Python ๋“ฑ ์—ฌ๋Ÿฌ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ(Polyglot Programming) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ญ์‹œ ๋‹ค์–‘ํ•œ ์ €์žฅ์†Œ(Polyglot Persistance)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค๋Š” ์ ์—์„œ NoSQL์˜ ์˜์˜๋Š” ํฌ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

7. ์ข…๋ฅ˜[ํŽธ์ง‘]

  • Redis
  • Cassandra
  • HBase
  • Firebase์˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ Cloud Firestore
[1] "Consistency is not an absolute priority", QCon London 2007, Werner Vogels
[2] ORACLE RAC(Real Application Cluster), ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ SQL server ๋“ฑ
[3] Atomicity + Consistency + Isolation + Durability Transaction
[4] ์งˆ์˜๊ฐ€ put, get, delete ๋ฟ์ด๋‹ค.
[5] ํ‚ค-๊ฐ’ ๋ชจ๋ธ, ๋„ํ๋จผํŠธ ๋ชจ๋ธ
[6] Cassandra๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค HBase๋กœ ๋ฐ”๊พธ์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.