MongoDB를 실무 흐름으로 이해하기
관계형 데이터베이스의 한계를 극복하는 NoSQL 대표 주자 MongoDB를 학습합니다. 스키마리스 문서형 모델(BSON), CRUD, Aggregation Pipeline을 이용한 복잡한 데이터 파이프라인 처리, 그리고 대용량 처리를 위한 Sharding/Replica Set 구성을 배웁니다. 이 가이드는 개념을 나열하기보다, 실제 프로젝트에서 판단해야 하는 순서대로 내용을 따라갈 수 있게 구성했습니다.
관계형 데이터베이스의 한계를 극복하는 NoSQL 대표 주자 MongoDB를 학습합니다. 스키마리스 문서형 모델(BSON), CRUD, Aggregation Pipeline을 이용한 복잡한 데이터 파이프라인 처리, 그리고 대용량 처리를 위한 Sharding/Replica Set 구성을 배웁니다.
관계형 데이터베이스의 한계를 극복하는 NoSQL 대표 주자 MongoDB를 학습합니다. 스키마리스 문서형 모델(BSON), CRUD, Aggregation Pipeline을 이용한 복잡한 데이터 파이프라인 처리, 그리고 대용량 처리를 위한 Sharding/Replica Set 구성을 배웁니다. 이 가이드는 개념을 나열하기보다, 실제 프로젝트에서 판단해야 하는 순서대로 내용을 따라갈 수 있게 구성했습니다.
쿼리 문법과 함께 스키마 설계, 인덱스, 트랜잭션, 권한, 백업까지 운영 관점으로 봅니다.
글로 읽은 내용을 머릿속에 오래 남기려면 먼저 흐름을 그림으로 잡는 편이 좋습니다. 아래 두 그림은 MongoDB를 학습할 때 계속 되돌아볼 수 있는 기준 지도입니다.
MongoDB를 처음 펼칠 때는 세부 명령보다 큰 그림이 먼저입니다. 이 섹션에서는 앞으로 배울 개념들이 어떤 문제를 풀기 위해 등장했는지부터 잡아봅니다.
{
"_id": "507f1f77bcf86cd799439011",
"name": "Jane Doe",
"age": 28,
"skills": ["JavaScript", "Python"],
"contact": {
"email": "jane@example.com",
"phone": "010-1234-5678"
},
"created_at": "2026-06-13T02:00:00Z"
}여기서는 MongoDB CRUD 명령어을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
// 1. Insert
db.users.insertOne({ name: "Alice", age: 30, active: true });
// 2. Read (나이가 25세 이상인 활성 사용자 조회)
db.users.find({ age: { $gte: 25 }, active: true });
// 3. Update (이름이 Alice인 사용자의 나이를 1 증가)
db.users.updateOne({ name: "Alice" }, { $inc: { age: 1 } });
// 4. Delete
db.users.deleteOne({ name: "Alice" });여기서는 집계 파이프라인 (Aggregation)을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
db.orders.aggregate([
// 1단계: 완료(completed) 상태의 주문 필터링
{ $match: { status: "completed" } },
// 2단계: 고객(customerId) 별로 그룹화하여 총 금액 합산
{ $group: { _id: "$customerId", totalAmount: { $sum: "$price" }, count: { $sum: 1 } } },
// 3단계: 총 주문금액이 100 이상인 그룹만 필터링
{ $match: { totalAmount: { $gte: 100 } } },
// 4단계: 총 주문금액 내림차순 정렬
{ $sort: { totalAmount: -1 } }
]);여기서는 인덱스 튜닝 & TTL을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
// 1. 단일 인덱스 생성
db.users.createIndex({ age: 1 });
// 2. 복합 인덱스 생성
db.users.createIndex({ active: 1, age: -1 });
// 3. TTL 인덱스 (로그 컬렉션에 30일(2592000초) 후 자동 삭제 설정)
db.logs.createIndex({ created_at: 1 }, { expireAfterSeconds: 2592000 });
// 4. 실행 계획 확인
db.users.find({ age: 30 }).explain("executionStats");Replica Set & Sharding은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 아키텍처 모델 | 구조 특징 | 주요 목적 |
|---|---|---|
| Replica Set (복제 셋) | Primary 노드(1개) + Secondary 노드(여러 개) | 고가용성(HA), 데이터 이중화, Primary 다운 시 자동 Failover |
| Sharding (샤딩 분산) | Mongos 라우터, Config 서버, Shard 노드들 | 수평적 쓰기/읽기 분산, 테라바이트급 빅데이터 파티셔닝 적재 |
여기서는 MongoDB 역할 기반 접근 제어 (RBAC)을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
// 1. 관리자 데이터베이스(admin)로 전환 후 읽기/쓰기 권한을 제약한 전용 사용자 생성
use admin;
db.createUser({
user: "app_service_user",
pwd: "securePassword123",
roles: [
// mydb 데이터베이스에 대해 읽기 및 쓰기 권한 부여
{ role: "readWrite", db: "mydb" },
// mydb 데이터베이스의 인덱스 생성 및 프로파일러 관리 권한 부여
{ role: "dbAdmin", db: "mydb" }
]
});
// 2. MongoDB의 대표적인 내장 역할(Built-in Roles)
// - read: 데이터 조회 권한
// - readWrite: 데이터 조회 및 추가/수정/삭제 권한
// - dbAdmin: 스키마 정보 확인, 인덱스 생성, 통계 분석 등 관리 권한
// - userAdmin: 사용자 생성, 권한 부여/회수 권한 (보안 위험 높음)
// - dbOwner: readWrite, dbAdmin, userAdmin의 모든 권한 포함
// - root: admin DB 전용, 클러스터 전체 및 모든 데이터베이스 통제 권한
// 3. 내 권한 상태 조회
db.runCommand({ connectionStatus: 1 });MongoDB 실무 설계은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 결정 지점 | 확인 질문 | 실무 기준 |
|---|---|---|
| 경계 | MongoDB 코드에서 바뀌기 쉬운 부분은 어디인가? | 입출력, 설정, 외부 연동, 핵심 규칙을 분리합니다. |
| 상태 | 상태가 어디서 생성되고 어디서 사라지는가? | 상태 소유자와 수명 주기를 코드로 드러냅니다. |
| 장애 | 실패했을 때 호출자는 무엇을 받는가? | timeout, fallback, error contract를 먼저 정합니다. |
이 섹션은 MongoDB 운영 기준을 실무 관점에서 정리합니다. 개념을 외우기보다, 어떤 상황에서 이 기준을 꺼내 쓸지에 초점을 맞춰보세요.
MongoDB 검증 전략은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 품질 축 | 검증 방법 | 완료 기준 |
|---|---|---|
| 정확성 | 정상/실패 케이스를 자동화합니다. | 핵심 시나리오가 재현 가능하게 통과합니다. |
| 회귀 방지 | 버그 수정 시 동일 케이스를 테스트로 남깁니다. | 같은 장애가 다시 배포되지 않습니다. |
| 운영성 | 로그, 메트릭, 알림을 확인합니다. | 문제가 생겼을 때 원인 추적 경로가 있습니다. |