[MongoDB] 강좌 1편: 소개, 설치 및 데이터 모델링


소개

MongoDB는 C++로 작성된 오픈소스 문서지향(Document-Oriented) 적 Cross-platform 데이터베이스이며, 뛰어난 확장성과 성능을 자랑합니다. 또한, 현존하는 NoSQL 데이터베이스 중 인지도 1위를 유지하고있습니다.

NoSQL?

흔히 NoSQL이라고 해서 아, SQL이 없는 데이터베이스구나! 라고 생각 할 수도 있겠지만, 진짜 의미는 Not Only SQL 입니다. 기존의 RDBMS의 한계를 극복하기 위해 만들어진 새로운 형태의 데이터저장소 입니다. 관계형 DB가 아니므로, RDMS처럼 고정된 스키마 및 JOIN 이 존재하지 않습니다.

Document?

Document Oriented 데이터베이스라는데..  여기서 말하는 Document가 뭘까요? 문서? 이게 그냥 ‘문서’ 로 번역해버리면 조금은 애매합니다. 문서라고 하면 보통 워드/엑셀에 사용되는 그런 문서가 떠오르는데요, 그것과는 다릅니다. Document는 RDMS의 record 와 비슷한 개념인데요, 이의 데이터 구조는 한개이상의 key-value pair 으로 이뤄져있습니다. MongoDB 샘플 Document를 확인 해 볼까요?

{
    "_id": ObjectId("5099803df3f4948bd2f98391"),
    "username": "velopert",
    "name": { first: "M.J.", last: "Kim" }
}

여기서 _id, username, name 은 key 이고 그 오른쪽에 있는 값들은 value 입니다.

_id 는 12bytes의 hexadecimal 값으로서, 각 document의 유일함(uniqueness)을 제공합니다.
이 값의 첫 4bytes 는현재 timestamp, 다음 3bytes는 machine id, 다음 2bytes는 MongoDB 서버의 프로세스id, 마지막 3bytes는 순차번호입니다 추가될때마다 값이 높아진다는거지요.

Document는 동적(dynamic)의 schema 를 갖고있습니다. 같은 Collection 안에 있는 Document 끼리 다른 schema 를 갖고 있을 수 있는데요, 쉽게 말하면 서로 다른 데이터 (즉 다른 key) 들을 가지고 있을 수 있습니다.

Collection?

Collection은 MongoDB Document의 그룹입니다. Document들이 Collection내부에 위치하고 있습니다. RDMS의 table과 비슷한 개념입니다만 RDMS와 달리 schema를 따로 가지고 있지않습니다. Document 부분설명에 나와있듯이 각 Document들이 동적인 schema를 가지고 있으니까요

Database?

Database는 Collection들의 물리적인 컨테이너입니다. 각 Database는 파일시스템에 여러파일들로 저장됩니다.

 

RDMS와의 비교

RDMS 라는 키워드가 생소하신분들을 위하여 먼저 이에 대한 간단한 설명을 드리겠습니다. Relational Database Management System (관계형 데이터베이스 관리 시스템) 은 행과  열로 된 2차원의 table로 데이터를 관리하는 데이터베이스 시스템입니다. Mysql, Oracle Database, DB2 등 시스템들이 RDMS에 속하죠.

RDBMS MongoDB
Database Database
Table Collection
Tuple / Row Document
Column Key / Field
Table Join Embedded Documents
Primary Key Primary Key (_id)
Database Server & Client
mysqld mongod
mysql mongo

 

