DBMS/MongoDB

[MONGO] ๐Ÿ“š ๋ชฝ๊ณ ๋””๋น„ ํŠน์ง• & ๋น„๊ต & ๊ตฌ์กฐ (NoSQL)

์ธํŒŒ_ 2021. 11. 12. 15:24

๋ชฝ๊ณ ๋””๋น„-ํŠน์ง•

MongoDB ๋ž€?

MongoDB๋Š” ๋ฌธ์„œ ์ง€ํ–ฅ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ(Document DB)์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋‹ค.

์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ •ํ˜• ๋ฐ ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

RDBMS๋Š” MySQL์ด ๋งŽ์ด ์“ฐ์ด๋“ฏ์ด, NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ค‘ ๋Œ€ํ‘œ๊ฒฉ์ด๋ผ๊ณ  ๋งํ•  ์ •๋„๋กœ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ธ๋‹ค.

 

[NoSQL DB vs ๊ด€๊ณ„ํ˜• DB ๋น„๊ต]

ํ•ญ๋ชฉ NoSQL RDBMS
์ ํ•ฉ์—…๋ฌด - ์˜คํ”„๋ผ์ธ์—์„œ ์ •ํ˜• ๋ฐ ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ ๋ถ„์„ ์—…๋ฌด
- ์ดˆ๋‹น ๋™์‹œ ์ฒ˜๋ฆฌ๊ฐ€ ์ค‘์š”ํ•œ ์—…๋ฌด
- ๋กœ๊ทธ ๋ฐ ์ด๋ ฅ ๋“ฑ์˜ ๋‹จ์ˆœ ๊ธฐ๋กํ˜• ์—…๋ฌด
- ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ฐ ์ผ๊ด€์„ฑ์ด ์ค‘์š”ํ•œ ํŠธ๋žœ์žญ์…˜ ์—…๋ฌด
- ์˜จ๋ผ์ธ์—์„œ ๋‹ค์–‘ํ•œ ์ง‘๊ณ„ ๋ฐ ํ†ต๊ณ„๋ฅผ ๋ถ„์„ํ•˜๋Š” ์—…๋ฌด
- ๋ณต์žกํ•œ ๊ณ„์‚ฐ ๋ฐ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์ด ํ•„์š”ํ•œ ์—…๋ฌด
๋ฐ์ดํ„ฐ ๋ชจ๋ธ - ์„œ๋น„์Šค์— ๋งž๋Š” DB ์„ ํƒ์ด ์ค‘์š”ํ•จ
- ๋ฐ˜์ • ๊ทœํ™”์— ์˜ํ•œ ์„ค๊ณ„๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํ•จ
- ๋น„์ •ํ˜•ํ™” ์Šคํ‚ค๋งˆ ๊ตฌ์กฐ๋กœ ๋ฏธ๋ฆฌ ์Šคํ‚ค๋งˆ๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š์Œ
- ์—”ํ‹ฐํ‹ฐ ๋ฐ ๊ฐ ์—”ํ‹ฐํ‹ฐ ๊ฐ„ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•จ
- ์—”ํ‹ฐํ‹ฐ ์ •์˜ ์‹œ ์ •๊ทœํ™”์— ์˜ํ•œ ์„ค๊ณ„๊ฐ€ ์ค‘์š”ํ•จ
- ํ…Œ์ด๋ธ”\, ์นผ๋Ÿผ ๋“ฑ DB์š”์†Œ์— ๋Œ€ํ•œ ์Šคํ‚ค๋งˆ๋ฅผ ์—„๊ฒฉํžˆ ๊ด€๋ฆฌํ•จ
์„ฑ๋Šฅ - ํด๋Ÿฌ์Šคํ„ฐ ํฌ๊ธฐ\, ๋„คํŠธ์›Œํฌ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์˜ํ•ด ์„ฑ๋Šฅ์ด ๊ฒฐ์ •๋จ - ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด์„œ๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ž‘์—…์ด ํ•„์š”ํ•จ
์ธํ„ฐํŽ˜์ด์Šค - ์ฟผ๋ฆฌ ์™ธ ๋‹ค์–‘ํ•œ API๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•จ - SQL์„ ํ†ตํ•ด์„œ๋งŒ ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•จ
์žฅ์  - ์ฟผ๋ฆฌ ํ”„๋กœ์„ธ์‹ฑ์ด ๋‹จ์ˆœํ™”๋˜์–ด ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋จ - ๋ฐ์ดํ„ฐ ์ค‘๋ณต ๋ฐฐ์ œ๋กœ ๋ฐ์ดํ„ฐ ์ด์ƒ ๋ฐœ์ƒ ๋ฐ ์šฉ๋Ÿ‰ ์ฆ๊ฐ€๋ฅผ ์ตœ์†Œํ™”ํ•จ
๋‹จ์  - ๋ฐ์ดํ„ฐ ์ค‘๋ณต์— ์˜ํ•ด ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์ด ์ €ํ•˜๋˜๊ณ  ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•จ - ์กฐ์ธ์ด ๋ณต์žกํ•œ ๊ฒฝ์šฐ ์ฟผ๋ฆฌ ํ”„๋กœ์„ธ์‹ฑ๋„ ๋ณต์žกํ•ด์ ธ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋จ

 

