데이터 엔지니어링(Deep Dive)

NoSQL Database를 찾아보자 : MongoDB

직장인B 2025. 8. 10. 14:05

MongoDB 개요

 

MongoDB는 대표적인 NoSQL 데이터베이스이다. 2007년에 개발되었고, 이 서비스로 무려 나스닥 상장까지 했으니 그 파워풀함은 구구절절 설명할 것은 없겠다. 창업자들은 구글의 자회사 출신 개발자들이라고 하며, 기존의 RDBMS의 저조한 확장성을 보완할 데이터베이스로서 MongoDB를 개발했다고 한다. 여기서 말하는 확장성은 두 가지로 볼 수 있다. 

 

1️⃣ 데이터 용량이 급증하면서 더 확장된 저장 용량이 필요함. 

2️⃣ 서비스가 발전하면서 데이터의 스키마가 변해감.

 

RDBMS는 데이터 용량이 급증할 때 데이터베이스의 서버 용량을 높이는 Scale-up의 방식으로 대응해야하지만 MongoDB는 분산 저장을 하는 Scale-out의 방식으로 대응할 수 있다는 점, RDBMS는 기존 데이터의 스키마가 변경되면 컬럼을 추가하거나 테이블을 새로 생성하여 데이터를 Migration해야했지만 MongoDB는 스키마가 변해도 데이터베이스단의 수정 없이 그대로 저장이 가능하다는 점에서 RDBMS의 저조한 확장성을 보완했다고 할 수 있다. 

 

NoSQL의 유형

 

NoSQL에 대한 정의는 다양하다. 일반적으로 RDBMS의 공식을 따르지 않는 방식의 데이터베이스시스템을 모두 NoSQL이라고 부르는데, 이 NoSQL 영역에서도 일정한 유형을 나누어볼 수 있다. 

  • Document Oriented (문서 지향)
  • Key-Value 
  • Column Oriented (열 지향)
  • Graph 

이렇게 네 가지 유형이 대표적인데, MongoDB는 이 중 문서 지향 데이터베이스이다. MongoDB 이전에도 CouchDB와 같은 문서 지향 데이터베이스가 존재하긴 했지만 사실상 문서 지향 데이터베이스의 보편화와 발전을 이끈 것은 MongoDB라고 할 수 있다. 

 

문서 지향 데이터베이스란 데이터를 문서 단위로 저장한다는 것인데, 이에 대한 개념은 MongoDB의 저장 구조를 살펴보면 더 확실히 파악할 수 있다. 

 

MongoDB의 저장 구조 

 

1. 논리적 저장 구조

 

MongoDB에는 DB만 있고 Table이 없다. MongoDB는 데이터를 Json 형식으로 갖는데, Json 형식이라는 것 자체가 계층적인 key tree를 가지기 때문에 Column-Row 라는 2차원적 구조를 가진 Table이 있을 수 없는 것이다. 

 

MongoDB는 각 데이터 파일(Document)들을 묶은 Collection이라는 논리적 집합을 사용한다. 말하자면 이 Collection이 RDBMS의 테이블과 유사한 개념이라 할 수 있다. 

 

요약하자면, MongoDB는 DB 아래에 Collection이라는 문서 집합을 두고 이 집합 안에 개별 문서(Document, Json)를 저장하는 논리적 구조를 가진다.

 

2. 물리적 저장 구조

 

MongoDB에는 WiredTiger라는 스토리지엔진(+3v)이 있고, 이 엔진이 IO를 관리한다. Mysql에 InnoDB나 MyISAM라는 스토리지 엔진이 있는 것과 같다. (Oracle이나 Postgres는 스토리지 아키텍쳐를 가질 뿐 별도의 스토리지 엔진을 가지지 않는다.)

 

