Study: DeveloperTools(DevTool)/DevTool: NoSQL(Elastic, Mongo)

[NoSQL] mongoDB(vs Elasticsearch) ์ •๋ฆฌ: NoSQL Document DB

DrawingProcess 2022. 11. 15. 16:21
๋ฐ˜์‘ํ˜•
๐Ÿ’ก ๋ณธ ๋ฌธ์„œ๋Š” ๋Œ€ํ‘œ์ ์ธ NoSQL ์ค‘ ํ•˜๋‚˜์ธ 'mongoDB'์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์ •๋ฆฌํ•˜๋ฉฐ ๊ฐ™์€ Document DB์ธ Elasticsearch์™€ ๋น„๊ตํ•ด๋†“์€ ๊ธ€์ž…๋‹ˆ๋‹ค.
ํ‰์†Œ์— NoSQL์— ๊ด€์‹ฌ์ด ์žˆ๊ฑฐ๋‚˜ mongoDB๋ฅผ ์ž…๋ฌธํ•˜๊ณ  ์‹ถ์œผ์‹  ๋ถ„๋“ค์„ ์ฐธ๊ณ  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

1. mongoDB ์†Œ๊ฐœ

1.1 mongoDB ์†Œ๊ฐœ

 mongoDB๋Š” NoSQL DBMS ์˜ ํ•˜๋‚˜๋กœ, ๋›ฐ์–ด๋‚œ ํ™•์žฅ์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ์ž๋ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ํ˜„์กดํ•˜๋Š” NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ค‘ ์ธ์ง€๋„ 1์œ„, ์ „์ฒด DB ์ธ์ง€๋„ 5์œ„๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(DB-Engines Ranking). mongoDB๋งŒ์œผ๋กœ๋Š” mongoDB๋งŒ์˜ ์žฅ์ ์„ ์ฐพ๊ธฐ ์–ด๋ ค์šฐ๋‹ˆ ๊ฐ™์€ Document DB์ธ Elasticsearch์™€ ๋น„๊ตํ•˜๋ฉฐ ์ •๋ฆฌํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1.2 Elasticsearch vs mongoDB ํŠน์ง• ๋น„๊ต

Name Elasticsearch  MongoDB 
Description A distributed, RESTful modern search and analytics engine based on Apache Lucene  One of the most popular document stores available both as a fully managed cloud service and for deployment on self-managed infrastructure
Primary database model Search engine Document store
Secondary database models Document store
Spatial DBMS
Spatial DBMS
Search engine 
Time Series DBMS 
Technical documentation www.elastic.co/­guide/­en/­elasticsearch/­reference/­current/­index.html docs.mongodb.com/­manual
Developer Elastic MongoDB, Inc
Initial release 2010 2009
Current release 7.8.0, June 2020 6.0.1, August 2022
License  Open Source (License: Apache 2.0) Open Source (License: GNU AGPL v3.0)
Cloud-based only  no no (MongoDB Atlas: Cloud Service)
DBaaS offerings (sponsored links)    ScaleGrid for MongoDB Database: Fully managed hosting for MongoDB Database on a wide variety of cloud providers and On-Premises. Automate your management, scaling and backups through one centralized platform.
Implementation language Java C++
Data scheme schema-free (์ •ํ˜•)
- Document ๋‚ด ๊ฐ™์€ ํ•„๋“œ๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๊ฐ™์Œ
- mapping ๊ตฌ์กฐ ํ™•์ธ๊ฐ€๋Šฅ
schema-free (๋น„์ •ํ˜•)
- Document ๋‚ด ๊ฐ™์€ ํ•„๋“œ๋ผ๋„ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ
- mapping ๊ตฌ์กฐ๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š์Œ
Typing  yes
- epoch_millis, epoch_second, geo_point, keyword, text, binary...
yes 
- string, integer, double, decimal, boolean, date, object_id, geospatial
Secondary indexes yes  yes
SQL  SQL-like query language Read-only SQL queries via the MongoDB Connector for BI
APIs and other access methods Java API
RESTful HTTP/JSON API
Bson(Binary + Json) ๋ฌธ์„œ ๊ธฐ๋ฐ˜ ์ €์žฅ ๋ฐ ๊ฒ€์ƒ‰
Supported Languages .Net, Groovy, Community Contributed Clients, Java, JavaScript, Perl, PHP, Python, Ruby Actionscript info, C, C#, C++, Clojure info, ColdFusion info, D info, Dart info, Delphi info, Erlang, Go, Groovy info, Haskell, Java, JavaScript, Lisp info, Lua info, MatLab info, Perl, PHP, PowerShell info, Prolog info, Python, R info, Ruby, Rust, Scala, Smalltalk info, Swift
3rd parties Elastic ์ž์ฒด์ ์œผ๋กœ ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค ์ œ๊ณต. MongoDB Charts: ์‹ค์‹œ๊ฐ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ์ดํ„ฐ์˜ ์‹œ๊ฐํ™” + Chart Type