๋ชฝ๊ณ ๋””๋น„๋งŒ์˜ ์žฅ์ ๊ณผ ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. (์˜์ƒ์„ ์ฐธ์กฐํ•˜๋ฉด ๋” ์‰ฝ๊ฒŒ ์ดํ•ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค)

๋ชฝ๊ณ ๋””๋น„-ํŠน์ง•


MongoDB ํŠน์ง•

 

์‹ ๋ขฐ์„ฑ(Reliability)

  • ์„œ๋ฒ„ ์žฅ์• ์—๋„ ์„œ๋ฒ„๊ฐ€ ์œ ๋™์ ์œผ๋กœ ๋ถ„๋‹ดํ•˜์—ฌ ์„œ๋น„์Šค๋Š” ๊ณ„์† ๋™์ž‘ ์œ ์ง€
  • Primary ์™€ Secondry๋กœ ๊ตฌ์„ฑ๋œ ReplicaSet ๊ตฌ์กฐ๋กœ ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์ง€์›

๋ชฝ๊ณ ๋””๋น„-ํŠน์ง•

๋ชฝ๊ณ ๋””๋น„๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋‚˜์˜ primary์™€ ๋‘๊ฐœ์˜ secondary๋กœ ReplicaSet์„ ๊ตฌ์„ฑํ•œ๋‹ค.

primary๋Š” ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ ,secondary๋Š” primary๋ถ€ํ„ฐ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œํ•˜๊ณ  ์œ ์ง€ํ•จ์œผ๋กœ์„œ, ํ•˜๋‚˜์˜ ์„œ๋ฒ„์—์„œ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋งŒ์ผ primary์„œ๋ฒ„์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด, secondary๊ฐ€ primary๋กœ ์ „ํ™˜๋˜์–ด ์„œ๋ฒ„๋ฅผ ๊ณ„์† ์œ ์ง€์‹œํ‚จ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ๋นˆ secondary์„œ๋ฒ„๋ฅผ ๋ชฝ๊ณ ๋””๋น„๊ฐ€ ๋ณต๊ตฌ ์‹œ์ผœ์คŒ์œผ๋กœ์„œ ์„œ๋ฒ„๋ฅผ ์œ ์ง€ํ• ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๋ชฝ๊ณ ๋””๋น„-ํŠน์ง•

 

ํ™•์žฅ์„ฑ(Scalability)

  • ๋ฐ์ดํ„ฐ์™€ ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€์— ๋”ฐ๋ผ ์ˆ˜ํ‰ํ™•์žฅ(scale-out) ๊ฐ€๋Šฅ
  • ๋ฐ์ดํ„ฐ๋ฅผ ์ƒค๋”ฉํ•˜์—ฌ ์ˆ˜ํ‰ํ™•์žฅ(scale-out) ํ•  ์ˆ˜ ์žˆ์Œ

๋ชฝ๊ณ DB์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ฆ๊ฐ€ํ•˜์—ฌ ๋”์ด์ƒ ํ•˜๋‚˜์˜ Replica Set์— ๋‹ด์„ ์ˆ˜ ์—†๊ฒŒ ๋˜๋ฉด, ๋ชฝ๊ณ DB๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ƒค๋”ฉํ•˜์—ฌ ๋ถ„์‚ฐ์‹œ์ผœ ์ค„ ์ˆ˜ ์žˆ์Œ.

