인기 NoSQL 데이터베이스 MongoDB에 대해 알아보자
지금은 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, 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 입니다.
이 외에도 성공적으로 MongoDB를 사용하고 있는 곳 들이 많이 있습니다.
정리
대략적인 MongoDB에 대한 설명과 Mongo Shell에서 MongoDB가 동작하는 간단한 예제를 보는 그런 내용이었습니다.
스키마도 자유롭고 확장성도 뛰어난 매력적인 데이터베이스에요 ㅎㅎ
RDMS보다 mongoDB가 사용하기가 더 편리한거 같습니다. 좋은정보 감사드려요^^
대부분의 경우에는 훨씬 유연하고 좋지만 transaction이 꼭 필요하시다면 RDBMS를 더 추천드려요~
Congratulations @inspiredjw! You have completed some achievement on Steemit and have been rewarded with new badge(s) :
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
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!
저도 MongoDB를 사용해봤는데요. 확실히 코딩은 RDB보다 편합니다. 하지만 관리는 헬입니다. 특히 백업이 어려웠습니다.
그리고 지금까지 몇가지 서비스를 구현하고 운영해본 결과 서비스 초창기에는 RDB로 구현하는게 여러모로 이득인 것 같습니다. NoSQL이 필요할만큼의 트래픽이 나오지 않으니까요. 아직까지는 RDB가 관리도 더 편하고 안정화된 툴이나 서비스가 많은 것 같습니다.