coredot.today
MongoDB 완전 정복: '스키마가 없는 DB'가 세계에서 가장 인기 있는 NoSQL이 된 이유
블로그로 돌아가기
MongoDBNoSQL문서DBAtlasDocumentDB데이터베이스

MongoDB 완전 정복: '스키마가 없는 DB'가 세계에서 가장 인기 있는 NoSQL이 된 이유

ALTER TABLE 없이 데이터 구조를 자유롭게 바꾸고, JSON을 그대로 저장하며, 수평 확장이 기본인 DB. MongoDB가 왜 탄생했고, 관계형 DB와 무엇이 다르며, 언제 써야 하고 쓰지 말아야 하는지를 라이선스 전쟁과 보안 사고까지 포함하여 풀어본다.

코어닷투데이2026-03-1430

들어가며: "ALTER TABLE이 무서워요"

관계형 DB를 쓰다 보면 반드시 만나는 공포:

hljs language-sql
ALTER TABLE users ADD COLUMN phone_number VARCHAR(20);

사용자 테이블에 전화번호 열을 추가한다. 단순해 보이지만:

  • 테이블에 1억 행이 있으면? → 수 분~수십 분 락(Lock) 발생
  • 락이 걸리면? → 그 테이블에 대한 모든 읽기/쓰기가 중단
  • 프로덕션에서? → 서비스 장애

그리고 이런 상황도 있다. 초기 스타트업이 MVP를 만든다. 데이터 구조가 매주 바뀐다. "사용자에게 주소가 필요해" → ALTER TABLE. "주소에 위도/경도도 넣자" → ALTER TABLE. "위시리스트 기능 추가" → 새 테이블 + JOIN...

"데이터 구조를 미리 정하지 않아도 되는 DB는 없을까?"

이것이 문서형 데이터베이스(Document Database) 의 핵심 아이디어이고, 그 대표가 MongoDB다.


1. MongoDB의 탄생: 광고 플랫폼에서 시작된 혁명

DoubleClick에서의 좌절

MongoDB의 창시자 Dwight MerrimanEliot Horowitz는 2000년대 초반 DoubleClick(인터넷 광고 플랫폼, 현재 Google Ad Manager)을 운영했다.

DoubleClick은 하루에 수십억 건의 광고 노출 이벤트를 처리해야 했다. 관계형 DB에서 이 규모를 처리하려니:

  • 스키마 변경이 너무 어렵다 (광고 메타데이터가 자주 바뀜)
  • 수직 확장에 한계가 있다 (더 큰 서버를 사는 것만으로는 부족)
  • 수평 확장(샤딩)이 관계형 DB에서는 매우 복잡하다

2007년, 두 사람은 10gen이라는 회사를 설립하고 이 문제를 해결하기 위한 새로운 DB를 만들기 시작했다. 이름은 MongoDB — "humongous"(거대한)에서 따왔다. 거대한 규모의 데이터를 처리하겠다는 의지.

2009년: 오픈소스 공개

2009년 2월, MongoDB를 오픈소스로 공개했다. 핵심 설계 원칙:

  • 문서(Document) 모델: 데이터를 JSON(BSON) 형태로 저장. 스키마 없음
  • 수평 확장: 처음부터 샤딩을 핵심 기능으로 내장
  • 개발자 경험: SQL 대신 직관적인 쿼리 API. JSON in, JSON out
2007
10gen 설립
Merriman과 Horowitz가 DoubleClick의 경험을 바탕으로 새로운 DB 개발 시작
2009
MongoDB 오픈소스 공개
문서 모델 + 수평 확장 + 개발자 친화. 스타트업에서 폭발적 인기
2013
10gen → MongoDB Inc.로 사명 변경
제품의 인지도가 회사보다 높아져서 사명을 변경
2017.10
MongoDB 나스닥 상장 (MDB)
IPO 첫날 주가 34% 상승. DB 시장의 판도 변화를 증명
2018.10
라이선스를 SSPL로 변경
AWS/Azure/GCP가 MongoDB를 관리형 서비스로 제공하는 것에 대응. 오픈소스 논쟁 촉발
2026
세계에서 가장 인기 있는 NoSQL DB
DB-Engines 순위 5위. NoSQL 중 1위. MongoDB Atlas(관리형)가 주력 사업

2. 문서 모델: 왜 JSON으로 저장하는가

