MongoDB 문서 모델과 분산 구조를 설계하는 방법

MongoDB의 BSON 문서 모델, 복제셋과 샤딩 구조, 데이터 모델링과 인덱스 최적화, 보안·백업 운영 방식을 정리한다.

2026-08-14 · 최초 발행 2025-08-10

문서 단위로 데이터를 다루는 MongoDB

MongoDB는 JSON과 유사한 BSON(Binary JSON) 형식으로 데이터를 저장하는 문서 지향 NoSQL 데이터베이스다. 고정된 스키마에 묶이지 않아 데이터 구조를 유연하게 바꿀 수 있으며, 빅데이터·클라우드 컴퓨팅·분산 시스템 환경에서 확장성과 성능을 제공한다.

문서 모델은 중첩된 데이터를 자연스럽게 표현할 수 있다. 인덱싱, 집계 파이프라인, 텍스트 검색 같은 쿼리 기능도 제공하며, 버전 4.0 이상에서는 다중 문서 트랜잭션을 지원한다. 위치 기반 데이터를 위한 지리 공간 인덱싱도 포함된다.

데이터베이스에서 문서까지 이어지는 구조

MongoDB 서버Database 1Database 2Database nCollection 1Collection 2Document 1Document 2Document n

MongoDB 서버 안에는 데이터베이스가 있고, 각 데이터베이스는 컬렉션으로 구성된다. 컬렉션은 문서의 묶음이며, 문서는 BSON으로 저장되는 기본 데이터 단위다. 문서 안의 필드는 키-값 쌍으로 데이터를 표현한다.

관계형 데이터베이스의 구조와 대응해 보면 차이가 더 선명하다.

RDBMS MongoDB
데이터베이스 데이터베이스
테이블 컬렉션
행(Row) 문서(Document)
열(Column) 필드(Field)
기본 키(Primary Key) ObjectID
조인(Join) 임베디드 문서 & 참조
스키마 스키마 없음(Schemaless)

가용성과 확장을 나누어 맡는 클러스터 구성

복제셋은 데이터를 중복해 보관하고 장애 상황에서 역할 전환을 수행한다.

Primary NodeSecondary Node 1Secondary Node 2Arbiter

Primary Node는 모든 쓰기 작업을 처리한다. Secondary Node는 복제본을 유지하며 읽기 작업을 분산할 수 있다. Arbiter는 데이터를 저장하지 않고 투표에만 참여한다.

Primary Node에 장애가 발생하면 Secondary가 자동으로 승격될 수 있다. 복제본을 통한 가용성 확보와 읽기 분산이 가능하며, 홀수 개의 노드로 최소 3개 노드를 구성하는 방식을 권장한다.

데이터 규모나 처리량이 단일 서버의 한계를 넘을 때는 샤딩을 사용한다.

mongos RouterConfig ServerShard 1 - Replica SetShard 2 - Replica SetShard 3 - Replica SetPrimarySecondary 1Secondary 2

mongos는 클라이언트 요청을 적절한 샤드로 전달하는 쿼리 라우터다. Config Server는 클러스터의 메타데이터와 구성 정보를 보관한다. 실제 데이터는 복제셋으로 구성된 Shard에 분산 저장된다.

이 구조는 수평 확장으로 대용량 데이터를 처리하고 단일 서버의 하드웨어 제약을 넘을 수 있게 한다. 처리량을 높이고 지역 분산 배포를 구성하는 데도 쓰인다.

조회 방식에 맞춰 문서 관계를 설계한다

MongoDB 모델링은 관계형 모델을 그대로 옮기는 작업이 아니다. 어떤 데이터를 함께 읽고 변경하는지부터 정한 뒤, 한 문서에 포함할지 별도 문서로 참조할지 선택한다.

관련 데이터를 함께 조회하는 경우에는 임베디드 모델이 적합할 수 있다.

