Inspired World

MongoDB에 대해 알아보자 본문

MongoDB

MongoDB에 대해 알아보자

InspiredJW 2014. 4. 12. 13:01

MongoDB





기존 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, Sharding


설치

개발 환경을 갖출 때 그냥 DB 하나 돌리는 것은 일단 매우 간단합니다.


MongoDB 다운로드 에서 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를 삭제합니다.


> db.messages.find();

이제 이렇게 명령을 내리면 지금은 name이 guest 이면서 message가 bye bye인 document 하나만 보이겠죠?



실제로 사용하는 곳


실제로 서비스 하는 곳은 무지 많겠지만 큰 규모로 사용하고 있다고 알려진 유명사례는 위치기반 SNS Foursquare와 미국 지역생활 정보 사이트 Craigslist 입니다.






이 외에도 성공적으로 MongoDB를 사용하고 있는 곳 들이 많이 있습니다.


정리

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


스키마도 자유롭고 확장성도 뛰어난 매력적인 데이터베이스에요 ㅎㅎ


나중에 Node.js + Mongoose 연동을 통해 Node.js에서 MongoDB를 사용하는 내용을 포스팅 하도록 하겠습니다.



Comments