create account

인기 NoSQL 데이터베이스 MongoDB에 대해 알아보자 by inspiredjw

View this thread on: hive.blogpeakd.comecency.com
· @inspiredjw ·
$17.58
인기 NoSQL 데이터베이스 MongoDB에 대해 알아보자
## 지금은 No-SQL ~~소녀~~ 시대!

![mongodb](https://steemitimages.com/DQmRutjFG7gkxkUanfrbC6wnrLGcaVRgcjDEpFHp711v2Bx/image.png)


기존 RDBMS인 MySQL, MS-SQL, Oracle, PostgreSQL 이 데이터베이스로써 많이 쓰이고 있습니다.

하지만 요즘처럼 실시간성이 중요시 되고 모바일 디바이스의 양이 급증함에 따라 더 빠르고, 확장성이 뛰어난 DB들이 필요로 해져서 NoSQL이라고 불리우는 데이터베이스들이 많이 생겨났습니다.

많은 데이터베이스들 중 딱히 “이 데이터베이스가 최고다!”” 하는 것은 없습니다.

왜냐면 모든 데이터베이스들은 마치 게임에서 주어진 한정된 포인트를 가지고 스탯을 찍는 것처럼 어떤 한 장점이 부각되면 다른 단점이 생기는 그런 구조입니다.

이런 걸 CAP 이론이라고 합니다.



## CAP 이론

유명한 CAP 이론을 살펴보면

![cap-theory](https://steemitimages.com/DQmQNV7u8aeoizneb1skWvfjN4Tt138NsqzgBoeDD6u7pex/image.png)

##### 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) 입니다.

![expedia](https://steemitimages.com/DQmejdmHE4YqTceCv5JxJ3Neg7NEhbtVd9gyteabfjpRZj9/image.png)
![foursquare](https://steemitimages.com/DQmXk5wGYXfvKG2Tk1ieRkFjyoFTGVqzoeTWCzg9jftwTLp/image.png)
![craigslist](https://steemitimages.com/DQmVxsdk4Dv1FToapfigmmwmeEsCekQwZFP1Kr5xrseGmd2/image.png)

이 외에도 [성공적으로 MongoDB를 사용하고 있는 곳](http://www.mongodb.com/customers) 들이 많이 있습니다.


## 정리

대략적인 MongoDB에 대한 설명과 Mongo Shell에서 MongoDB가 동작하는 간단한 예제를 보는 그런 내용이었습니다.

스키마도 자유롭고 확장성도 뛰어난 매력적인 데이터베이스에요 ㅎㅎ
👍  , , , , , , , ,
properties (23)
authorinspiredjw
permlinknosql-mongodb
categorykr
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"}
created2017-06-28 02:41:09
last_update2017-06-28 02:41:09
depth0
children4
last_payout2017-07-05 02:41:09
cashout_time1969-12-31 23:59:59
total_payout_value13.287 HBD
curator_payout_value4.291 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length4,156
author_reputation836,711,962,277
root_title"인기 NoSQL 데이터베이스 MongoDB에 대해 알아보자"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd0
post_id6,420,516
net_rshares2,038,127,207,489
author_curate_reward""
vote details (9)
@deathnote9 ·
RDMS보다 mongoDB가 사용하기가 더 편리한거 같습니다. 좋은정보 감사드려요^^
properties (22)
authordeathnote9
permlinkre-inspiredjw-nosql-mongodb-20170629t003231274z
categorykr
json_metadata{"tags":["kr"],"app":"steemit/0.1"}
created2017-06-29 00:32:33
last_update2017-06-29 00:32:33
depth1
children1
last_payout2017-07-06 00:32:33
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length47
author_reputation94,070,047,675
root_title"인기 NoSQL 데이터베이스 MongoDB에 대해 알아보자"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id6,552,822
net_rshares0
@inspiredjw ·
대부분의 경우에는 훨씬 유연하고 좋지만 transaction이 꼭 필요하시다면 RDBMS를 더 추천드려요~
👍  ,
properties (23)
authorinspiredjw
permlinkre-deathnote9-re-inspiredjw-nosql-mongodb-20170629t025810592z
categorykr
json_metadata{"tags":["kr"],"app":"steemit/0.1"}
created2017-06-29 02:58:12
last_update2017-06-29 02:58:12
depth2
children0
last_payout2017-07-06 02:58:12
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length59
author_reputation836,711,962,277
root_title"인기 NoSQL 데이터베이스 MongoDB에 대해 알아보자"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id6,566,060
net_rshares1,944,691,666
author_curate_reward""
vote details (2)
@heejin ·
저도 MongoDB를 사용해봤는데요. 확실히 코딩은 RDB보다 편합니다. 하지만 관리는 헬입니다. 특히 백업이 어려웠습니다.
그리고 지금까지 몇가지 서비스를 구현하고 운영해본 결과 서비스 초창기에는 RDB로 구현하는게 여러모로 이득인 것 같습니다. NoSQL이 필요할만큼의 트래픽이 나오지 않으니까요. 아직까지는 RDB가 관리도 더 편하고 안정화된 툴이나 서비스가 많은 것 같습니다.
properties (22)
authorheejin
permlinkre-inspiredjw-nosql-mongodb-20170701t143658311z
categorykr
json_metadata{"tags":["kr"],"app":"steemit/0.1"}
created2017-07-01 14:37:00
last_update2017-07-01 14:37:00
depth1
children0
last_payout2017-07-08 14:37:00
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length214
author_reputation1,394,759,212,855
root_title"인기 NoSQL 데이터베이스 MongoDB에 대해 알아보자"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id6,897,488
net_rshares0
@steemitboard ·
Congratulations @inspiredjw! You have completed some achievement on Steemit and have been rewarded with new badge(s) :

[![](https://steemitimages.com/70x80/http://steemitboard.com/notifications/posts.png)](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)!
properties (22)
authorsteemitboard
permlinksteemitboard-notify-inspiredjw-20170629t084111000z
categorykr
json_metadata{"image":["https://steemitboard.com/img/notifications.png"]}
created2017-06-29 08:41:09
last_update2017-06-29 08:41:09
depth1
children0
last_payout2017-07-06 08:41:09
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length697
author_reputation38,975,615,169,260
root_title"인기 NoSQL 데이터베이스 MongoDB에 대해 알아보자"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id6,595,223
net_rshares0