장점

  • Schema-less (Schema가 없다. 같은 Collection 안에 있을지라도 다른 Schema를 가지고 있을 수 있다)
  • 각 객체의 구조가 뚜렷하다
  • 복잡한 JOIN 이 없다.
  • Deep Query ability (문서지향적 Query Language 를 사용하여 SQL 만큼 강력한 Query 성능을 제공한다.
  • 어플리케이션에서 사용되는 객체를 데이터베이스에 추가 할 때 Conversion / Mapping이 불필요하다.

MongoDB 설치

윈도우

MongoDB 공식 홈페이지의 다운로드 페이지에서 MSI 파일로 설치하면
C:\Program Files\MongoDB\Server\3.2\bin\ 에 설치됩니다.

CMD 창을 열어서 디렉토리로 들어가 mongod 를 실행하면 서버가 실행됩니다.
기본 데이터베이스 디렉토리가 C:\data\db 이므로 실행 전에 폴더를 수동으로 만들어주셔야합니다.

Microsoft Windows [Version 10.0.10586]
(c) 2015 Microsoft Corporation. All rights reserved.

C:\Users\Velopert>cd C:\Program Files\MongoDB\Server\3.2\bin

C:\Program Files\MongoDB\Server\3.2\bin>mkdir C:\data\db

C:\Program Files\MongoDB\Server\3.2\bin>mongod

데이터베이스 디렉토리를 변경하고싶다면 다음과같이 실행하면 됩니다.

C:\Program Files\MongoDB\Server\3.2\bin> mongod --dbpath "c:\custom_folder"

매번 MongoDB 설치 경로로 이동하는게 귀찮다면, 해당 디렉토리를 환경변수의 PATH 에 추가하세요.
(윈도우 10 이하 버전에서는
기존 값 ; C:\Program Files\MongoDB\Server\3.2\bin 이런식으로 수정해야합니다.)

Untitled-3

리눅스

이 포스트에서는 Ubuntu 에서 MongoDB 설치하는 과정을 살펴보도록하겠습니다.
다른 리눅스 디스트로를 사용하시는분들은 https://docs.mongodb.org/manual/installation/ 을 참조해주세요.

주의: Cloud9 를 사용하신다면 1번과 2번은 생략하셔도 됩니다.

 1. MongoDB Pulbic GPG Key 등록 

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927

2. MongoDB 를 위한 list file 생성 (자신의 Ubuntu 버전에 맞게 입력하세요)

# Ubuntu 12.04
$ echo "deb http://repo.mongodb.org/apt/ubuntu precise/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list

# Ubuntu 14.04
$ echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list

3. apt-get 을 이용하여 설치

$ sudo apt-get update

# latest stable version 설치
$ sudo apt-get install -y mongodb-org

4. 서버 실행

$ sudo service mongod start
# 서버가 제대로 실행됐는지 확인
$ cat /var/log/mongodb/mongod.log
# [initandlisten] waiting for connections on port <port>

기본 포트는 27017 이며, 방화벽을 사용하시는분들은 해당 포트를 Open 해주세요.
포트는 /etc/mongod.conf 에서 변경 가능합니다.

OS X

brew update
brew install mongodb

mkdir -p /data/db
mongod
# dbpath 지정
mongod --path <path>

자세한 내용: https://docs.mongodb.org/manual/tutorial/install-mongodb-on-os-x/

 

MongoDB 서버 접속

터미널에서 mongo 를 입력하세요.
(윈도우에서는 환경변수를 설정하지 않았다면 설치 경로에 이동 후 입력하세요)

$ mongo
MongoDB shell version: 3.2.1
connecting to: test
>

 

Data Modelling

MongoDB에서의 명령어들을 배우기전에, MongoDB에서 데이터를 모델링의 기본을 배워보겠습니다.

schema 디자인 할 때 고려사항

  • 사용자 요구 (User Requirement) 에 따라 schema를 디자인한다.
  • 객체들을 함께사용하게 된다면 한 Document에 합쳐서 사용한다. (예: 게시물-덧글 과의 관계)
    그렇지 않으면 따로 사용한다 (그리고 join 을 사용하지 않는걸 확실히 해둔다)
  • 읽을때 join 하는게아니라 데이터를 작성 할 때 join 한다.

예제

간단한 블로그를 위한 데이터베이스를 디자인한다고 가정해봅시다. 요구사항을 나열해볼까요?

– 게시글에는 작성자 이름, 제목, 내용이 담겨져있다.
– 각 게시글은 0개 이상의 태그를 가지고 있을 수 있다.
– 게시글엔 덧글을 달 수 있다. 덧글은 작성자 이름, 내용, 작성시간을 담고있다.

만약에 RDMS에서 데이터베이스 schema를 디자인한다면 이것과 비슷하겠죠?

d

RDMS라면,이런식으로 테이블 3개를 만들어야 효율적이라고 부르지만,
NoSQL 에선 모든걸 하나의 Document 에 넣습니다. 한번 살펴볼까요?

{
 _id: POST_ID,
 title: POST_TITLE,
 content: POST_CONTENT,
 username: POST_WRITER,
 tags: [ TAG1, TAG2, TAG3 ],
 time: POST_TIME
 comments: [
 { 
 username: COMMENT_WRITER,
 mesage: COMMENT_MESSAGE,
 time: COMMENT_TIME
 },
 { 
 username: COMMENT_WRITER,
 mesage: COMMENT_MESSAGE,
 time: COMMENT_TIME
 }
 ]
}

어때요, 어느정도 이해가 갔나요?

다음 강좌에선 데이터베이스를 서버에서 직접 다뤄보도록 하겠습니다.

  • Pyunghwa Seo

    windows8.1 환경에서 mongodb 설치하면 자동으로 서비스 등록이 안되서 환경변수 설정 외에도
    mongodb 설치된 폴더 bin에서 cmd 창 열고 “mongod –install –serviceName MongoDB –serviceDisplayName MongoDB –dbpath [DB저장폴더] –logpath [로그저장 txt파일]” 실행해야 되네요.
    http://dalkomit.com/60 <– 참고했습니다 ㅎㅎ

    • 서비스는 컴퓨터 시작시 자동으로 실행하고 싶을때 설정하시면 됩니다. 만약에 단순 서버실행만 하시는경우에는 dbpath 만 명시해주시거나 db디렉토리를 만드시면 실행될거예요 ㅎㅎ

      • Pyunghwa Seo

        제가 착각했었네요ㅎㅎ
        환경변수에 추가하는건 CMD 창에서 mongoDB 명령어 사용하기 위해 하는거고
        서비스 등록은 CMD에 따로 mongod 명령어 쓰지 않고 서버를 자동으로 실행시키기 위해 하는거네여..

  • Jeehoon Yoo

    튜토리얼 감사합니다 🙂
    올려주신 것 보고 MAC에서 따라해보고 있습니다.

    그런데, DB path 정하는 부분에서 option이 잘 못 된 것 같습니다:
    mongod –path

    이렇게 변경해야 실행이 됩니다:
    mongod –dbpath

  • jb Kim

    Server has startup warnings:
    2017-03-28T23:42:01.776+0900 I STORAGE [initandlisten]
    2017-03-28T23:42:01.776+0900 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
    2017-03-28T23:42:01.776+0900 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem
    2017-03-28T23:42:01.877+0900 I CONTROL [initandlisten]
    2017-03-28T23:42:01.877+0900 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
    2017-03-28T23:42:01.877+0900 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
    2017-03-28T23:42:01.877+0900 I CONTROL [initandlisten]
    2017-03-28T23:42:01.877+0900 I CONTROL [initandlisten]
    2017-03-28T23:42:01.877+0900 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is ‘always’.
    2017-03-28T23:42:01.877+0900 I CONTROL [initandlisten] ** We suggest setting it to ‘never’
    2017-03-28T23:42:01.877+0900 I CONTROL [initandlisten]

    mongodb를 설치하고 실행하면 위와 같은 경고문을 출력하는데, 기본 설정값들을 바꾸기를 원하는 건가요??ㅠ

  • 정승욱

    잘봤습니다.

  • 허수정

    좋은 정보 감사합니다 !

  • 쳐부수자

    MongoDB 서버 접속 부분에서
    $ mongod
    $ mongo
    이렇게 했는데 접속이 안돼서 검색 좀 해보니
    $ mongod
    다음에 새 터미널을 열고
    $ mongo
    이렇게 하니까 되네요…그런데 원래 하나의 터미널에서 접속이 돼야하는건가요?아니면 이게 맞는 방법인가요?