์ด๋Ÿฌํ•œ ์ƒค๋”ฉ๊ณผ์ •์€ ์„œ๋น„์Šค ์ค‘๋‹จ์—†์ด ์˜จ๋ผ์ธ์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค.

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

์ด๋Ÿฌํ•œ ๋™์ž‘์„ ๋ฐธ๋Ÿฐ์‹ฑ์ด๋ผ๊ณ  ํ•œ๋‹ค.

๋ชฝ๊ณ ๋””๋น„-ํŠน์ง•-1๋ชฝ๊ณ ๋””๋น„-ํŠน์ง•-2๋ชฝ๊ณ ๋””๋น„-ํŠน์ง•-3

๋ชฝ๊ณ DB๋Š” ์˜จ๋ผ์ธ์ƒ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐธ๋Ÿฐ์‹ฑ ํ•ด์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ผ Replica Set ์—์„œ ์ƒค๋“œ๋กœ์˜ ์˜จ๋ผ์ธ ์ „ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ

์ƒค๋“œ์˜ ํ™•์žฅ ์ถ•์†Œ๋„ ๋ชจ๋‘ ์˜จ๋ผ์ธ์œผ๋กœ ์ง„ํ–‰ ๊ฐ€๋Šฅ ํ•˜๋‹ค.

 

์œ ์—ฐ์„ฑ(Flexibility)

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

๋ชฝ๊ณ ๋””๋น„-ํŠน์ง•

๋งŒ์–€ ํ•ธ๋“œํฐ์— OS์ข…๋ฅ˜๋ฅผ ๊ตฌ๋ถ„ํ•ด์•ผํ•œ๋‹ค๋ฉด, RDBMS์—์„œ ์ปฌ๋Ÿผ์„ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ RYAN์ด๋ผ๋Š” ์‚ฌ๋žŒ์ด ๋˜ ํœด๋Œ€ํฐ์„ ๊ตฌ๋งคํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? ๋˜ ์ปฌ๋Ÿผ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ• ๊นŒ?

๋ชฝ๊ณ ๋””๋น„-ํŠน์ง•

RDBMS๋Š” ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ํ…Œ์ด๋ธ”์„ ๋ถ„๋ฆฌํ•˜๊ณ  ๊ด€๊ณ„๋ฅผ ๋งบ์Œ์œผ๋กœ์„œ ํ•ด๊ฒฐํ•œ๋‹ค.

 

ํ•˜์ง€๋งŒ ๋ชฝ๊ณ DB๋Š” Schema ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๋‹ค

๋ชฝ๊ณ DB๋Š” JSON ๊ธฐ๋ฐ˜์— Document ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, Document ๋Š” ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ๋‹ด์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ •๋ณด๋ฅผ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ‘œํ˜„ํ•ด์ค€๋‹ค

๋˜ํ•œ Application์—์„œ ๋‹ค๋ฃจ๋Š” ์˜ค๋ธŒ์ ํŠธ์™€ 1:1๋กœ ๋งค์นญ๋˜๊ธฐ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค

๋ชฝ๊ณ ๋””๋น„-ํŠน์ง•

RDBMS๋Š” ๋ณต์žกํ•˜๊ฒŒ ํ…Œ์ด๋ธ”์ด ์–ฝํ˜€์žˆ๋Š” ๊ฒƒ์— ๋ฐ˜ํ•ด, NOSQL์€ ํ•œ๋ˆˆ์— ๋ณด๊ธฐ ์‰ฝ๋„๋ก ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง„๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Index ์ง€์›(Index Support)

  • ๋‹ค์–‘ํ•œ ์กฐ๊ฑด์œผ๋กœ ๋น ๋ฅธ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰
  • ๋Œ€๋ถ€๋ถ„ NoSQL๋“ค๊ณผ ๋‹ค๋ฅธ ๋ชฝ๊ณ ๋””๋น„ ๋งŒ์˜ ํฐ ์ฐจ์ด์ 
  • ํ•„์š”ํ•œ ํ•„๋“œ์— ํ•„์š”ํ•œ ๋งŒํผ ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ์—์„œ ๋‹ค์–‘ํ•œ ์กฐ๊ฑด์œผ๋กœ ์กฐํšŒ ๊ฐ€๋Šฅ
  • ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ Index ๋ฅผ ์ œ๊ณต
    • Hashed Index (์ƒค๋“œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„๋ฐฐํ•˜๊ณ ์ž ํ• ๋•Œ ์‚ฌ์šฉ)
    • Multikey Index
    • Partial Index
    • TTL Index (์ œํ•œ์‹œ๊ฐ„์„ ์„ค์ •ํ•˜์—ฌ ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ์ง€์›Œ์ฃผ๋Š” ์ธ๋ฑ์Šค)
    • Geospatial Index (๊ณต๊ฐ„์ธ๋ฑ์Šค) ๊ณต๊ฐ„๋‚ด์— ๊ฑฐ๋ฆฌ๋‚˜ ๋ฒ”์œ„๋ฅผ ๊ณ„์‚ฐ ์นด์นด์˜ค ํƒ์‹œ, ์นด์นด์˜ค ๋Œ€๋ฆฌ, ์นด์นด์˜ค ๋ชจ๋นŒ๋ฆฌํ‹ฐ

