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

inspiredjw(51)
Published in
#kr
Words
545
Reading
3 min
Listen
Play
9y

지금은 No-SQL 소녀 시대!

mongodb

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

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

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

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

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

CAP 이론

유명한 CAP 이론을 살펴보면

cap-theory

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 하나만 보이겠죠?

실제로 사용하는 곳

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

expedia
foursquare
craigslist

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

정리

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

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