관계형 모델 vs 문서 모델

사용자와 주문 데이터를 저장한다고 하자:

관계형 DB (RDS/Aurora):

3개 테이블, JOIN으로 연결:

hljs language-sql
-- users 테이블
| id | name    | email           |
| 1  | 김개발  | kim@example.com |

-- addresses 테이블
| user_id | type | city   | detail      |
| 1       | home | 서울   | 강남구 ...  |
| 1       | work | 판교   | 삼평동 ...  |

-- orders 테이블
| id | user_id | product  | amount |
| 1  | 1       | 노트북   | 150|
| 2  | 1       | 키보드   | 15|

사용자 정보 전체를 가져오려면 → 3개 테이블 JOIN.

MongoDB:

하나의 문서에 모든 것:

hljs language-json
{
  "_id": "user_1",
  "name": "김개발",
  "email": "kim@example.com",
  "addresses": [
    { "type": "home", "city": "서울", "detail": "강남구 ..." },
    { "type": "work", "city": "판교", "detail": "삼평동 ..." }
  ],
  "orders": [
    { "product": "노트북", "amount": 1500000 },
    { "product": "키보드", "amount": 150000 }
  ]
}

사용자 정보 전체를 가져오려면 → 한 번의 조회. JOIN 없음. 관련 데이터가 하나의 문서에 내장(embedded).

관계형 DB (RDS/Aurora)
고정 스키마 (ALTER TABLE로 변경)
데이터를 여러 테이블에 정규화
JOIN으로 관계 표현
수직 확장이 주 (더 큰 서버)
ACID 트랜잭션 완벽 지원
비유: 엑셀 스프레드시트 (행×열 고정)
MongoDB (문서 DB)
유연한 스키마 (문서마다 다를 수 있음)
관련 데이터를 하나의 문서에 내장
JOIN 없이 한 번에 읽기
수평 확장이 기본 (샤딩 내장)
멀티 문서 트랜잭션 (4.0부터)
비유: JSON 파일 (자유로운 구조)

"스키마가 없다"의 진짜 의미

MongoDB에 "스키마가 없다"는 것은 DB가 스키마를 강제하지 않는다는 뜻이지, 스키마 없이 개발해도 된다는 뜻이 아니다.

⚠️
흔한 실수 — "아무거나 넣어도 되나?": MongoDB가 스키마를 강제하지 않으므로, 같은 컬렉션에 완전히 다른 구조의 문서를 넣을 수 있다. 하지만 이것은 자유가 아니라 혼돈이다. 실전에서는 애플리케이션 레벨에서 스키마를 정의하고(Mongoose, JSON Schema Validation), DB에 Schema Validation 규칙을 설정하는 것이 모범 사례다.

3. MongoDB의 핵심 개념

용어 매핑

관계형 DBMongoDB설명
데이터베이스데이터베이스동일
테이블컬렉션(Collection)문서의 그룹
행(Row)문서(Document)BSON(Binary JSON) 형태의 레코드
열(Column)필드(Field)문서 내의 키-값 쌍
JOIN내장(Embedding) / 참조(Reference)관련 데이터 접근 방식
PRIMARY KEY_id자동 생성 ObjectId

CRUD 기본

hljs language-javascript
// 생성 (Create)
db.users.insertOne({
  name: "김개발",
  email: "kim@example.com",
  skills: ["Python", "MongoDB", "AWS"],
  joined: new Date("2026-01-15")
});

// 조회 (Read)
db.users.find({ skills: "MongoDB" });

// 수정 (Update) — 스키마 변경 없이 새 필드 추가!
db.users.updateOne(
  { name: "김개발" },
  { $set: { phone: "010-1234-5678" } }  // phone 필드가 없었어도 OK
);

// 삭제 (Delete)
db.users.deleteOne({ name: "김개발" });

핵심: $set: { phone: "..." } — 테이블에 phone 열이 없었는데, ALTER TABLE 없이 그냥 추가. 다른 문서에는 phone 필드가 없어도 상관없다.

인덱스

MongoDB도 인덱스가 있다. 관계형 DB의 인덱스와 개념은 같다:

hljs language-javascript
// 단일 필드 인덱스
db.users.createIndex({ email: 1 });

// 복합 인덱스
db.orders.createIndex({ userId: 1, orderDate: -1 });