๋ชฝ๊ณ ๋””๋น„-ํŠน์ง•


 ๋ชฝ๊ณ ๋””๋น„ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง

๋ชฝ๊ณ ๋””๋น„ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง

  • Database :
    Collection์˜ ๋ฌผ๋ฆฌ์  ์ปจํ…Œ์ด๋„ˆ

  • Collection :
    RDBMS์—์„œ์˜ table์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
    Document์˜ ๊ทธ๋ฃน, Document์˜ ๋‚ด๋ถ€์— ์œ„์น˜ํ•ด ์žˆ์Œ.
    RDBMS์™€ ๋‹ฌ๋ฆฌ ์Šคํ‚ค๋งˆ๋ฅผ ๋”ฐ๋กœ ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š์Œ (๋™์  ์Šคํ‚ค๋งˆ๋กœ ์ƒ์„ฑ)

  • Document :
    nosql์„ ๋‹ค๋ฅธ๋ง๋กœ Document Oriented Database๋ผ ํ•จ.
    ํ•œ๊ฐœ ์ด์ƒ์˜ key-value ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ตฌ์กฐ
    ์ผ๋ฐ˜ rdbms์—์„œ๋Š” row or tuple๊ณผ ์œ ์‚ฌํ•˜๋‹ค ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

  • Key/Field :
    ์ผ๋ฐ˜ Rdbms์—์„œ Column์ด๋ผ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
    ์ปฌ๋Ÿผ ๋ช…๊ณผ ์ €์žฅ ๊ฐ’์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค.

์ด๋“ค์˜ ๊ด€๊ณ„๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋ž˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™๋‹ค.

๋ชฝ๊ณ ๋””๋น„-ํŠน์ง•

ํ•œ ์Œ ์ด์ƒ์˜ Key ์™€ value๊ฐ€ pair ๋กœ ์ด๋ฃจ์–ด์ง„ Document ๋“ค์ด ๋ชจ์—ฌ Collection ์„ ์ด๋ฃจ๊ณ , Collection ๋“ค์€ Database ์•ˆ์— ํฌํ•จ ๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Database ๋Š” Server ์•ˆ์— ์œ„์น˜ํ•œ๋‹ค.

๋ชฝ๊ณ ๋””๋น„-ํŠน์ง•


MongoDB ๋ชจ๋ธ ๊ตฌ์„ฑ์„ ์•Œ์•„๋ดค์œผ๋‹ˆ ์ง์ ‘ Document ๋ฅผ ๋ชจ๋ธ๋ง ํ•ด๋ณด์ž.

์ดํ•ด๋ฅผ ๋•๊ธฐ์œ„ํ•ด ์ธ์Šคํƒ€๊ทธ๋žจ์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ชจ๋ธ๋งํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณธ๋‹ค.

์ธ์Šคํƒ€๊ทธ๋žจ์—์„œ ๊ฒŒ์‹œ๋ฌผ์„ ์˜ฌ๋ฆด ๋•Œ ํ•„์š”ํ•œ ์ •๋ณด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๊ฒŒ์‹œ๊ธ€์—๋Š” ์‚ฌ์ง„, ์„ค๋ช…, ์ž‘์„ฑ์ž, ์ž‘์„ฑ์ผ์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.
  • ๊ฒŒ์‹œ๊ธ€์—๋Š” 0๊ฐœ ์ด์ƒ์˜ ํ•ด์‰ฌํƒœ๊ทธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฒŒ์‹œ๊ธ€์— ๋ง๊ธ€์„ ๋‹ฌ ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ด์šฉํ•œ๋‹ค๋ฉด table ์€ ์ด ์„ธ๊ฐœ๊ฐ€ ๋งŒ๋“ค์–ด ์ ธ์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