CData: Connect to Big Data & NoSQL through standard Drivers.
» more

Percona: Database problems? Not on your watch.
Databases run better with Percona.
» more

Navicat for MongoDB gives you a highly effective GUI interface for MongoDB database management, administration and development.
» more

2. mongoDB ๊ฐœ๋…

2.1 mongoDB ์ €์žฅ ๊ตฌ์กฐ

RDB table row column schema
Elasticsearch index document (Json) field mapping
mongoDB collection document (Bson) field ์Šคํ‚ค๋งˆ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Œ

2.1.1 collection

  • ๋‹ค์†Œ ๋น„์Šทํ•œ ํŠน์„ฑ์„ ๊ฐ€์ง„ document์˜ ๋ชจ์Œ
  • ์•„๋ž˜์˜ '2.3 Collection ์ปฌ๋ž™์…˜'์—์„œ ์ถ”๊ฐ€ ์„ค๋ช…

2.1.2 document (= ๋ฌธ์„œ)

  • ๋ฐ์ดํ„ฐ ์ž…์ถœ๋ ฅ ์‹œ์—๋Š” JSON ํ˜•์‹์˜ ๋„ํ๋จผํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ €์žฅ ์‹œ์—๋Š” ์ด์ง„ ํฌ๋งท์œผ๋กœ ์ธ์ฝ”๋”ฉํ•œ BSON(Binary JSON) ํ˜•์‹์˜ ๋„ํ๋จผํŠธ๋กœ ๋ณ€ํ™˜๋˜์–ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์— ๋”ฐ๋ฅธ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์‚ฌ์‹ค BSON์œผ๋กœ ์ธ์ฝ”๋”ฉ(encoding)ํ•˜๊ฑฐ๋‚˜ ๋””์ฝ”๋”ฉ(decoding)ํ•˜๋Š” ๊ฒƒ์€ mongoDB๊ฐ€ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๋ชฐ๋ผ๋„ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ด€๊ณ„๋ฅผ ๊ฐ–๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹จ์ผ ๋„ํ๋จผํŠธ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ๋„ํ๋จผํŠธ์˜ ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ๋””์Šคํฌ I/O ์„ฑ๋Šฅ ์ €ํ•˜ ๋ฐ ๋„ํ๋จผํŠธ ์ตœ๋Œ€ ํฌ๊ธฐ(16MB)๋ฅผ ์ดˆ๊ณผํ•  ์ˆ˜ ์žˆ์–ด ์‚ฌ์šฉ์— ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•จ
  • ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜์ง€ ์•Š๊ณ  ๊ฐ๊ฐ์˜ ๋„ํ๋จผํŠธ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉฐ Commit ๋˜๋Š” Rollback ๊ฐœ๋…์ด ์—†์ด ๋ชจ๋‘ Auto Commit์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  • ์•„๋ž˜์˜ '2.2 Document ๋ฐ์ดํ„ฐ ๋ชจ๋ธ'์—์„œ ์ถ”๊ฐ€ ์„ค๋ช…

2.1.3 schema

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

2.2 mongoDB ์ฃผ์š” ๊ธฐ๋Šฅ

2.2.1 ๋ฐ์ดํ„ฐ ๋ณต์ œ (Replication)

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