// 텍스트 인덱스 (풀텍스트 검색)
db.products.createIndex({ name: "text", description: "text" });
인덱스 없는 MongoDB = 느린 MongoDB: "MongoDB가 느리다"는 불만의 90%는 인덱스 미설정이 원인이다. 자주 쿼리하는 필드에는 반드시 인덱스를 생성하라. explain()으로 쿼리 실행 계획을 확인하고, COLLSCAN(전체 스캔)이 나오면 인덱스를 추가하라.

4. MongoDB 보안: 역사상 가장 많이 해킹된 DB

"인증 없이 인터넷에 노출"

MongoDB는 OpenSearch 글에서 다룬 Elasticsearch와 함께 역사상 가장 많이 해킹된 데이터베이스 중 하나다. 이유: 초기 버전의 기본 설정에 인증이 없었다.

2017.1
"MongoDB Apocalypse": 2만 7,000개 DB 랜섬
인증 없이 인터넷에 노출된 MongoDB를 자동 스캔하여 데이터를 삭제하고 비트코인 랜섬 메시지를 남기는 대규모 공격. 수만 건의 DB가 피해
2018
2억 명의 중국 이력서 노출
인증 없는 MongoDB에 2억 명의 이력서(이름, 전화번호, 이메일, 학력)가 저장되어 있었음. Shodan으로 발견
2019
Verifications.io: 8억 건 이메일 DB 노출
이메일 검증 서비스의 MongoDB가 인증 없이 노출. 8억 건의 이메일 주소, 이름, 성별, 생년월일 유출
2020~2022
"Meow" 공격 (MongoDB + Elasticsearch)
공개 MongoDB를 찾아 데이터를 삭제하고 "meow"만 남기는 자동화 공격. 수천 개 DB 피해
2023~
MongoDB Atlas 기본 보안 강화
관리형 서비스(Atlas)는 인증 필수, 네트워크 격리 기본. 자체 설치 시에도 인증이 기본 활성화
🔒
"MongoDB Apocalypse"의 교훈: 2017년에만 수만 개의 MongoDB가 랜섬웨어에 당했다. 공통점: 인증 없이, 기본 포트(27017)로, 공개 인터넷에 노출. MongoDB를 직접 설치한다면: (1) 인증 반드시 활성화, (2) 바인드 IP를 localhost 또는 VPC 내부로 제한, (3) 기본 포트 변경 고려. 가장 안전한 방법: 관리형 서비스(Atlas, DocumentDB) 사용.

5. 라이선스 전쟁: MongoDB vs 클라우드 사업자

OpenSearch와 같은 스토리

OpenSearch 글에서 다룬 Elastic vs AWS 갈등과 거의 동일한 패턴이 MongoDB에서도 벌어졌다. 그리고 MongoDB가 먼저 행동했다.

2018년 10월, MongoDB는 라이선스를 AGPL에서 SSPL(Server Side Public License) 로 변경했다. OpenSearch 글의 Elastic(2021년 SSPL 전환)보다 2년 앞선 결정.

이유: AWS, Azure, GCP가 MongoDB를 관리형 서비스로 제공하면서, MongoDB Inc.의 Atlas 사업과 직접 경쟁. MongoDB의 코드를 무료로 가져다 쓰면서 수익은 클라우드 사업자가 가져가는 구조.

AWS의 대응: Amazon DocumentDB

2019년 1월, AWS는 Amazon DocumentDB를 출시했다. "MongoDB API와 호환되는" 관리형 문서 DB. 하지만 MongoDB의 코드를 사용하지 않고 자체 구현.

MongoDB Atlas (MongoDB Inc.)
진짜 MongoDB 엔진
최신 기능 즉시 사용 가능
MongoDB 전체 API 100% 호환
멀티클라우드 (AWS, Azure, GCP)
MongoDB Inc.가 운영
Amazon DocumentDB
MongoDB 호환 API (자체 구현)
일부 API 미지원 / 지연
호환성 95~98% 수준
AWS 전용
AWS가 운영 (IAM, VPC 네이티브 통합)
💡
선택 기준: MongoDB의 최신 기능(Change Streams, Atlas Search, Vector Search)이 필수라면 → MongoDB Atlas. AWS 네이티브 통합(IAM, VPC, CloudWatch)이 우선이고 기본적인 문서 DB면 충분하면 → DocumentDB. 실무에서는 Atlas가 더 많이 선택된다 — MongoDB 호환성이 100%이고, 멀티클라우드도 가능하므로.

