
Mastering MongoDB 7.0 - Fourth Edition
Achieve data excellence by unlocking the full potential of MongoDB
1. MongoDB 소개
MongoDB는 가장 인기 있는 다큐먼트(Document) 데이터베이스*로, NoSQL 기반의 비관계형 Key-Value 저장소이자 JSON 데이터베이스입니다. 또한, 현대 애플리케이션을 위한 강력한 기능을 갖춘 개발자 데이터 플랫폼으로, 머신러닝 및 AI 기능, 스트리밍, 함수, 트리거, 서버리스, 디바이스 동기화, 전문 검색(Full Text Search) 등의 다양한 기능을 제공합니다.
MongoDB는 비관계형 데이터베이스이지만 관계형 데이터를 쉽게 처리할 수 있습니다. Document 형식을 사용하면서도 관계형 데이터 모델링 및 처리를 최적화하는 방법에 대한 강의, 튜토리얼, 문서를 learn.mongodb.com에서 제공합니다.
(* 역자주 - 해당 번역에서는 "Document"는 "문서"라고 하지 않고, "Document"라고 영어를 사용하도록 하겠습니다. 왜냐하면 "Document", "문서"라는 의미가 때로 혼선을 만들고 있기 때문입니다. 대표적인 오해가 Document 데이터베이스가 정형 데이터인 문서(Text)만 저장하는 데이터베이스라거나 아래한글 , MS Word 등의 문서 형식의 파일만 저장하는 데이터베이스라는 오해입니다, 모두 잘못된 것입니다. 국어에서는 문서라고 하면 주로 종이를 기반으로 한 기록을 말하는데, 영어에서의 다큐먼트는 텍스트, 이미지, 오디오 등 다양한 형태의 정형, 비정형 데이터를 지칭합니다. 또한 Document 데이터베이스에서 사용되는 "Document"라는 용어는 개발 관점에서 데이터를 JSON이나 BSON과 같은 형식으로 저장하는 방식에서 유래했습니다. 데이터베이스 관점에서 보면, 전통적인 관계형 데이터베이스와는 달리, 데이터를 테이블과 행과 열로 구조화하지 않고, 각 데이터 레코드를 하나의 문서로 저장하는 방식의 데이터베이스입니다. 기존 여타 데이터베이스와 비교하여 정의하면, Document 데이터베이스라는 것은 데이터 모델이 Document 모델이라는 의미이고, 데이터 모델은 대표적으로 Relational, Key-Value, Document, Columnar, Graph 등이 있습니다. 끝으로 몽고DB가 Document 데이터베이스를 시작했고, 가장 대표적인 Document 데이터베이스이지만, 몽고DB가 아닌 Document 데이터베이스도 여럿 존재합니다. 자세한 내용은 여기를 참조하시기 바랍니다.)
누가 MongoDB를 사용할까?
10년 전만 해도 MongoDB는 일부 개발자들 사이에서만 사용되는 비교적 신생 데이터베이스였습니다. 그러나 2023년 기준, MongoDB는 다양한 산업에서 널리 사용되며, 모든 유형의 데이터 저장 및 활용 사례를 지원하고 있습니다. 현재 세계 최대 은행, 자동차 제조업체, 정부 기관, 게임 회사 등이 MongoDB를 프로덕션 환경에서 활용하고 있습니다.
MongoDB의 대표적인 사용자로는 Coinbase, Epic Games, Morgan Stanley, Adobe, Tesla, Canva, Ulta Beauty, Cathay Pacific, 동화(Dongwha), Vodafone 등이 있습니다.
MongoDB Atlas 플랫폼에는 수백만 명의 사용자가 있으며, 이들은 클라우드에서 안전하고 효율적으로 데이터를 관리할 수 있다고 신뢰합니다. 이러한 인기는 MongoDB의 성장과 기업 가치를 높이는 데 기여했을 뿐만 아니라, 개발자 커뮤니티 내에서의 입지를 더욱 공고히 했습니다. 2023년 기준, 전 세계 개발자의 4명 중 1명은 MongoDB를 프로덕션에서 적극적으로 사용하고 있으며, Go 및 JavaScript 개발자 커뮤니티에서는 약 40% 가 MongoDB를 주요 데이터베이스로 활용하고 있습니다.
개발자들이 MongoDB를 사랑하는 이유
MongoDB는 다양한 기능과 뛰어난 성능 덕분에 많은 개발자들에게 선호되는 데이터베이스입니다. MongoDB를 선택하는 이유는 다음과 같습니다:
- 유연성과 스키마 없는 구조: 전통적인 관계형 데이터베이스와 달리 MongoDB는 엄격한 스키마나 미리 정의된 구조 없이 데이터를 저장하고 조회할 수 있습니다. 이는 시간이 지남에 따라 데이터가 변하거나 비정형 또는 반정형 데이터와 작업할 때 특히 유용합니다.
- 확장성 및 성능: MongoDB는 고도의 확장성을 자랑하며 성능도 매우 우수하여 대규모 애플리케이션뿐만 아니라 개인 프로젝트에도 적합합니다. MongoDB Atlas*는 개인 프로젝트를 위해 영구적으로 무료 티어를 제공합니다.
(* 역자주 - 여기서 "MongoDB Atlas"는 설치형이 아닌 MonogoDB가 클라우드 상에 제공하는 DBaaS, DB as a Service이다) - 강력한 쿼리 언어: MongoDB는 강력한 쿼리 언어와 인덱싱 기능을 제공하여, findOne과 updateOne과 같은 일반적인 작업을 단순화합니다.
- 개발자 친화적인 데이터 포맷: MongoDB의 데이터는 인기 있는 프로그래밍 언어의 객체와 유사하여, 데이터 매핑의 복잡성을 줄이고 개발 속도를 빠르게 합니다.
- 간단하고 빠른 시작: MongoDB의 간단한 설정과 문제 없는 시작 과정 덕분에 쉽게 적응할 수 있습니다. 복잡한 구매 프로세스나 라이선스 문제 없이 바로 사용할 수 있습니다.
많은 개발자들이 MongoDB를 사랑하는 이유는 바로 매일 사용하는데 있어 단순하고 직관적인 경험 덕분입니다. 예를 들어, Python 개발자가 Document를 삽입하고, 해당 Document를 조회한 후 결과를 반환받는 과정은 다음과 같은 코드로 쉽게 처리할 수 있습니다:
from pymongo import MongoClient
# Connect to MongoDB
client = MongoClient('mongodb://localhost:27017/')
db = client['mydatabase'] # Specify the database name
collection = db['mycollection'] # Specify the collection name
# Create a document to be inserted
document = {
'name': 'Jane Doe',
'age': 30,
'email': 'janedoe@example.com'
}
# Insert the document into the collection
result = collection.insert_one(document)
# Check if the insertion was successful
if result.acknowledged:
print('Document inserted successfully.')
print('Inserted document ID:', result.inserted_id)
else:
print('Failed to insert document.')
이 문서를 검색하려면 Document의 필드 중 하나를 단독으로 사용하거나 여러 개를 조합하여 쿼리를 필터링할 수 있습니다. 이제 이를 실제로 실행해 보겠습니다.
from pymongo import MongoClient
# Connect to MongoDB
client = MongoClient('mongodb://localhost:27017/')
db = client['mydatabase'] # Specify the database name
collection = db['mycollection'] # Specify the collection name
# Retrieve documents based on specific conditions
query = {
'age': {'$gte': 29}, # Retrieve documents where age is greater than or equal to 29
}
documents = collection.find(query)
# Iterate over the retrieved documents
for document in documents:
print(document)
아주 간단합니다! 앞선 예제에서는 $gte(크거나 같음)와 같은 MongoDB 쿼리 연산자를 사용하여 쿼리를 필터링하는 방법을 보여줍니다.
하지만 진짜 중요한 부분은 Document가 반환될 때입니다. MongoDB가 Document를 반환하면, 해당 Document는 Python 딕셔너리로 표현됩니다. Document의 각 필드는 딕셔너리의 키-값 쌍으로 구성되며, 아래 예제와 같은 형태가 됩니다:
{
'_id': ObjectId('67ceb3211d7c3bf751638074'),
'name': 'Jane Doe',
'age': 30,
'email': 'janedoe@example.com'
}
MongoDB는 클라이언트와 서버 사이에서 번역 계층 역할을 하는 다양한 언어 라이브러리와 드라이버를 제공합니다. 이러한 드라이버는 각 작업을 가로채어 MongoDB의 쿼리 언어로 변환하며, 이를 통해 개발자는 자신이 익숙한 프로그래밍 언어를 사용하여 자연스럽게 데이터를 다룰 수 있습니다.
또한, MongoDB Atlas 개발자 데이터 플랫폼의 다양한 기능을 활용하면 데이터베이스 작업의 복잡성을 추상화할 수 있습니다. 이를 통해 별도의 데이터베이스 셸, UI, 또는 특정 데이터베이스 관리 도구 없이도 코드와 IDE*만으로 데이터를 효율적으로 조작할 수 있습니다. 특히, MongoDB Atlas는 완전 관리형 데이터베이스 서비스를 제공하므로, 명령줄 인터페이스(CLI)를 통해 간편하게 설정하고 등록할 수 있습니다.
(*IDE - Integrated Development Environment, 통합개발환경 혹은 개발툴로 VS Code 같은 개발툴을 지칭합니다.)
MongoDB의 핵심 목표는 개발자를 위한 강력한 데이터베이스를 제공하는 것입니다. 따라서 데이터베이스 관리 도구보다는 프로그래밍 언어 커뮤니티와 프레임워크 통합에 초점을 맞추고 있습니다. 이후 챕터에서는 MongoDB Atlas, Atlas Vector Search, 풀텍스트 검색, 그리고 집계(Aggregation) 기능을 개발자 중심의 관점에서 깊이 있게 다룰 것입니다.
MongoDB 데이터베이스의 복잡성을 효율적으로 관리하기
현대적인 데이터베이스에서 가장 흥미로운 부분은 그 아키텍처와 설계 이유를 이해하는 것입니다. 기본적으로 MongoDB는 분산 시스템으로 설계되었습니다. MongoDB 데이터베이스 서버는 대부분의 사용자가 기본 설정인 레플리카 세트(replica set)를 사용할 것으로 예상하고 개발되었습니다. 레플리카 세트는 종종 클러스터(cluster)라고도 불리며, 이를 자세히 살펴보면 MongoDB의 진정한 복잡성을 알 수 있습니다.
기본적으로 MongoDB의 레플리카 세트는 3개의 노드로 구성됩니다. 이 세 개의 노드는 모두 데이터를 저장하며, 각 노드에는 데이터베이스의 완전한 사본이 존재합니다. 각 데이터베이스 인스턴스는 별도의 호스트나 인스턴스에서 실행되며, 같은 가용 영역(availability zone), 데이터센터, 또는 지역(region)에 배치될 수 있습니다. 이러한 기본 구성을 통해 데이터 중복성(redundancy)과 고가용성(high availability)을 보장할 수 있습니다.
만약 특정 인스턴스가 응답하지 않거나 사용할 수 없게 되면, 정상적인 노드가 자동으로 프라이머리(primary) 노드로 승격됩니다. 이 자동 페일오버(failover) 과정은 데이터베이스 사용자에게 아무런 영향을 미치지 않으며, 가용성, 데이터 신선도(freshness), 응답 속도 등을 고려하여 이루어집니다. 이러한 선거 과정(election process)과 프로토콜은 개념적으로는 단순해 보이지만, 실제로는 매우 정교하게 설계되어 있습니다. 그러나 이러한 운영이 자동으로 이루어지기 때문에, 일반적인 사용자는 내부 동작을 깊이 이해하지 않아도 원활하게 데이터베이스를 활용할 수 있습니다.
다음 챕터에서는 MongoDB 아키텍처와 레플리카 세트에 대해 더욱 자세히 알아보겠습니다.
이것이 어떻게 가능할까요?
MongoDB에서는 복제(replication)라는 과정을 통해 Primary 노드에서 Secondary 노드로 쓰기 작업이 전파됩니다. 이를 쉽게 설명하기 위해 하나의 데이터 쓰기 예제를 살펴보겠습니다.
클라이언트 애플리케이션(예: 사용자의 앱)에서 들어오는 쓰기 요청은 먼저 Primary 노드로 전달됩니다. Primary 노드는 먼저 자신의 데이터베이스 사본에 해당 데이터를 저장한 후, Operations log(oplog)에 해당 변경 사항을 기록합니다. 이 연산 로그는 Secondary 노드들이 지속적으로 모니터링하며 데이터를 동기화하는 데 사용됩니다.
MongoDB의 복제 방식
MongoDB의 복제는 RAFT 합의 프로토콜을 기반으로 합니다. 일반적인 RAFT 프로토콜에서는 기본(Primary) 노드를 선출할 때 랜덤한 선출 타이머(randomized election timeouts)와 메시지 교환(message exchanges)을 조합하여 결정합니다.
하지만 MongoDB에서는 노드 우선순위(priority) 설정이 가능하며, 데이터 최신 상태(freshness) 및 응답 속도(response time)와 함께 고려되어 Primary 노드를 선출합니다.
복제 지연과 동기화
모든 노드에 동일한 시간에 동시에 데이터가 기록되는 것은 아닙니다. 이 과정에는 네트워크 지연(latency), 노드 간 거리, 하드웨어 구성, 그리고 워크로드(workload) 등의 요인이 크게 영향을 미칩니다.
만약 특정 mongod 노드가 데이터 동기화에서 뒤처질 경우, oplog를 이용해 누락된 데이터를 찾아 자동으로 동기화(resync) 합니다. MongoDB는 노드 간 복제 지연(replication lag)을 지속적으로 모니터링하며, 지연 시간이 허용 범위를 벗어나면 적절한 조치를 취합니다.
MongoDB의 기본 복제 세트와 샤딩 클러스터
MongoDB의 기본 설정은 3개의 멤버로 구성된 레플리카 세트(replica set)이며, 데이터 복제와 장애 조치(failover)가 자동으로 처리됩니다. 이러한 구성 덕분에 내구성(durability)과 고가용성(high availability)을 보장하면서도 쉽게 운영할 수 있습니다.
하지만 더 큰 글로벌 배포(global deployment)가 필요한 경우, MongoDB는 샤딩 클러스터(sharded cluster) 모델을 제공합니다. 샤딩 클러스터는 여러 개의 레플리카 세트로 구성되며, 데이터를 효율적으로 분산(partitioning)하여 복제된 파티션 형태로 관리할 수 있도록 설계되었습니다.
만약 여러 테라바이트(TB)의 데이터를 다루는 글로벌 배포가 필요하다면, 2장: MongoDB 아키텍처부터 시작하는 것이 좋습니다. 2장에서는 데이터를 분할하는 방법, 지역 또는 샤드 간 데이터 마이그레이션 방법, 여러 지역의 데이터를 분석 목적으로 결합하는 방법, 그리고 샤딩된 클러스터 아키텍처의 성능에 대해 다룰 것입니다.
요약
MongoDB는 단순하면서도 강력한 데이터베이스입니다. 복잡한 구현 세부 사항을 추상화하여 애플리케이션 개발에 집중할 수 있도록 도와줍니다. 시작하기 쉽고, 강력하면서도 자연스러운 개발자 경험을 제공하여, 원하는 프로그래밍 언어를 사용해 IDE에서 직접 데이터베이스와 상호작용할 수 있도록 합니다.
이 책의 나머지 부분에서는 MongoDB의 강력함과 유연성을 자세히 살펴보고, MongoDB 7.0의 새로운 기능과 이를 어떻게 활용할 수 있는지 설명할 것입니다. MongoDB는 웹 애플리케이션, 트랜잭션 데이터, 유연한 스키마, 고성능 워크로드에 적합할 뿐만 아니라, 실습을 통한 학습과 프로토타입 개발에도 매우 유용한 데이터베이스입니다.
다음 장에서는 복제(replication)와 샤딩(sharding)을 통해 애플리케이션의 신뢰성과 가용성을 높이는 방법을 살펴볼 것입니다.
'T. > Mastering MongoDB 7.0' 카테고리의 다른 글
| 5. CRUD Operations and Basic Queries (0) | 2025.03.10 |
|---|---|
| 4. Connecting to MongoDB (0) | 2025.03.10 |
| 3. Developer Tools (0) | 2025.03.10 |
| 2. The MongoDB Architecture (0) | 2025.03.10 |
| 0. 관련 자료와 용례 (0) | 2025.03.10 |