2.2.2 ๋ฐ์ดํ„ฐ ๋ถ„์‚ฐ (Sharing / Partitioning)

  • ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฌ๋Ÿฌ ๋Œ€์˜ ์„œ๋ฒ„์— ๋ถ„์‚ฐ์‹œํ‚ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ ํ•ฉ๋‹ˆ๋‹ค.(scaling horizontally)
  • ์ƒค๋”ฉ(sharding)์œผ๋กœ ์•Œ๋ ค์ง„ ๋ฒˆ์œ„ ๊ธฐ๋ฐ˜(range-based) ํŒŒํ‹ฐ์…˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ๊ฑธ์ณ ๋ถ„์‚ฐํ•˜๋Š” ๊ฒƒ์„ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•ด์ค๋‹ˆ๋‹ค.
  • ์ƒค๋”ฉ ์‹œ์Šคํ…œ์€ ์ƒค๋“œ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์šฉ๋Ÿ‰์„ ํ•„์š”ํ•œ ๋งŒํผ ๋Š˜๋ฆฌ๊ณ  ์ž๋™ ์žฅ์• ์กฐ์น˜ ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

2.2.3 ์†๋„์™€ ๋‚ด๊ตฌ์„ฑ

  • MongoDB์˜ ๊ฒฝ์šฐ ์“ฐ๊ธฐ ์‹œ๋งจํ‹ฑ์Šค(Write semantics)์™€ ์ €๋„๋ง(journaling) ์„ ํ†ตํ•ด ์“ฐ๊ธฐ ์†๋„์™€ ๋‚ด๊ตฌ์„ฑ ์‚ฌ์ด์—์„œ ํƒ€ํ˜‘ํ•ฉ๋‹ˆ๋‹ค.
    • ์“ฐ๊ธฐ ์†๋„๋Š” ๋ฏธ๋ฆฌ ์ •ํ•ด์ง„ ์‹œ๊ฐ„ ๋‚ด์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์–‘์˜ ์‚ฝ์ž…, ์ˆ˜์ •, ์‚ญ์ œ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋Š” ์ง€๋ฅผ ์˜๋ฏธ ํ•ฉ๋‹ˆ๋‹ค.
    • ๋‚ด๊ตฌ์„ฑ์€ ์ด๋Ÿฌํ•œ ์“ฐ๊ธฐ ์—ฐ์‚ฐ์ด ๋””์Šคํฌ์— ์ œ๋Œ€๋กœ ๋ฐ˜์˜ ๋จ์„ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค ์ •๋„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • ์“ฐ๊ธฐ ์†๋„์™€ ๋‚ด๊ตฌ์„ฑ(์•ˆ์ •์„ฑ) ์‚ฌ์ด๋Š” ์—ญ๊ด€๊ณ„ ๋˜๋Š” ์ƒ์ถฉ๊ด€๊ณ„(trade-off)๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
  • ํŠธ๋ Œ์ ์…˜
    • MongoDB ๋ฅผ fire-and-forget ๋ชจ๋“œ๋กœ ์„ค์ •ํ•˜๋ฉด ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆด ํ•„์š” ์—†์ด ์„œ๋ฒ„์— ์“ฐ๊ธฐ ์ž‘์—…์„ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ปค๋ฐ‹์ด ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ ํ•˜๊ธฐ ์ „์— ๋‹ค์ˆ˜์˜ ๋ณต์ œ ์„œ๋ฒ„๋“ค์ด ์“ฐ๊ธฐ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋‹จ์œ„ ๋ฐ์ดํ„ฐ๋Š” ์ž‘์ง€๋งŒ ์–‘์€ ๋ฐฉ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ(๊ฐ€๋ น ํด๋ฆญ์ŠคํŠธ๋ฆผ ์ด๋‚˜ ๋กœ๊ทธ ์™€ ๊ฐ™์€)์— ๋Œ€ํ•ด์„œ๋Š” fire-and-forget ๋ชจ๋“œ ์“ฐ๊ธฐ๊ฐ€ ์ ํ•ฉํ•˜๊ณ , ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ์—๋Š” ์•ˆ์ „ ๋ชจ๋“œ ์“ฐ๊ธฐ(safe=True)๊ฐ€ ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์ €์žฅ(์ €๋„๋ง)
    • MongoDB v2.0 ์ดํ›„๋กœ ์ €๋„๋ง์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์ƒํƒœ๋กœ ์„ค์ •๋˜๋ฉฐ, ์ €๋„๋ง์€ ๋ชจ๋“  ์“ฐ๊ธฐ์— ๋Œ€ํ•œ ๋กœ๊ทธ๋ฅผ 100ms ๋งˆ๋‹ค ํ•œ ๋ฒˆ์”ฉ ์ €๋„ ํŒŒ์ผ์— ๊ธฐ๋ก ํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
    • ์“ฐ๊ธฐ ๋ถ€ํ•˜์— ๋Œ€ํ•œ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ €๋„๋ง์„ ํ•˜์ง€ ์•Š์€ ์ฑ„ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ด๋ ‡๊ฒŒ ํ•  ๊ฒฝ์šฐ, ์„œ๋ฒ„๊ฐ€ ์…ง๋‹ค์šด ๋  ๋•Œ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์ด ์†์ƒ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋„๋ง์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์†์ƒ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ๋ณธ์„ ๊ฐ€์งˆ ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด์„œ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋ณต์ œ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