6. MongoDB Atlas: 관리형의 시대

Atlas란

MongoDB Atlas는 MongoDB Inc.가 운영하는 완전 관리형 MongoDB 서비스. AWS, Azure, GCP 위에서 실행되지만, MongoDB Inc.가 직접 관리한다.

핵심 기능:

  • 자동 샤딩, 복제, 백업
  • Atlas Search: Lucene 기반 풀텍스트 검색 (OpenSearch 없이도 검색 가능)
  • Atlas Vector Search: AI 벡터 검색 (RAG 파이프라인에 활용)
  • Atlas Data Federation: S3, Atlas, HTTP 소스를 SQL로 통합 쿼리
  • Serverless Instances: 사용량 기반 과금, 유휴 시 비용 최소

MongoDB vs DynamoDB: 언제 무엇을

이 시리즈의 DynamoDB 글과 비교:

기준MongoDBDynamoDB
데이터 모델문서 (유연한 JSON)키-값 + 문서
쿼리풍부한 쿼리 언어 (필터, 집계, JOIN)키 기반 조회 위주
인덱스다양 (복합, 텍스트, 지리공간, 벡터)GSI/LSI (제한적)
스케일링샤딩 (수동/자동)자동 파티셔닝
지연 시간수 ms한 자릿수 ms (규모 불변)
트랜잭션멀티 문서 ACID (4.0~)제한적 트랜잭션
서버리스Atlas Serverless온디맨드 모드
접근 패턴유연 (ad-hoc 쿼리 가능)미리 정의된 패턴에 최적
적합한 경우복잡한 쿼리, 유연한 스키마초고속, 대규모, 단순 패턴
간단한 선택 기준: "접근 패턴이 다양하고, 복잡한 쿼리가 필요하며, 스키마가 자주 바뀐다" → MongoDB. "접근 패턴이 단순하고, 한 자릿수 ms 응답이 필수이며, 무한 확장이 필요하다" → DynamoDB.

7. MongoDB 실전 활용

활용 1: 콘텐츠 관리 시스템 (CMS)

블로그, 뉴스, 상품 카탈로그처럼 다양한 형태의 콘텐츠를 저장하는 데 MongoDB가 이상적이다. 블로그 글은 텍스트+이미지, 상품은 가격+스펙+리뷰 — 각각 구조가 다르지만 같은 컬렉션에 저장 가능.

활용 2: IoT 데이터

센서마다 보내는 데이터 구조가 다른 IoT 환경. 온도 센서는 {temp: 25.3}, GPS 센서는 {lat: 37.5, lng: 127.0}, 가속도계는 {x: 0.1, y: -0.3, z: 9.8} — MongoDB의 유연한 스키마가 빛나는 영역.

활용 3: 게임 데이터

게임 캐릭터 데이터는 매우 복잡하고 중첩된 구조: 인벤토리(아이템 목록), 스킬 트리, 퀘스트 진행 상태, 업적... 관계형 DB로는 수십 개의 테이블과 JOIN이 필요하지만, MongoDB에서는 하나의 문서에 모든 것을 담을 수 있다.

활용 4: AI/ML — 벡터 검색

MongoDB Atlas Vector Search는 2023년부터 벡터 검색을 네이티브로 지원한다. 별도의 벡터 DB(Pinecone, Weaviate) 없이, 데이터가 이미 있는 MongoDB에서 직접 유사도 검색이 가능하다.

hljs language-javascript
// Atlas Vector Search
db.products.aggregate([
  {
    $vectorSearch: {
      queryVector: [0.12, -0.34, 0.56, ...],
      path: "embedding",
      numCandidates: 100,
      limit: 10,
      index: "vector_index"
    }
  }
]);

8. MongoDB를 쓰지 말아야 할 때