๋ชฝ๊ณ ๋””๋น„-ํŠน์ง•

comment, article, hashtags ํ…Œ์ด๋ธ”๋“ค์€ ๊ฐ๊ฐ์˜ ๊ตฌ์กฐ(Schema)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , table ์•ˆ์˜ row ๋“ค์„ ์ด ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ ํ…Œ์ด๋ธ”์˜ id ์˜ ๊ด€๊ณ„์„ฑ์„ ์ด์šฉํ•˜์—ฌ ์„ธ ํ…Œ์ด๋ธ”์„ JOIN ์‹œ์ผœ ํ•œ ํŽ˜์ด์ง€์— ์ถœ๋ ฅํ•  ๊ฒƒ์ด๋‹ค.

 

์œ„์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ MongoDB ์—์„œ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด, MongoDB ๋Š” Schema-less ์ด๋ฏ€๋กœ ํ•˜๋‚˜์˜ Collection ํ•˜์œ„์˜ Document ๋“ค์ด ๋ชจ๋‘ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค.

{
  _id: POST_ID, title: POST_TITLE,
  content: POST_CONTENT,
  author: POST_WRITER,
  hashtags: [ TAG1, TAG2, TAG3 ], // subdocument 
  time: POST_TIME
  comments: [ // subdocument 
     { 
       username: COMMENT_WRITER,
       mesage: COMMENT_MESSAGE,
       time: COMMENT_TIME
     },
     { 
       username: COMMENT_WRITER,
       mesage: COMMENT_MESSAGE,
       time: COMMENT_TIME
     }
  ]
}

 

๋”ฐ๋ผ์„œ ์œ„์™€ ๊ฐ™์ด ํ•˜๋‚˜์˜ Document ์•ˆ์— ๋ชจ๋“  ์ •๋ณด๋ฅผ ํฌํ•จํ•œ๋‹ค.

Document ์•ˆ์— ์žˆ๋Š” hashtags, comments ์˜ ๋ฐฐ์—ด๊ณผ ๊ฐ™์€ ํ•˜์œ„์˜ Document ๋ฅผ subdocument ๋ผ๊ณ  ํ•œ๋‹ค.

๋งŒ์•ฝ ์–ด๋–ค ๊ฒŒ์‹œ๋ฌผ์— ํƒœ๊ทธ๋‚˜ ๋ง๊ธ€์ด ์—†๋‹ค๋ฉด ํ•ด๋‹น ํ•„๋“œ๊ฐ€ ์—†์–ด๋„ ์ƒ๊ด€์—†๋‹ค. (Schema-less)


MongoDB์—์„œ ์‚ฌ์šฉํ•˜๋Š” JSON vs BSON

๋ชฝ๊ณ DB๋Š” Document๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค.

์ด๋•Œ ์šฐ๋ฆฌ ๋ˆˆ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„๋ณด๋ฉด ๋ชจ๋‘ JSONํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ , ์ €์žฅํ•œ๋‹ค. ๋˜ ๊ฒ€์ƒ‰๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ์—๋„ JSON๋ฌธ๋ฒ•์— ๋งž๊ฒŒ ์ž…๋ ฅํ•ด์ค€๋‹ค.

ํ•˜์ง€๋งŒ ์ •ํ™•ํžˆ ๋ชฝ๊ณ DB์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ BSONํ˜•ํƒœ๋กœ ์ €์žฅํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

 

JSON ํ˜•์‹

์ผ๋ฐ˜์ ์œผ๋กœ JSON์€ JavaScript Object Notation์˜ ์ค„์ž„๋ง๋กœ Javascript ์–ธ์–ด์˜ ์ผ๋ถ€๋กœ ์ •์˜๋˜์–ด์žˆ๋Š” ํ˜•์‹์ด๋ฉฐ 2013๋…„์— ๊ณต์‹ํ™” ๋œ ํ˜•์‹์ด๋‹ค.

