Programming/Database

NoSQL mongoDB란? (+ macOS mongoDB 설치 명령어)

Jan92 2021. 11. 29. 00:07

mongoDB

 

- NoSQL

 

SQL이 없다는 의미의 No가 아닌 'Not Only SQL'라는 의미로 기존 RDBMS(관계형 데이터베이스)의 한계를 극복하기 위해 만들어진 새로운 형태의 데이터베이스입니다.

빅데이터를 다룰 때 RDBMS만으로 트래픽을 감당하기 어려워져서 이를 해결하기 위해 만들어진 것으로 NoSQL은 더 유연한 방법을 통해 데이터를 관리하는 방식으로 소프트웨어 개발에 혁신으로도 불립니다.

NoSQL을 사용하는 곳 중 잘 알려진 회사로는 여행 예약 사이트인 Expedia가 있습니다.

 

* RDBMS(Relational Database Management System) 관계형 데이터베이스 관리 시스템

행과 열로 된 2차원의 Table로 데이터를 관리하는 시스템으로 Oracle, Mysql, MariaDB 등이 속합니다.

 

 

 

 

 

출처 DB-Engines Ranking

 

- MongoDB

 

몽고DB는 C++로 작성된 오픈소스이며, 문서 지향(Document-Oriented)적 Cross-platform 데이터베이스입니다.

위 DB-Engines Ranking에서 볼 수 있는 것처럼 NoSQL 데이터베이스 중 가장 많이 사용되고 있는 솔루션입니다.

 

 

MongoDB, RDBMS 구조

 

아래 내용의 이해를 돕기 위해 MongoDB와 RDBMS의 구조 차이를 먼저 보겠습니다. 구조적인 관점에서 기존 RDBMS에서의 Table이 여기서는 Collection이 됩니다. 또한 Row는 Document가 되고, Column은 Field가 됩니다.

 

 

 

 

- MongoDB의 특징 '스키마 리스'

 

MongoDB의 주요 특징으로는 먼저 '스키마 리스(schema-less)'가 있는데요.

테이블의 열과 행에 정해진 형식에 맞는 데이터만 넣을 수 있는 관계형 데이터베이스와 다르게 Document 저장소인 MongoDB는 비구조적인 형식의 Collection과 Document에 정보를 저장합니다.

 

{
  "_id": "5bf0a29cafd5026591b0ca6b",
  "name": "Jan",
  "address": {
    "street": "Trase Bay",
    "city": "Big Sur",
    "state": "AP",
    "zip": "12345"
  },
  "type": "Normal"
}

 

*

예시를 통해 조금 더 살펴보면 몽고DB 인스턴스(Collection 및 Document)는 'key - value'의 집합 형식으로 자바스크립트와 같은 코드의 객체와 매우 비슷합니다.

중요한 점은 데이터의 구조가 사전에 정의되지 않고, 저장되는 데이터에 적합하도록 유연하게 변경된다는 것인데요. 이러한 특징 때문에 MongoDB와 같은 NoSQL 데이터베이스를 사용하는 코딩은 관계형 데이터베이스를 사용하는 코딩에 비해 더 쉽고 유연하게 데이터를 처리할 수 있습니다.

 

위 예시의 JSON과 같은 동적 스키마형 Document를 MongoDB에서는 BSON(Binary JSON)이라고 부릅니다.

 

 

*

추가로 하나 살펴보고 갈 부분은 BSON의 첫 번째 field로 '_id'가 있는데요. 

이 '_id' 필드는 관계형 데이터베이스에서 사용되는 기본 키(primary key)라는 개념과 같은 역할을 합니다. 개발자가 Document를 만들 때 '_id'를 제공하지 않으면 몽고DB 엔진이 UUID를 자동으로 생성합니다. 해당 필드는 기본 키와 마찬가지로 자동으로 인덱싱 되며, 고유한 값을 가집니다.

 

'_id'는 12 bytes의 hexadecimal 값으로 각 document의 유일함(uniqueness)을 제공합니다. 이 값의 첫 4 bytes는 현재 Unix Timestamp 정보를 담고 있고, 다음 3 bytes는 machine id, 다음 2bytes는 MongoDB 서버의 프로세스 id, 마지막 3bytes는 순차 번호(auto increment) 값을 가지게 됩니다.

 

 

*

schema-less라는 특징에서 이어지는 문서 지향 구조가 갖는 장점으로는 Document를 중첩할 수 있다는 것입니다. 위 BSON에서 볼 수 있는 것처럼 address에 대한 정보를 다른 테이블에 저장하는 데신 중첩된 Document를 통해 저장하고 이러한 데이터 형식으로 인해 무한에 가까운 확장성을 가질 수 있게 됩니다.

 

 

 

- 몽고DB의 단점

 

단점으로는 JOIN이 없습니다. 그렇기 때문에 데이터 구조 설계 시 join이 없도록 구조를 만들어야 합니다.

다른 단점으로는 Memory mapped file으로 파일 엔진 데이터베이스이기 때문에 메모리 관리를 OS에 위임하며, 메모리 크기가 성능을 좌우하는 등 메모리에 의존적입니다.

이처럼 MongoDB를 구성할 때 이슈가 되는 부분 중 하나가 메모리량과 디스크 성능인데요. 이러한 단점이 있지만, 컴퓨터의 성능은 점점 더 좋아지고 있고, 애플리케이션에서는 많은 양의 데이터들이 교환되고 있기 때문에 앞으로 NoSQL을 사용하는 곳이 많아질 가능성은 충분하다고 생각합니다.

 

 


 

 

- MacOS MongoDB 설치 명령어

 

mongoDB의 개념에 이어 macOS 에서 brew를 이용하여 mongoDB를 설치하는 명령어를 간단하게 알아보겠습니다.

(brew가 설치된 상태에서 진행되는 과정입니다.)

 

 

1. Tap the MongoDB Homebrew Tap

$ brew tap mongodb/brew

 

2. Install MongoDB

$ brew install mongodb-community

 

* 해당 과정을 통해 MongoDB를 설치하는 경우 Config, log, data 경로가 아래와 같이 생성되며 디폴트 값으로 지정됩니다.

/usr/local/etc/mongod.conf        // Config 파일
/usr/local/var/log/mongdb         // log 파일
/usr/local/var/mongodb            // 데이터 파일

 

3. Start And Stop

$ brew services start mongodb-community     // start

$ brew services stop mongodb-community      // stop

 

 

* 발생할 수 있는 오류

Catalina OS를 사용하신다면 해당 디렉터리가 없다는 메시지를 가진 문제가 발생할 수 있습니다. Catalina에서는 터미널을 이용하여 root 시스템에 폴더를 만들 수 없도록 설정되어 있기 때문에 usr 디렉터리에 데이터베이스 폴더를 별도로 만들어서 지정해주셔야 합니다.

(번거로우시겠지만 해당 오류에 대한 자세한 해결 방법은 다른 포스팅을 참고 부탁드리겠습니다.)