상황이유대안
복잡한 JOIN이 핵심MongoDB에서 JOIN($lookup)은 비효율적RDS/Aurora
강력한 ACID 트랜잭션4.0부터 지원하지만 관계형 DB보다 제한적Aurora
정형화된 보고서/분석SQL 기반 BI 도구와의 호환성Redshift, Aurora
한 자릿수 ms 응답이 필수DynamoDB가 더 빠르고 예측 가능DynamoDB
이미 관계형 모델이 잘 맞는 경우불필요한 전환 비용기존 RDS/Aurora 유지
💡
"MongoDB vs 관계형 DB"는 잘못된 질문: 둘은 경쟁이 아니라 다른 문제를 해결하는 도구다. "내 데이터가 관계형인가 문서형인가"가 올바른 질문. 사용자-주문-상품의 복잡한 관계 → 관계형. 유연한 JSON 문서 중심의 데이터 → MongoDB. 둘을 함께 쓰는 것(Polyglot Persistence)이 가장 흔한 패턴.

9. 실제 사례

eBay: 상품 카탈로그

eBay는 수십억 개의 상품 리스팅을 MongoDB에 저장한다. 각 상품의 속성이 카테고리마다 완전히 다르기 때문에(전자제품 vs 의류 vs 자동차), 유연한 스키마가 필수.

Forbes: 콘텐츠 관리

Forbes.com의 콘텐츠 관리 시스템은 MongoDB 기반이다. 기사, 비디오, 갤러리, 인포그래픽 — 형태가 다른 콘텐츠를 하나의 시스템에서 관리.

Toyota: 커넥티드 카

Toyota는 수백만 대의 차량에서 발생하는 텔레매틱스 데이터를 MongoDB에 저장한다. 차량마다 센서 구성이 다르고 데이터 구조가 빈번히 변경되므로, 유연한 스키마가 핵심.

한국 기업 사례

  • 카카오: 일부 서비스의 메타데이터 저장에 MongoDB 활용
  • 네이버: LINE 메시지의 일부 메타데이터를 MongoDB에 저장
  • 쿠팡: 상품 카탈로그의 유연한 속성 관리에 문서 DB 패턴 활용
  • 당근마켓: 중고 거래 상품의 다양한 카테고리별 속성을 유연하게 저장

10. MongoDB 비용

MongoDB Atlas 가격

티어특징시작 가격
Free (M0)512MB, 공유 클러스터무료 (영구)
Shared (M2/M5)2~5GB, 공유~$9/월
Dedicated (M10+)전용 클러스터, 풀 기능$57/월
Serverless사용량 과금, 자동 확장읽기 0.10/RU,쓰기0.10/RU, 쓰기 1.00/WU

Amazon DocumentDB 가격

항목비용 (서울)
인스턴스db.r6g.large: ~0.348/시간( 0.348/시간 (~250/월)
스토리지$0.10/GB/월
I/O$0.20/100만 건
백업DB 크기까지 무료
비용 전략: 시작은 Atlas Free Tier(M0, 영구 무료)로. 프로덕션에서는 Atlas Dedicated 또는 Serverless를 워크로드에 맞게 선택. AWS 네이티브 통합이 최우선이면 DocumentDB를 검토.

마치며: 모든 데이터가 테이블에 맞는 건 아니다

이 시리즈에서 다룬 데이터베이스 전체를 최종 정리하면:

데이터 특성추천 DB이유
구조화된 관계형 데이터Aurora/RDSACID, JOIN, SQL
유연한 문서형 데이터MongoDB스키마 자유, 내장 문서, 풍부한 쿼리
초고속 키-값DynamoDBms 미만 응답, 무한 확장
텍스트/벡터 검색OpenSearch역색인, k-NN
대규모 분석 (OLAP)Redshift컬럼나 스토리지, MPP
파일/오브젝트S3무한 스토리지

MongoDB의 위치는 관계형 DB와 DynamoDB 사이다. 관계형보다 유연하고, DynamoDB보다 쿼리가 풍부하다. "테이블 구조가 답답하지만, DynamoDB처럼 단순하지는 않은" 워크로드에 최적이다.

코어닷투데이의 AI 서비스에서도 MongoDB의 유연한 문서 모델은 가치가 있다. AI 모델의 메타데이터(버전별로 구조가 다름), 사용자 피드백(자유 형식), 추론 결과(모델마다 출력 구조가 다름) — 이런 데이터는 관계형 DB에 넣으려면 매번 ALTER TABLE이 필요하지만, MongoDB에서는 그냥 저장하면 된다.

ALTER TABLE의 공포에서 벗어나는 것 — 그것이 MongoDB를 선택하는 가장 솔직한 이유다.