2.3 Document ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง

JSON(JavaScript Object Notation) ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ค‘ Document ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Document ๋ฐ์ดํ„ฐ๋ชจ๋ธ ๋ฐ mongoDB์˜ ํŠน์„ฑ์„ ๊ณ ๋ คํ•œ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

mongoDB ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง์€ ๋„ํ๋จผํŠธ ์„ค๊ณ„ ํ›„ ์ปฌ๋ ‰์…˜์„ ์„ค๊ณ„ํ•˜๋Š” ์ˆœ์„œ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฒ˜๋ฆฌ๋ฐฉ์•ˆ์„ ๊ณ ๋ คํ•œ ๋„ํ๋จผํŠธ ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ๊ณผ ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ์ฃผ๊ฒŒ ๋˜๋ฏ€๋กœ ์ด์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. 

2.3.1 Document ๊ตฌ์กฐ๋ž€?

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

  • ์ž„๋ฒ ๋””๋“œ ๋ฐฉ์‹: ๊ด€๊ณ„๋ฅผ ๊ฐ–๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹จ์ผ ๋„ํ๋จผํŠธ์— sub-document๋กœ ์ €์žฅ
  • ๋ ˆํผ๋Ÿฐ์Šค ๋ฐฉ์‹: ๊ด€๊ณ„๋ฅผ ๊ฐ–๋Š” ๋„ํ๋จผํŠธ์˜ ์ฐธ์กฐํ‚ค๋ฅผ ์ €์žฅํ•˜๋ฉฐ, ์ฐธ์กฐํ‚ค๋ฅผ id๋กœ ๊ฐ–๋Š” ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ์ฐธ์กฐ

+ ObjectId

ObjectId๋Š” RDBMS์˜ Primary Key์™€ ๊ฐ™์ด ๊ณ ์œ ํ•œ ํ‚ค๋ฅผ ์˜๋ฏธํ•˜๋Š”๋ฐ, ์ฐจ์ด์ ์€ Primary Key๋Š” DBMS๊ฐ€ ์ง์ ‘ ๋ถ€์—ฌํ•œ๋‹ค๋ฉด ObjectId๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์—์„œ ์ƒ์„ฑํ•˜๋Š” ์ด์œ ๋Š” MongoDB ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Sharding๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•จ์ธ๋ฐ Router(mongos)๋Š” ObjectId๋ฅผ ๋ณด๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” Shard์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜์•„ํ•˜๊ฒŒ๋„ MongoDB ์„œ๋ฒ„์—์„œ ์•Œ์•„์„œ ObjectId๋ฅผ ๋ถ€์—ฌํ•ด์„œ ์ €์žฅํ•ด๋„ ๋  ๊ฒƒ ๊ฐ™์€๋ฐ ๋”ฑํžˆ ์ง€์›ํ•ด์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ObjectId๋ฅผ ๋„ฃ์ง€์•Š๊ณ  ์ €์žฅํ•œ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๊ทธ๋Œ€๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

2.3.2 Collection ์ปฌ๋ž™์…˜

์ปฌ๋ ‰์…˜์€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”(Table)๊ณผ ๊ฐ™์€ ๊ฐœ๋…์œผ๋กœ ์šฉ๋„๊ฐ€ ๊ฐ™๊ฑฐ๋‚˜ ์œ ์‚ฌํ•œ ๋„ํ๋จผํŠธ๋“ค์˜ ๊ทธ๋ฃน์„ ๋ฌถ๋Š” ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, 4๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์ผ๋ฐ˜ ์ปฌ๋ ‰์…˜, ์บก๋“œ ์ปฌ๋ ‰์…˜, TTL ์ปฌ๋ ‰์…˜, ์‹œ์Šคํ…œ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