{
  _id: ObjectId("5f8a7b2e9d3b6c1a2d4e6f8a"),
  name: "John Doe",
  contact: {
    email: "john@example.com",
    phone: "123-456-7890",
    address: {
      street: "123 Main St",
      city: "New York",
      zipcode: "10001"
    }
  },
  orders: [
    { product: "Laptop", price: 1200, date: ISODate("2022-01-15") },
    { product: "Phone", price: 800, date: ISODate("2022-03-10") }
  ]
}

단일 쿼리로 관련 데이터를 가져올 수 있어 트랜잭션 필요성을 줄이고 쿼리 성능을 높일 수 있다.

반대로 문서 크기 제한을 피해야 하거나 데이터셋 규모가 큰 경우에는 참조 모델을 적용할 수 있다.

// 사용자 문서
{
  _id: ObjectId("5f8a7b2e9d3b6c1a2d4e6f8a"),
  name: "John Doe",
  email: "john@example.com"
}

// 주문 문서
{
  _id: ObjectId("6a9b8c7d6e5f4a3b2c1d0e9f"),
  user_id: ObjectId("5f8a7b2e9d3b6c1a2d4e6f8a"),
  product: "Laptop",
  price: 1200,
  date: ISODate("2022-01-15")
}

참조 모델은 데이터 중복을 줄이고 문서 크기 제한을 우회하는 데 유리하다. 설계 시에는 쿼리 패턴을 먼저 확인하고, 필요한 데이터를 단일 문서에 포함해 조인 연산을 줄이며, 16MB 문서 크기 제한을 고려해야 한다. 자주 조회하는 필드에는 인덱스를 둔다.

인덱스와 실행 계획으로 쿼리를 다룬다

MongoDB 인덱스에는 단일 필드, 복합, 다중키, 지리공간, 텍스트, 해시 인덱스 등이 있다. 쿼리가 인덱스만으로 처리되는 커버링 인덱스와 여러 인덱스를 함께 활용하는 인덱스 교차도 성능 설계의 대상이다.

// 단일 필드 인덱스
db.collection.createIndex({ field: 1 }); // 오름차순
db.collection.createIndex({ field: -1 }); // 내림차순

// 복합 인덱스
db.collection.createIndex({ field1: 1, field2: -1 });

// 지리공간 인덱스
db.collection.createIndex({ location: "2dsphere" });

// 텍스트 인덱스
db.collection.createIndex({ content: "text" });

반환 필드를 제한하는 프로젝션은 네트워크 부하를 줄이는 방법이다.

db.collection.find({}, { field1: 1, field2: 1 });

집계 파이프라인에서는 초기에 데이터를 걸러 이후 단계가 처리할 범위를 줄인다.

db.collection.aggregate([
  { $match: { status: "active" } }, // 먼저 필터링
  { $group: { _id: "$category", count: { $sum: 1 } } },
]);

실행 계획은 explain()으로 확인할 수 있다.

db.collection.find({ status: "active" }).explain("executionStats");

유연한 문서 구조가 맞는 데이터

CMS에서는 콘텐츠 유형마다 구조가 달라도 한 컬렉션 안에서 다룰 수 있다.

// 블로그 포스트
{
  _id: ObjectId("..."),
  title: "MongoDB 소개",
  content: "MongoDB는 NoSQL 데이터베이스로...",
  author: { name: "홍길동", email: "hong@example.com" },
  tags: ["database", "NoSQL", "MongoDB"],
  comments: [
    { user: "김철수", text: "좋은 글이네요!", date: ISODate("2022-05-10") }
  ],
  created_at: ISODate("2022-05-01")
}

// 제품 페이지
{
  _id: ObjectId("..."),
  name: "스마트폰",
  description: "최신 스마트폰",
  price: 1000000,
  specifications: { ... },
  images: ["url1", "url2"],
  created_at: ISODate("2022-04-15")
}

IoT 데이터에서는 장치 식별자, 측정값, 위치, 갱신 시각을 문서로 저장할 수 있다.

