## 지금은 No-SQL ~~소녀~~ 시대!  기존 RDBMS인 MySQL, MS-SQL, Oracle, PostgreSQL 이 데이터베이스로써 많이 쓰이고 있습니다. 하지만 요즘처럼 실시간성이 중요시 되고 모바일 디바이스의 양이 급증함에 따라 더 빠르고, 확장성이 뛰어난 DB들이 필요로 해져서 NoSQL이라고 불리우는 데이터베이스들이 많이 생겨났습니다. 많은 데이터베이스들 중 딱히 “이 데이터베이스가 최고다!”” 하는 것은 없습니다. 왜냐면 모든 데이터베이스들은 마치 게임에서 주어진 한정된 포인트를 가지고 스탯을 찍는 것처럼 어떤 한 장점이 부각되면 다른 단점이 생기는 그런 구조입니다. 이런 걸 CAP 이론이라고 합니다. ## CAP 이론 유명한 CAP 이론을 살펴보면  ##### Consistency: 동일한 데이터를 읽고 쓰는 것 ##### Availability: 일부 서버가 다운되더라도 다른 서버들에게 영향을 주지 않는 것 ##### Partition: 일부 데이터가 박살나도 정상 동작하는 것 이렇게 3가지 특성 중에 데이터베이스는 3가지를 모두 만족할 수는 없고 2가지를 충족시킬 수 있다는 이야기입니다. 기존 관계형 데이터베이스 (RDBMS)는 CA에 집중하지만 확장성에 중요한 P를 충족하기 위해 NoSQL은 CP나 AP같은 형태의 데이터베이스들입니다. 그 중 MongoDB는 CP 모델을 따르는 NoSQL 데이터베이스입니다. 오늘은 NoSQL 중에 가장 인기가 많은 MongoDB에서 소개하려 합니다. ## 특징 데이터가 Document (RDBMS에선 row)라고 불리는 문서형 데이터베이스입니다. 이 데이터의 집합을 Collection (RDMBS에선 table)이라고 합니다. 스키마 제약 없이 자유롭고 BSON (Binary JSON) 형태로 각 문서가 저장되며 Array (배열)이나 Date (날짜) 등 기존 RDBMS에서 지원하지 않던 형태로도 저장할 수 있기 때문에 JOIN이 필요없이 한 문서에 좀 더 이해하기 쉬운 형태 그대로 정보를 저장할 수 있다는 것이 특징입니다. 예를들어 MongoDB에 대한 정보를 저장하고 싶다고 하면 ``` { name: "MongoDB", info: { type: "NoSQL", cap: "CP" }, tag: ["NoSQL", "MongoDB", "10gen", "BSON"] } ``` 이런 형태로 저장을 하고 나중에 읽을때도 이렇게 읽을 수가 있습니다. ACID 트랜잭션을 MongoDB는 지원하지 않지만 일부 명령들은 atomicity를 보장하고 있습니다. MongoDB의 `update` 명령 중 `$set`, `$inc`, `$addToSet`, `$push`, `$pushAll`, `$pull`, `$pullAll` 등의 명령들은 atomicity를 보장합니다. ## Atomicity 중요한거임? 예를들어 글의 조회수를 증가시킬 때, `$inc`를 사용하지 않고 그냥 document에 있는 조회수 값을 읽어서 증가시켜서 저장해버린다면 동시에 그 글을 5명이 읽었더라도 조회수가 5가 되지 않고 조회수가 1이 될 수 있습니다. `$inc` 를 사용하면 그런 race condition 에 놓이지 않고 조회수가 5가 되게 됩니다. ## 확장성 MongoDB의 read throughput (읽기 능력)은 replication을 통해 확장 가능하고 write throughput (쓰기 능력)은 sharding을 통해 확장 가능합니다. MongoDB 공식 설명: [Replication](http://docs.mongodb.org/manual/core/replication-introduction/), [Sharding](https://docs.mongodb.com/manual/sharding/) ## 설치 개발 환경을 갖출 때 그냥 DB 하나 돌리는 것은 일단 매우 간단합니다. [MongoDB 다운로드](http://www.mongodb.org/downloads) 에서 OS에 맞는 MongoDB를 다운 받은 다음 `mongod` 만 실행 시키면 끝입니다. 혹시 실행이 안되고 에러 메시지가 나온다면… 읽어보세요. 아마 Mac OS X / Linux의 경우 `/data/db` Windows의 경우 `c:\data\db` 이런 디렉토리가 없어서 나는 에러가 대부분일 겁니다. 그런 경우에는 간단히 저 디렉토리를 만들어주고 다시 mongod를 실행해보면 됩니다 ^_^ 뭐 좀 해볼까요? MongoDB를 설치할 때 같이 들어있는 mongo를 실행하면 Mongo Shell이 열립니다. 실제로 뭔가를 만들면서 MongoDB를 연동하면 언어에 따라 문법이나 그런것이 다를 수 있는데 보통 이 Mongo Shell 에서 작동하는 명령어랑 비슷하게 사용가능합니다. ``` $ mongo > use hello ``` 이렇게 먼저 mongo shell을 실행하고 `use hello`를 통해 hello 데이터베이스를 사용하도록 합니다. ## 입력 ``` > db.messages.insert({ name: "guest", message: "hello world" }); > db.messages.insert({ name: "stranger", message: "hello world2" }); > db.messages.insert({ name: "stranger", message: "hello world3" }); ``` 이렇게 3개의 데이터를 `messages` collection에 저장합니다. ## 조회 `> db.messages.find()` find 명령어를 통해 messages에 있는 document를 볼 수 있습니다. (좀더 이쁘게 보고 싶으면 끝에 `.pretty()` 를 붙여보세요 ) ## 수정 `> db.messages.update({ name: "guest" }, { $set: { message: "bye bye" } });` update 명령을 사용해서 첫번째 document의 메시지를 `bye bye`로 수정합니다. ## 삭제 `> db.messages.remove({ name: "stranger" });` remove 명령을 사용해서 name이 stranger인 모든 document를 삭제합니다. <br> `> db.messages.find();` 이제 이렇게 명령을 내리면 지금은 name이 `guest` 이면서 message가 `bye bye`인 document 하나만 보이겠죠? ## 실제로 사용하는 곳 실제로 서비스 하는 곳은 무지 많겠지만 큰 규모로 사용하고 있다고 알려진 유명사례는 여행예약 사이트 [Expedia](https://www.expedia.com), 위치기반 SNS [Foursquare](https://foursquare.com)와 미국 지역생활 정보 사이트 [Craigslist](http://www.craigslist.org) 입니다.    이 외에도 [성공적으로 MongoDB를 사용하고 있는 곳](http://www.mongodb.com/customers) 들이 많이 있습니다. ## 정리 대략적인 MongoDB에 대한 설명과 Mongo Shell에서 MongoDB가 동작하는 간단한 예제를 보는 그런 내용이었습니다. 스키마도 자유롭고 확장성도 뛰어난 매력적인 데이터베이스에요 ㅎㅎ
author | inspiredjw |
---|---|
permlink | nosql-mongodb |
category | kr |
json_metadata | {"tags":["kr","kr-dev","technology","kr-newbie"],"image":["https://steemitimages.com/DQmRutjFG7gkxkUanfrbC6wnrLGcaVRgcjDEpFHp711v2Bx/image.png","https://steemitimages.com/DQmQNV7u8aeoizneb1skWvfjN4Tt138NsqzgBoeDD6u7pex/image.png","https://steemitimages.com/DQmejdmHE4YqTceCv5JxJ3Neg7NEhbtVd9gyteabfjpRZj9/image.png","https://steemitimages.com/DQmXk5wGYXfvKG2Tk1ieRkFjyoFTGVqzoeTWCzg9jftwTLp/image.png","https://steemitimages.com/DQmVxsdk4Dv1FToapfigmmwmeEsCekQwZFP1Kr5xrseGmd2/image.png"],"links":["http://docs.mongodb.org/manual/core/replication-introduction/","https://docs.mongodb.com/manual/sharding/","http://www.mongodb.org/downloads","https://www.expedia.com","https://foursquare.com","http://www.craigslist.org","http://www.mongodb.com/customers"],"app":"steemit/0.1","format":"markdown"} |
created | 2017-06-28 02:41:09 |
last_update | 2017-06-28 02:41:09 |
depth | 0 |
children | 4 |
last_payout | 2017-07-05 02:41:09 |
cashout_time | 1969-12-31 23:59:59 |
total_payout_value | 13.287 HBD |
curator_payout_value | 4.291 HBD |
pending_payout_value | 0.000 HBD |
promoted | 0.000 HBD |
body_length | 4,156 |
author_reputation | 836,711,962,277 |
root_title | "인기 NoSQL 데이터베이스 MongoDB에 대해 알아보자" |
beneficiaries | [] |
max_accepted_payout | 1,000,000.000 HBD |
percent_hbd | 0 |
post_id | 6,420,516 |
net_rshares | 2,038,127,207,489 |
author_curate_reward | "" |
voter | weight | wgt% | rshares | pct | time |
---|---|---|---|---|---|
ubg | 0 | 723,359,113 | 1% | ||
kdj | 0 | 454,317,959,612 | 50% | ||
ioc | 0 | 859,871,353,603 | 15% | ||
agile | 0 | 2,729,976,759 | 100% | ||
iamstevechang | 0 | 66,016,751,154 | 100% | ||
coinkorea | 0 | 650,199,755,585 | 5% | ||
heejin | 0 | 2,439,892,413 | 100% | ||
inspiredjw | 0 | 841,566,560 | 100% | ||
deathnote9 | 0 | 986,592,690 | 100% |
RDMS보다 mongoDB가 사용하기가 더 편리한거 같습니다. 좋은정보 감사드려요^^
author | deathnote9 |
---|---|
permlink | re-inspiredjw-nosql-mongodb-20170629t003231274z |
category | kr |
json_metadata | {"tags":["kr"],"app":"steemit/0.1"} |
created | 2017-06-29 00:32:33 |
last_update | 2017-06-29 00:32:33 |
depth | 1 |
children | 1 |
last_payout | 2017-07-06 00:32:33 |
cashout_time | 1969-12-31 23:59:59 |
total_payout_value | 0.000 HBD |
curator_payout_value | 0.000 HBD |
pending_payout_value | 0.000 HBD |
promoted | 0.000 HBD |
body_length | 47 |
author_reputation | 94,070,047,675 |
root_title | "인기 NoSQL 데이터베이스 MongoDB에 대해 알아보자" |
beneficiaries | [] |
max_accepted_payout | 1,000,000.000 HBD |
percent_hbd | 10,000 |
post_id | 6,552,822 |
net_rshares | 0 |
대부분의 경우에는 훨씬 유연하고 좋지만 transaction이 꼭 필요하시다면 RDBMS를 더 추천드려요~
author | inspiredjw |
---|---|
permlink | re-deathnote9-re-inspiredjw-nosql-mongodb-20170629t025810592z |
category | kr |
json_metadata | {"tags":["kr"],"app":"steemit/0.1"} |
created | 2017-06-29 02:58:12 |
last_update | 2017-06-29 02:58:12 |
depth | 2 |
children | 0 |
last_payout | 2017-07-06 02:58:12 |
cashout_time | 1969-12-31 23:59:59 |
total_payout_value | 0.000 HBD |
curator_payout_value | 0.000 HBD |
pending_payout_value | 0.000 HBD |
promoted | 0.000 HBD |
body_length | 59 |
author_reputation | 836,711,962,277 |
root_title | "인기 NoSQL 데이터베이스 MongoDB에 대해 알아보자" |
beneficiaries | [] |
max_accepted_payout | 1,000,000.000 HBD |
percent_hbd | 10,000 |
post_id | 6,566,060 |
net_rshares | 1,944,691,666 |
author_curate_reward | "" |
voter | weight | wgt% | rshares | pct | time |
---|---|---|---|---|---|
vocal | 0 | 1,944,691,666 | 100% | ||
inspiredjw | 0 | 0 | 0% |
저도 MongoDB를 사용해봤는데요. 확실히 코딩은 RDB보다 편합니다. 하지만 관리는 헬입니다. 특히 백업이 어려웠습니다. 그리고 지금까지 몇가지 서비스를 구현하고 운영해본 결과 서비스 초창기에는 RDB로 구현하는게 여러모로 이득인 것 같습니다. NoSQL이 필요할만큼의 트래픽이 나오지 않으니까요. 아직까지는 RDB가 관리도 더 편하고 안정화된 툴이나 서비스가 많은 것 같습니다.
author | heejin |
---|---|
permlink | re-inspiredjw-nosql-mongodb-20170701t143658311z |
category | kr |
json_metadata | {"tags":["kr"],"app":"steemit/0.1"} |
created | 2017-07-01 14:37:00 |
last_update | 2017-07-01 14:37:00 |
depth | 1 |
children | 0 |
last_payout | 2017-07-08 14:37:00 |
cashout_time | 1969-12-31 23:59:59 |
total_payout_value | 0.000 HBD |
curator_payout_value | 0.000 HBD |
pending_payout_value | 0.000 HBD |
promoted | 0.000 HBD |
body_length | 214 |
author_reputation | 1,394,759,212,855 |
root_title | "인기 NoSQL 데이터베이스 MongoDB에 대해 알아보자" |
beneficiaries | [] |
max_accepted_payout | 1,000,000.000 HBD |
percent_hbd | 10,000 |
post_id | 6,897,488 |
net_rshares | 0 |
Congratulations @inspiredjw! You have completed some achievement on Steemit and have been rewarded with new badge(s) : [](http://steemitboard.com/@inspiredjw) Award for the number of posts published Click on any badge to view your own Board of Honnor on SteemitBoard. For more information about SteemitBoard, click [here](https://steemit.com/@steemitboard) If you no longer want to receive notifications, reply to this comment with the word `STOP` By upvoting this notification, you can help all Steemit users. Learn how [here](https://steemit.com/steemitboard/@steemitboard/http-i-cubeupload-com-7ciqeo-png)!
author | steemitboard |
---|---|
permlink | steemitboard-notify-inspiredjw-20170629t084111000z |
category | kr |
json_metadata | {"image":["https://steemitboard.com/img/notifications.png"]} |
created | 2017-06-29 08:41:09 |
last_update | 2017-06-29 08:41:09 |
depth | 1 |
children | 0 |
last_payout | 2017-07-06 08:41:09 |
cashout_time | 1969-12-31 23:59:59 |
total_payout_value | 0.000 HBD |
curator_payout_value | 0.000 HBD |
pending_payout_value | 0.000 HBD |
promoted | 0.000 HBD |
body_length | 697 |
author_reputation | 38,975,615,169,260 |
root_title | "인기 NoSQL 데이터베이스 MongoDB에 대해 알아보자" |
beneficiaries | [] |
max_accepted_payout | 1,000,000.000 HBD |
percent_hbd | 10,000 |
post_id | 6,595,223 |
net_rshares | 0 |