개발자 9Diin의 개발일기

MongoDB란 무엇인가? 본문

2021-2023

MongoDB란 무엇인가?

9Diin 2022. 4. 18. 12:21
반응형
이 포스팅은 '주홍철'님의 실시간 모니터링 시스템을 만들며 정복하는 MEVN 도서를 참고하여 작성하였습니다.

MongoDB란 무엇인가?

MongoDB란 NoSQL 데이터베이스이다. "세상에 SQL만 있는 것이 아니다."라는 의미를 담고 있다고 한다. 엄청난 포부 같은데, 과거 SQL로만 데이터베이스 작업을 했던 과거와는 달리 이제는 SQL을 쓰지 않고도, 데이터베이스에 작업을 진행할 수 있다.

 

(사실, 이제 막 개발 경력 7개월 차에 들어선 나는 프런트엔드 개발도, 백엔드 개발도 제대로 알지 못한다. 처음부터 끝까지 참여한 프로젝트가 한 번도 없어서 사실 내가 지금 회사에서 무엇을 하는지 모를 정도이지만, 그래도 한 가지 다행인 건(?) 회사에서 공부할 수 있는 기회를 준다는 점이다.  그래서 한 프로젝트의 흐름이라도 알기 위해 이직을 위한 포트폴리오도 만들어보기 위해 백엔드 지식 아주 조금이라도 살펴보기로 했다.)

 

MongoDB는 유연한 관리가 가능하고, 데이터에 대한 견고한 스키마 설계가 불가능한 경우에 선택하곤 한다고 한다. 필자는 MongoDB를 처음 사용해봐서 이 부분이 정확히 어떤 의미인지는 모르겠다.


MongoDB와 BSON

MongoDB는 JSON 매개변수를 받아 Binary JSON 형태(BSON)로 저장된다. 그리고 데이터를 삽입, 조회, 수정하는 쿼리가 모두 JSON 형태로 할 수 있기 때문에 개발자는 SQL이라는 것도 모른 채 JSON만 잘 다룰 줄 알면 쿼리를 쉽게 보낼 수 있는 장점이 있다. 실제 사용해보니 정말 그렇다. 공부를 하다 보니 한 가지 궁금한 게 생겼다. MongoDB의 아키텍처는 어떠한 구조일까? 어떤 아키텍처를 가지고 있을까?

 

MongoDB는 쿼리 언어(Query Language)

MongoDB는 C, C++, Go, Java, JavaScript 등 수많은 언어로 쿼리를 보낼 수 있다. 그중 Node.js에서 MongoDB에 접근하는 데 사용하는 모듈에는 Mongoose와 MongoDB 드라이버 2개가 있다. MongoDB에 쿼리라는 요청을 통해 원하는 데이터의 수정, 조회, 작업 등을 할 수 있다.

 

MongoDB Data Model

기존 RDBMS에서는 데이터베이스 - 테이블 - 데이터로 계층화되어 있다. 반면, MongoDB에서는 데이터 베이스 - 컬렉션 - 도큐먼트로 계층화되어 있다. 필자는 RDBMS가 정확히 뭔지도 모르지만, 어떤 구조로 계층화되어 있는지 알아보지 않아 디테일하게 설명할 순 없지만, MongoDB는 Roto 3T MongoDB Studio를 사용해보면서 확인해보니 정말 그랬다. 흔히 데이터(data)라고 하는 것을 MongoDB에서는 도큐먼트(Document)라고 한다. RDBMS의 row와 같은 개념이다. 그리고 BSON으로 저장되며 유연하게 저장할 수 있다. 그리고 데이터 스키마는 그래프, key-value, 테이블 형태든 뭐든 쉽게 저장하고 데이터를 결합해서 쓸 수 있다.

 

* RDBMS(Relational database management system) : 관계형 데이터베이스 관리 시스템

 

MongoDB Storage Enginees