{
  _id: ObjectId("..."),
  device_id: "sensor-123",
  readings: [
    { temperature: 25.4, humidity: 60, timestamp: ISODate("2022-06-01T10:00:00Z") },
    { temperature: 25.6, humidity: 61, timestamp: ISODate("2022-06-01T10:01:00Z") }
  ],
  location: {
    type: "Point",
    coordinates: [127.0126, 37.5456]
  },
  last_updated: ISODate("2022-06-01T10:01:00Z")
}

집계 파이프라인은 실시간 분석 시스템에서 복잡한 분석을 구성하는 데 활용할 수 있다.

db.sales.aggregate([
  {
    $match: {
      date: { $gte: ISODate("2022-01-01"), $lt: ISODate("2023-01-01") },
    },
  },
  {
    $group: {
      _id: { month: { $month: "$date" }, year: { $year: "$date" } },
      total_sales: { $sum: "$amount" },
      avg_transaction: { $avg: "$amount" },
      count: { $sum: 1 },
    },
  },
  { $sort: { "_id.year": 1, "_id.month": 1 } },
]);

운영 환경에서 확인할 보안과 복구 체계

인증에는 SCRAM, LDAP, Kerberos, x.509 인증서를 사용할 수 있다. 권한은 역할 기반 접근 제어(RBAC)로 관리하며, 전송 구간은 TLS/SSL로 보호한다. 민감한 데이터에는 필드 레벨 암호화를 적용할 수 있고, 감사 기능으로 시스템 활동을 로깅하고 모니터링한다.

백업은 mongodump/mongorestore를 이용한 논리적 방식, 스토리지 레벨의 물리적 파일 스냅샷, oplog 기반 Continuous Backup에 의한 시점 복구로 구성할 수 있다. MongoDB Atlas는 자동화된 백업 솔루션을 제공한다.

운영 중에는 MongoDB Compass, MongoDB Atlas 모니터링, Prometheus/Grafana 연동을 활용할 수 있다. 쿼리 실행 시간, 인덱스 사용률, 메모리 사용량, 연결 수를 성능 지표로 확인한다.

관리형 환경에서 제공하는 Atlas 기능

MongoDB Atlas는 AWS, Azure, GCP에서 제공되는 완전 관리형 데이터베이스 서비스다. 복제셋과 샤딩을 자동 구성하고, 버튼 클릭으로 수직·수평 확장을 지원한다. 자동화된 백업과 시점 복구, 네트워크 격리·암호화·IAM 통합, 실시간 모니터링과 알림 설정을 제공한다.

Atlas Data Lake 연동과 지역 분산 데이터베이스를 위한 글로벌 클러스터 구성도 지원한다.

MongoDB 5.0 이후 추가된 기능

MongoDB 5.0 이후에는 IoT 및 모니터링 데이터를 위한 시계열 컬렉션, 온라인 데이터 재분배를 위한 라이브 리샤딩, 윈도우 함수를 지원하는 개선된 집계 파이프라인이 추가됐다. 일관된 읽기를 위한 Snapshot 기반 읽기, 동적 필드를 다루는 Wildcard 인덱스, 샤딩 환경의 분산 트랜잭션, 머신러닝 임베딩 검색을 위한 벡터 검색도 포함된다.

MongoDB의 강점은 문서 지향 모델과 분산 구조를 함께 활용할 수 있다는 점에 있다. 빠른 개발 주기, 대용량 데이터 처리, 복잡한 데이터 구조를 다루는 애플리케이션에 맞지만, 데이터 모델링·인덱스·하드웨어 리소스 계획을 별도로 설계해야 한다. 보안, 백업, 모니터링을 운영 체계에 포함하고 관계형 데이터베이스와 다른 설계 패턴을 전제로 지속적으로 성능을 점검해야 한다.

MongoDBNoSQL문서형 데이터베이스샤딩복제셋