JSON์˜ ํ˜•ํƒœ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ key์™€ value์˜ ๊ฐ’์œผ๋กœ ์ฑ„์›Œ์ ธ ์žˆ๋‹ค.

์ง๊ด€์ ์ด๊ณ  ๊ฐ„๋‹จํ•œ ํŠน์„ฑ์œผ๋กœ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ์˜ ํ‘œํ˜„ ๋ฐฉ๋ฒ•์ด๋‹ค.

{
	"_id": "10009999",
	"listing_url": "https://www.aaabbb.com/rooms/10009999",
	"name": "Horto flat with small garden",
	"summary": "One bedroom + sofa-bed ...",
	"cancellation_policy": "flexible",
	"last_scraped": {
		"$date": {
			"$numberLong": "1549861200000"
		}
	}
}

 

BSON ํ˜•์‹

BSON์€ ๋‹จ์ˆœํžˆ ๋งํ•˜๋ฉด Binary JSON์ด๋‹ค.

JSON๊ณผ ๋™์ผํ•œ ๊ตฌ์กฐ์ง€๋งŒ Binary ํ˜•ํƒœ๋กœ ๋ณ€๊ฒฝ๋œ ๊ตฌ์กฐ๋ฅผ ๋งํ•œ๋‹ค.

๊ทธ๋Ÿผ JSON์ด ์žˆ๋Š”๋ฐ ์™œ BSON์ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ผ๊นŒ?

 

๋ชฝ๊ณ DB๊ฐ€ ์ฒ˜์Œ ๊ฐœ๋ฐœ๋  ๋•Œ์—๋Š” JSON์„ ์ด์šฉํ•ด์„œ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ๋ฌธ์ œ์  ๋ช‡๊ฐ€์ง€๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ธฐ ์‹œ์ž‘ํ•œ ๊ฒƒ์ด๋‹ค.

  • JSON์€ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„์ด ๋งค์šฐ ๋Š๋ฆฌ๋‹ค.
  • JSON์€ ๊ณต๊ฐ„ ํšจ์œจ์„ฑ๊ณผ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€๋‹ค. (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฌธ์ œ)

์ด ์™ธ์—๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๊ณ ์•ˆํ•ด ๋‚ธ๊ฒƒ์ด ๋ฐ”๋กœ BJSON ์ธ ๊ฒƒ์ด๋‹ค.

JSON๊ตฌ์กฐ์˜ ์ข‹์€์ ์€ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๊ฐ€๋ฉด์„œ ๊ธฐ๊ณ„๊ฐ€ ๋น ๋ฅด๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” binary ํ˜•ํƒœ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ €์žฅ์„ ํ•œ ๊ฒƒ์ด๋‹ค.

 

๋™์ผํ•œ ํ˜•ํƒœ๋กœ ์‚ฌ๋žŒ์—๊ฒŒ ๋ณด์—ฌ์งˆ ๋•Œ์—๋Š” JSON์˜ ํ˜•ํƒœ๋กœ ๋ณด์—ฌ์ฃผ๊ณ , ์ €์žฅํ•  ๋•Œ๋‚˜ ๋„คํŠธ์›Œํฌ๋กœ ์ „์†กํ•  ๋•Œ์—๋Š” BSON ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์„œ ์ €์žฅ ๋˜๋Š” ์ „์†กํ•œ๋‹ค.

{"hello": "world"} 

→       \x16\x00\x00\x00           // total document size
        \x02                       // 0x02 = type String
        hello\x00                  // field name
        \x06\x00\x00\x00world\x00  // field value
        \x00                       // 0x00 = type EOO ('end of object')

๋˜ํ•œ JSON์—์„œ๋Š” ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋ฌธ์ž์—ด, boolean, ์ˆซ์ž, ๋ฐฐ์—ด ๋ฟ์ด๋‹ค.

๊ทธ์— ๋ฐ˜ํ•ด BSON์—์„œ๋Š” ์กฐ๊ธˆ ๋” ๋””ํ…Œ์ผํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด์„œ ์ˆซ์ž์˜ ๊ฒฝ์šฐ๋„ Integer, Float, Long, Decimal๊ณผ ๊ฐ™์ด ๋ถ„๋ฅ˜๊ฐ€ ๋˜๋ฉฐ ๋‚ ์งœ์˜ ํ˜•ํƒœ๋„ ์ €์žฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.