스토리지 엔진은 데이터 서버의 디스크에서 사용자가 요청한 데이터를 어떻게 가져오고 어떻게 저장할지 결정한다. ver3.2 이상부터 기본 값으로 설정되는 wiredTiger 엔진, In-Memory 등이 있는데, 이를 선택해 쓸 수 있다고 한다. wiredTiger 엔진은 LSM Tree(로그 기반 병합 트리)를 이용하여 읽기 성능을 포기하고 그만큼 저장 성능을 향상하고 느린 읽기 성능을 보완하기 위해 블룸필터를 사용한 엔진이다.


MongoDB 특징 10가지

1. key와 value 형태의 도큐먼트
MongoDB 내의 도큐먼트는 key-value 형태로 이루어지며, _id라는 고유한 아이디를 가진다.
그리고 DB에 저장될 때, key의 길이도 내용으로 들어간다. 또한 MongoDB는 JSON 형태로 쿼리를 만들고 JSON을 매개변수로 받아 BSON 형태로 DB에 삽입, 추출하는 것이 가능하다. 그래서 type 변환이 일어나지 않으며, 이를 통해 JSON 데이터를 주고받을 때 성능면에서 더 좋은 선택이 된다.

2. 스키마 없이 삽입 가능
MongoDB는 RDBMS와 달리 스키마 없이 데이터 모델을 구현하지 않은 채 유동적으로 데이터를 삽입할 수 있다. 스키마란, 데이터베이스를 구성하는 속성, 관계 등 데이터 값이 갖는 type을 명시해놓은 것을 말한다. 이를 통해 다양한 서비스로부터 데이터를 유동적으로 쌓을 수 있는 장점을 갖게 된다.

3. 데이터의 조합 함수 지원
MongoDB는 min, max, aggrregate, mapReduce 등 강력한 함수로 데이터를 추출하고 조합해서 압축된 결괏값을 만들어낼 수 있다.

4. 이중화 지원과 샤딩
서버는 멈추면 안 된다. 그래서 운영서버의 경우 서버 이중화를 한다.

이때 MongoDB는 ReplicaSet을 이용해 이중화를 가능하게 한다.

또한 데이터의 양이 많은 경우 샤딩을 통해 collection을 분할해 관리할 수 있다.

5. JSON 형태의 Data
MongoDB는 BSON 형태로 저장되며 JSON 형태의 값으로 추출해낼 수 있다.
또한 JSON Object를 매개변수로 받아 쉽게 저장할 수 있다.

6. 2차원 좌표 인덱싱
MongoDB는 geoSpartial이란 인덱스를 써서 2차원 좌표를 인덱싱 할 수 있다.

7. collection join
MongoDB는 $lookup을 통한 collection join이 가능하다.

8. 프라이머리 키, Object Id
MongoDB의 각 도큐먼트는 _id라는 고유한 키를 갖는 특징이 있다.
각 도큐먼트를 생성하면 _id라는 primary key가 생성된다.
이후 인덱스로 설정되는 키값은 secondary key로 저장된다. 이 키는 12byte 이하로 구성된다.

9. B-tree를 적용한 인덱싱
무언가를 찾고자 할 때 사용되는 것이 인덱싱이다.
인덱싱이 있어야 빠르게 데이터를 찾을 수 있다. 인덱스의 기본 정렬은 항상 오름차순으로 구현되지만 데이터를 추출할 때 또는 인덱스를 초기에 설정할 때는 오름차순이나 내림차순으로 변경할 수 있다. 인덱스는 B-tree로 구성되어 있고, 앞서 설명한 2차원 좌표 인덱싱의 경우 R-tree로 구성되어 있다.

10. 서버 메모리 50% 차지
트랜잭션에서 설명한 MongoDB의 Buffer Pool이 서버 메모리를 약 50% 차지한다. 서버를 구축할 때는 꼭 이런 점을 고려해야 한다. 즉, 서버 하나에 MongoDB 서버를 2개 이상 설치한다면 메모리 부족 현상이 일어나 MongoDB 서버가 예기치 않게 종료될 수 있다.

반응형