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

ALTER TABLE 없이 데이터 구조를 자유롭게 바꾸고, JSON을 그대로 저장하며, 수평 확장이 기본인 DB. MongoDB가 왜 탄생했고, 관계형 DB와 무엇이 다르며, 언제 써야 하고 쓰지 말아야 하는지를 라이선스 전쟁과 보안 사고까지 포함하여 풀어본다.
관계형 DB를 쓰다 보면 반드시 만나는 공포:
ALTER TABLE users ADD COLUMN phone_number VARCHAR(20);
사용자 테이블에 전화번호 열을 추가한다. 단순해 보이지만:
그리고 이런 상황도 있다. 초기 스타트업이 MVP를 만든다. 데이터 구조가 매주 바뀐다. "사용자에게 주소가 필요해" → ALTER TABLE. "주소에 위도/경도도 넣자" → ALTER TABLE. "위시리스트 기능 추가" → 새 테이블 + JOIN...
"데이터 구조를 미리 정하지 않아도 되는 DB는 없을까?"
이것이 문서형 데이터베이스(Document Database) 의 핵심 아이디어이고, 그 대표가 MongoDB다.
MongoDB의 창시자 Dwight Merriman과 Eliot Horowitz는 2000년대 초반 DoubleClick(인터넷 광고 플랫폼, 현재 Google Ad Manager)을 운영했다.
DoubleClick은 하루에 수십억 건의 광고 노출 이벤트를 처리해야 했다. 관계형 DB에서 이 규모를 처리하려니:
2007년, 두 사람은 10gen이라는 회사를 설립하고 이 문제를 해결하기 위한 새로운 DB를 만들기 시작했다. 이름은 MongoDB — "humongous"(거대한)에서 따왔다. 거대한 규모의 데이터를 처리하겠다는 의지.
2009년 2월, MongoDB를 오픈소스로 공개했다. 핵심 설계 원칙:
사용자와 주문 데이터를 저장한다고 하자:
관계형 DB (RDS/Aurora):
3개 테이블, JOIN으로 연결:
-- 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:
하나의 문서에 모든 것:
{
"_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).
MongoDB에 "스키마가 없다"는 것은 DB가 스키마를 강제하지 않는다는 뜻이지, 스키마 없이 개발해도 된다는 뜻이 아니다.
| 관계형 DB | MongoDB | 설명 |
|---|---|---|
| 데이터베이스 | 데이터베이스 | 동일 |
| 테이블 | 컬렉션(Collection) | 문서의 그룹 |
| 행(Row) | 문서(Document) | BSON(Binary JSON) 형태의 레코드 |
| 열(Column) | 필드(Field) | 문서 내의 키-값 쌍 |
| JOIN | 내장(Embedding) / 참조(Reference) | 관련 데이터 접근 방식 |
| PRIMARY KEY | _id | 자동 생성 ObjectId |
// 생성 (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의 인덱스와 개념은 같다:
// 단일 필드 인덱스
db.users.createIndex({ email: 1 });
// 복합 인덱스
db.orders.createIndex({ userId: 1, orderDate: -1 });
// 텍스트 인덱스 (풀텍스트 검색)
db.products.createIndex({ name: "text", description: "text" });
explain()으로 쿼리 실행 계획을 확인하고, COLLSCAN(전체 스캔)이 나오면 인덱스를 추가하라.MongoDB는 OpenSearch 글에서 다룬 Elasticsearch와 함께 역사상 가장 많이 해킹된 데이터베이스 중 하나다. 이유: 초기 버전의 기본 설정에 인증이 없었다.
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의 코드를 무료로 가져다 쓰면서 수익은 클라우드 사업자가 가져가는 구조.
2019년 1월, AWS는 Amazon DocumentDB를 출시했다. "MongoDB API와 호환되는" 관리형 문서 DB. 하지만 MongoDB의 코드를 사용하지 않고 자체 구현.
MongoDB Atlas는 MongoDB Inc.가 운영하는 완전 관리형 MongoDB 서비스. AWS, Azure, GCP 위에서 실행되지만, MongoDB Inc.가 직접 관리한다.
핵심 기능:
이 시리즈의 DynamoDB 글과 비교:
| 기준 | MongoDB | DynamoDB |
|---|---|---|
| 데이터 모델 | 문서 (유연한 JSON) | 키-값 + 문서 |
| 쿼리 | 풍부한 쿼리 언어 (필터, 집계, JOIN) | 키 기반 조회 위주 |
| 인덱스 | 다양 (복합, 텍스트, 지리공간, 벡터) | GSI/LSI (제한적) |
| 스케일링 | 샤딩 (수동/자동) | 자동 파티셔닝 |
| 지연 시간 | 수 ms | 한 자릿수 ms (규모 불변) |
| 트랜잭션 | 멀티 문서 ACID (4.0~) | 제한적 트랜잭션 |
| 서버리스 | Atlas Serverless | 온디맨드 모드 |
| 접근 패턴 | 유연 (ad-hoc 쿼리 가능) | 미리 정의된 패턴에 최적 |
| 적합한 경우 | 복잡한 쿼리, 유연한 스키마 | 초고속, 대규모, 단순 패턴 |
블로그, 뉴스, 상품 카탈로그처럼 다양한 형태의 콘텐츠를 저장하는 데 MongoDB가 이상적이다. 블로그 글은 텍스트+이미지, 상품은 가격+스펙+리뷰 — 각각 구조가 다르지만 같은 컬렉션에 저장 가능.
센서마다 보내는 데이터 구조가 다른 IoT 환경. 온도 센서는 {temp: 25.3}, GPS 센서는 {lat: 37.5, lng: 127.0}, 가속도계는 {x: 0.1, y: -0.3, z: 9.8} — MongoDB의 유연한 스키마가 빛나는 영역.
게임 캐릭터 데이터는 매우 복잡하고 중첩된 구조: 인벤토리(아이템 목록), 스킬 트리, 퀘스트 진행 상태, 업적... 관계형 DB로는 수십 개의 테이블과 JOIN이 필요하지만, MongoDB에서는 하나의 문서에 모든 것을 담을 수 있다.
MongoDB Atlas Vector Search는 2023년부터 벡터 검색을 네이티브로 지원한다. 별도의 벡터 DB(Pinecone, Weaviate) 없이, 데이터가 이미 있는 MongoDB에서 직접 유사도 검색이 가능하다.
// Atlas Vector Search
db.products.aggregate([
{
$vectorSearch: {
queryVector: [0.12, -0.34, 0.56, ...],
path: "embedding",
numCandidates: 100,
limit: 10,
index: "vector_index"
}
}
]);
| 상황 | 이유 | 대안 |
|---|---|---|
| 복잡한 JOIN이 핵심 | MongoDB에서 JOIN($lookup)은 비효율적 | RDS/Aurora |
| 강력한 ACID 트랜잭션 | 4.0부터 지원하지만 관계형 DB보다 제한적 | Aurora |
| 정형화된 보고서/분석 | SQL 기반 BI 도구와의 호환성 | Redshift, Aurora |
| 한 자릿수 ms 응답이 필수 | DynamoDB가 더 빠르고 예측 가능 | DynamoDB |
| 이미 관계형 모델이 잘 맞는 경우 | 불필요한 전환 비용 | 기존 RDS/Aurora 유지 |
eBay는 수십억 개의 상품 리스팅을 MongoDB에 저장한다. 각 상품의 속성이 카테고리마다 완전히 다르기 때문에(전자제품 vs 의류 vs 자동차), 유연한 스키마가 필수.
Forbes.com의 콘텐츠 관리 시스템은 MongoDB 기반이다. 기사, 비디오, 갤러리, 인포그래픽 — 형태가 다른 콘텐츠를 하나의 시스템에서 관리.
Toyota는 수백만 대의 차량에서 발생하는 텔레매틱스 데이터를 MongoDB에 저장한다. 차량마다 센서 구성이 다르고 데이터 구조가 빈번히 변경되므로, 유연한 스키마가 핵심.
| 티어 | 특징 | 시작 가격 |
|---|---|---|
| Free (M0) | 512MB, 공유 클러스터 | 무료 (영구) |
| Shared (M2/M5) | 2~5GB, 공유 | ~$9/월 |
| Dedicated (M10+) | 전용 클러스터, 풀 기능 | |
| Serverless | 사용량 과금, 자동 확장 | 읽기 1.00/WU |
| 항목 | 비용 (서울) |
|---|---|
| 인스턴스 | db.r6g.large: ~250/월) |
| 스토리지 | $0.10/GB/월 |
| I/O | $0.20/100만 건 |
| 백업 | DB 크기까지 무료 |
이 시리즈에서 다룬 데이터베이스 전체를 최종 정리하면:
| 데이터 특성 | 추천 DB | 이유 |
|---|---|---|
| 구조화된 관계형 데이터 | Aurora/RDS | ACID, JOIN, SQL |
| 유연한 문서형 데이터 | MongoDB | 스키마 자유, 내장 문서, 풍부한 쿼리 |
| 초고속 키-값 | DynamoDB | ms 미만 응답, 무한 확장 |
| 텍스트/벡터 검색 | OpenSearch | 역색인, k-NN |
| 대규모 분석 (OLAP) | Redshift | 컬럼나 스토리지, MPP |
| 파일/오브젝트 | S3 | 무한 스토리지 |
MongoDB의 위치는 관계형 DB와 DynamoDB 사이다. 관계형보다 유연하고, DynamoDB보다 쿼리가 풍부하다. "테이블 구조가 답답하지만, DynamoDB처럼 단순하지는 않은" 워크로드에 최적이다.
코어닷투데이의 AI 서비스에서도 MongoDB의 유연한 문서 모델은 가치가 있다. AI 모델의 메타데이터(버전별로 구조가 다름), 사용자 피드백(자유 형식), 추론 결과(모델마다 출력 구조가 다름) — 이런 데이터는 관계형 DB에 넣으려면 매번 ALTER TABLE이 필요하지만, MongoDB에서는 그냥 저장하면 된다.
ALTER TABLE의 공포에서 벗어나는 것 — 그것이 MongoDB를 선택하는 가장 솔직한 이유다.