MongoDB의 물리적 저장구조를 이해하려면 다음의 사항들을 살펴보면 좋다. 

  • bson유형을 사용하여 데이터를 저장한다. bson이란 json문서의 이진 직렬화 형식이다. (https://bsonspec.org/spec.html)
  • 데이터를 파일형태로 두고 압축해서 이를 저장한다. 기본적으로는 parquet 압축과 같은 snappy를 쓰는데, 시계열 데이터의 경우 zstd 압축을 사용하기도 한다. zlib 압축도 가능하다. (WriedTiger 이전의 엔진이었던 MMAPv1은 압축이 안되었다.)
  • 저널링을 통해 각 쓰기 작업의 로그를 기록하고 이를 통해 데이터의 내구성을 보전한다. 

중점만 짚자면 RDBMS가 데이터를 바이너리로 변환해 디스크 블록에 테이블의 row를 순서대로 쭉 기록하는 방식으로 데이터를 저장한다면, MongoDB는 파일을 bson형식으로 직렬화하여 압축해서 보관한다고 할 수 있다. 

 

 

MongoDB의 몇 가지 특징점

 

1. Flexable Schema

 

MongoDB는 스키마의 제약이 없다. Collection을 만들었으면 그 안에 어떤 스키마를 가진 데이터를 넣어도 상관이 없다. 이로 인해 서비스 단의 데이터 구조 변경에 따른 마이그레이션 부담이 적다는 큰 장점을 가진다. 

 

스키마의 제약이 없다는 것은 관리의 부담이 증가될 수 있는 위험을 가지는데, 이러한 부담을 상쇄하기 위해 스키마 유효성을 검사하는 기능(Json-schema-validation)을 갖추고 있다. 

 

2. 데이터 샤딩(sharding) 

 

샤딩이란 데이터를 수평 분산시키는 것을 말한다. 샤딩은 대용량 데이터 저장의 핵심적인 기술이고 RDBMS와 구별되는 MongoDB의 가장 큰 장점이라고도 할 수 있다. RDBMS는 그 구조상 샤딩이 난해하고 클러스티링 등의 기술을 활용해 이를 수행하지만, MongoDB는 문서 지향이라는 구조에 따라 편리하게 샤딩을 할 수 있다. 

 

위에서 말했듯 MonogoDB는 Collection이라는 논리적 집합을 통해 데이터를 관리하는데, 이 Collection 내의 데이터를 샤딩할 수 있다. 즉, 여러 노드에 분산해서 저장할 수 있다. 이러한 Scale-out의 강점은 humongous 라는 mongo 단어의 어원에 아주 잘 맞아떨어진다. 

 

3. 인덱싱 

 

RDBMS의 성능 최적화의 주요 요인은 Index이다. 이는 MongoDB에서도 크게 다르지 않다. MongoDB도 인덱싱 기능을 가지고, 인덱스는 B-tree 구조로 저장된다. 인덱싱의 개념 자체는 RDBMS와 크게 다르지 않다라고도 볼 수 있다. 

 

MongoDB만의 특징을 중점으로 보자면 MongoDB는 elasticsearch와 같은 검색 엔진과 붙여서 사용할 수 있다. 대규모 검색이 중요한 서비스에서는 MongoDB의 인덱싱만이 아닌 외부 솔루션과의 결합도 고려하면 좋겠다. 이러한 부분도 MongoDB의 훌륭한 확장성의 한 사례가 될 수 있겠다. 

 

 

MongoDB의 활용 사례

 

MongoDB에 대한 개념적인 이해와 실무적인 사용은 서로 다른 영역이라 할 수 있다. 과연 아! 이때는 다른 데이터베이스보다는 MongoDB를 써야겠다! 라고 할 수 있는 때가 있을까? 

 

한 가지 그럴만한 예시가 있다. 가령 고객의 얼굴정보를 수집하는 B2C서비스를 운용할 때 데이터 수집에 대한 동의 정보 데이터를 저장해야 한다고 하자. 만약 아래와 같은 경우라면 이 데이터는 MongoDB에 넣어 활용하면 아주 좋겠다. 

  • 사람의 유형에 따라 동의 정보 수집 항목이 다르다. 가령 내국인, 외국인의 경우 입력 정보가 상이하고 미성년자의 경우 성인과는 다른 추가적인 수집 정보가 있다. 
  • 법령의 잦은 개정으로 인해 동의 정보 수집 항목이 분기별로 달라진다. 

하루 별로 수십만건의 데이터가 수집되는 서비스라고 했을 때, 이러한 데이터 스키마의 비고정성을 RDBMS로 관리하긴 정말 쉽지 않다. 이러한 경우 RDBMS에서 마주하는 문제들을 MongoDB에서 간단히 해결할 수 있겠다. 아래의 예시를 보자

 

내국인의 경우 주민번호를 수집해야하고, 외국인의 경우 여권번호를 수집해야한다. 동의 정보를 주민번호나 여권번호로 조회할 일은 없고, 각 항목은 메타정보에 다를 것 없다. RDBMS의 경우 이 차이를 위해 테이블을 분리하거나 컬럼을 분리하는 등의 일을 해야하지만 MongoDB의 경우 고민 없이 데이터를 넣으면 된다!

 

그리고 세월이 잠시 흘러 법령이 바뀌어 법령 개정 후 수집한 데이터엔 보유기간 정보를 추가할 필요성이 생겼다고 하자. 이 경우 MongoDB라면 더 고민할 것 없이 컬럼을 추가해서 저장하면 된다. 놀라운 편의성이 아닐 수 없다.  

<끝>

 

# 출처

https://www.mongodb.com/company/our-story

https://www.mongodb.com/ko-kr/docs/manual/core/wiredtiger/

https://www.mongodb.com/ko-kr/docs/manual/core/schema-validation/#json-schema-validation

https://www.mongodb.com/ko-kr/docs/manual/sharding/

https://www.mongodb.com/ko-kr/docs/manual/tutorial/manage-indexes/

https://groups.google.com/g/wiredtiger-users/c/1YHbNXPw-1A?pli=1