์ข…๋ฅ˜ ๋‚ด์šฉ
์ผ๋ฐ˜ ์ปฌ๋ ‰์…˜ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ปฌ๋ ‰์…˜์ž„
์บก๋“œ ์ปฌ๋ ‰์…˜ ์บก๋“œ ์ปฌ๋ ‰์…˜์€ ๊ณ ์ •๋œ ํฌ๊ธฐ๋ฅผ ๊ฐ–๋Š” ์ปฌ๋ ‰์…˜์œผ๋กœ ๋†’์€ ์„ฑ๋Šฅ์˜ ๋กœ๊น… ๊ธฐ๋Šฅ์„ ์œ„ํ•ด ์„ค๊ณ„๋จ
- ๋ช…๋ น์–ด : db.createCollection( "log"\, { capped : true, size : 100000, max : 100 } )
    1) "log" ์ปฌ๋ ‰์…˜ ์ƒ์„ฑ ์‹œ ์บก๋“œ ์˜ต์…˜์„ ์„ค์ •ํ•˜๊ณ  ์ตœ๋Œ€ ์‚ฌ์ด์ฆˆ์™€ ์ตœ๋Œ€ ๋„ํ๋จผํŠธ ์ˆ˜๋ฅผ ์„ค์ •ํ•จ
    2) size : ์ตœ๋Œ€ ์ €์žฅํฌ๊ธฐ๋กœ ๋‹จ์œ„๋Š” Byte์ž„
    3) max : ์ตœ๋Œ€ ๋„ํ๋จผํŠธ ์ˆ˜๋กœ ์˜ต์…˜ ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•จ
- ๋„ํ๋จผํŠธ ์ถ”๊ฐ€ ์‹œ ๋””์Šคํฌ ๊ณต๊ฐ„์ด ์—†๋Š” ๊ฒฝ์šฐ ๊ฐ€์žฅ ์˜ค๋ž˜์ „์— ์ถ”๊ฐ€๋œ ๋„ํ๋จผํŠธ๋ถ€ํ„ฐ ๋ฎ์–ด์“ฐ๊ธฐํ•˜๊ธฐ์— ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๊ฐ€ ํŽธ๋ฆฌํ•จ
- ๋กœ๊น…์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ ธ ์‚ฌ์šฉ์ž๊ฐ€ ์ž„์˜๋กœ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์—†์Œ
TTL ์ปฌ๋ ‰์…˜ TTL ์ปฌ๋ ‰์…˜์€ ํŠน์ • ์‹œ๊ฐ„์ด ๊ฒฝ๊ณผํ•œ ๋„ํ๋จผํŠธ๋ฅผ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜๋Š” ์ปฌ๋ ‰์…˜์œผ๋กœ TTL ์ธ๋ฑ์Šค์— ์˜ํ•ด ์ง€์›๋˜๋Š” ๊ธฐ๋Šฅ์ž„
- ๋ช…๋ น์–ด : db.member.createIndex( { modify_date : 1 }\, { expireAfterSeconds : 3600 } )
    1) modify_date ํ•„๋“œ์— ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ 1์‹œ๊ฐ„(3600/60/60)์ด ์ง€๋‚œ ๋„ํ๋จผํŠธ๋Š” ์‚ญ์ œํ•จ
    2) expireAfterSeconds : ๋„ํ๋จผํŠธ์˜ ์œ ์ง€์‹œ๊ฐ„์„ ์ดˆ ๋‹จ์œ„๋กœ ์„ค์ •ํ•จ
- "_id" ํ•„๋“œ ๋˜๋Š” ์ด๋ฏธ ๋‹ค๋ฅธ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ํ•„๋“œ๋Š” TTL ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Œ
- ์บก๋“œ ์ปฌ๋ ‰์…˜์ธ ๊ฒฝ์šฐ TTL ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Œ
- ๋‹จ์ผ ์ธ๋ฑ์Šค๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋ณตํ•ฉ(Compound) ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Œ
์‹œ์Šคํ…œ ์ปฌ๋ ‰์…˜ mongoDB ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ปฌ๋ ‰์…˜์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ

2.3.2 ์ปฌ๋ž™์…˜ ๋ถ„๋ฆฌ

  • ๋‹จ์ผ ์ปฌ๋ ‰์…˜์— ์“ฐ๊ธฐ ์ž‘์—…์ด ๋งŽ์€ ๊ฒฝ์šฐ ์ปฌ๋ ‰์…˜ ๋ถ„๋ฆฌ๋ฅผ ๊ณ ๋ คํ•จ
  • ๋‹จ์ผ ์ปฌ๋ ‰์…˜์—์„œ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๊ธฐ์ ์œผ๋กœ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ ์ปฌ๋ ‰์…˜ ๋ถ„๋ฆฌ๋ฅผ ๊ณ ๋ คํ•จ
  • ๋‹จ์ผ ์ปฌ๋ ‰์…˜์— ์ €์žฅ๋˜๋Š” ๋„ํ๋จผํŠธ๋“ค์˜ ์•ก์„ธ์Šค ํŒจํ„ด์ด ๋‹ค์–‘ํ•œ ๊ฒฝ์šฐ ์ปฌ๋ ‰์…˜ ๋ถ„๋ฆฌ๋ฅผ ๊ณ ๋ คํ•จ
  • ์ž์ฃผ ์กฐํšŒ๋˜๊ฑฐ๋‚˜ ๋„ํ๋จผํŠธ ์ˆ˜๊ฐ€ ์ ์€ ์ปฌ๋ ‰์…˜์€ ๋ฉ”๋ชจ๋ฆฌ์— ์บ์‹œ ๋  ์ˆ˜ ์žˆ๋„๋ก ์ปฌ๋ ‰์…˜ ๋ถ„๋ฆฌ๋ฅผ ๊ณ ๋ คํ•จ

3. ๋งˆ๋ฌด๋ฆฌ

์ฃผ๋œ ์ฐจ์ด์ ์ด๋ผ ๋А๊ปด์ง€๋Š” ๊ฒƒ์€...

  Elasticsearch MongoDB
Data Schema schema-free (์ •ํ˜•)
- Document ๋‚ด ๊ฐ™์€ ํ•„๋“œ๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๊ฐ™์Œ
- mapping ๊ตฌ์กฐ ํ™•์ธ๊ฐ€๋Šฅ
schema-free (๋น„์ •ํ˜•)
- Document ๋‚ด ๊ฐ™์€ ํ•„๋“œ๋ผ๋„ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ
- mapping ๊ตฌ์กฐ๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š์Œ
APIs and other access methods Java API
RESTful HTTP/JSON API
Bson(Binary + Json) ๋ฌธ์„œ ๊ธฐ๋ฐ˜ ์ €์žฅ ๋ฐ ๊ฒ€์ƒ‰
Supported Languages .Net, Groovy, Community Contributed Clients, Java, JavaScript, Perl, PHP, Python, Ruby Actionscript info, C, C#, C++, Clojure info, ColdFusion info, D info, Dart info, Delphi info, Erlang, Go, Groovy info, Haskell, Java, JavaScript, Lisp info, Lua info, MatLab info, Perl, PHP, PowerShell info, Prolog info, Python, R info, Ruby, Rust, Scala, Smalltalk info, Swift
3rd parties Elastic ์ž์ฒด์ ์œผ๋กœ ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค ์ œ๊ณต. MongoDB Charts: ์‹ค์‹œ๊ฐ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ์ดํ„ฐ์˜ ์‹œ๊ฐํ™” + Chart Type

CData: Connect to Big Data & NoSQL through standard Drivers.
» more

Percona: Database problems? Not on your watch.
Databases run better with Percona.
» more

Navicat for MongoDB gives you a highly effective GUI interface for MongoDB database management, administration and development.
» more

 

์ฐธ๊ณ 

  • [book] MongoDB in Action(๋ชฝ๊ณ  ๋””๋น„ ์ธ ์•ก์…˜) 2nd Edition : ์นด์ผ ๋ฑ…์ปค, 2018, ์ œ์ดํŽ
  • [book] NoSQL ์ฒ ์ € ์ž…๋ฌธ : ๋Œ„ ์„ค๋ฆฌ๋ฒˆ, 2015, ๊ธธ๋ฒ—
  • [book] ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ Real MongoDB : ์ด์„ฑ์šฑ, 2018, ์œ„ํ‚ค๋ถ์Šค
  • [mongoDB] official manual: https://docs.mongodb.com/manual/
  • [wiki] NoSQL: https://ko.wikipedia.org/wiki/NoSQL 
  • mongoDB Story 2: mongoDB ํŠน์ง•๊ณผ ๊ตฌ์„ฑ์š”์†Œ: https://meetup.toast.com/posts/275
๋ฐ˜์‘ํ˜•