MongoDB Reference
MongoDB 데이터베이스 레퍼런스
MongoDB Reference 소개
MongoDB 레퍼런스는 MongoDB의 모든 필수 작업을 여덟 가지 카테고리로 정리한 완전한 검색형 가이드입니다: CRUD(insertOne, insertMany, find, findOne, updateOne, updateMany, deleteOne, deleteMany, replaceOne), 집계 파이프라인($match, $group, $sort, $project, $lookup, $unwind), 인덱스(createIndex, 복합 인덱스, 텍스트 인덱스, TTL 인덱스), 스키마 검증($jsonSchema, validationLevel, 내장 문서, 참조 패턴), 복제(rs.initiate, rs.status, rs.add, rs.stepDown, 읽기 우선순위), 샤딩(sh.enableSharding, sh.shardCollection, 범위/해시 샤딩), 보안(createUser, 역할 기반 접근, TLS/SSL, 감사 로그), 관리(mongodump, mongorestore, db.stats, db.currentOp, explain).
백엔드 개발자, 데이터 엔지니어, 데이터베이스 관리자들은 전자상거래 카탈로그, 사용자 프로필, IoT 센서 데이터, 콘텐츠 관리 시스템 등 다양한 애플리케이션에 MongoDB를 유연한 문서 데이터베이스로 사용합니다. MongoDB의 문서 모델은 데이터를 BSON(Binary JSON)으로 저장하여 엄격한 스키마 강제 없이 중첩 객체와 배열을 허용합니다. 집계 파이프라인은 강력한 데이터 변환 기능을 제공합니다 — $lookup은 컬렉션 간 조인을 가능하게 하고, $group은 그룹별 합계와 카운트를 계산하며, $project는 출력 문서를 재구성합니다.
이 레퍼런스는 복잡한 집계 파이프라인 구성, 스키마 설계를 위한 내장 문서와 참조 패턴 선택, 자동 장애 조치가 있는 고가용성을 위한 레플리카 셋 설정, 여러 서버에 걸친 수평 확장을 위한 샤딩 구성, EXPLAIN을 사용한 쿼리 실행 계획 분석 시 특히 유용합니다. 각 항목에는 users, orders, sessions 같은 컬렉션을 사용하는 현실적인 사용 예제가 포함됩니다.
주요 기능
- 8개 카테고리: CRUD, 집계, 인덱스, 스키마, 복제, 샤딩, 보안, 관리
- 전체 CRUD: insertOne/insertMany, find/findOne, updateOne/updateMany($set/$inc), deleteOne/deleteMany, replaceOne
- 집계 파이프라인 스테이지: $match, $group($sum), $sort, $project($toUpper), $lookup(컬렉션 조인), $unwind
- 인덱스 유형: 단일 필드(unique), 복합(다중 필드), 텍스트(전문 검색), TTL(자동 만료), getIndexes/dropIndex 포함
- $jsonSchema를 이용한 스키마 검증: bsonType, required 필드, 속성 제약, validationLevel/validationAction
- 레플리카 셋: 다중 멤버 설정으로 rs.initiate(), rs.status(), rs.add(), rs.stepDown(), 읽기 우선순위
- 샤딩: sh.enableSharding(), sh.shardCollection(), 범위 기반 vs 해시 기반 샤드 키 전략
- 관리 도구: 백업/복원용 mongodump/mongorestore, 실행 중인 쿼리 모니터링 db.currentOp(), explain("executionStats")
자주 묻는 질문
MongoDB에서 insertOne()과 insertMany()의 차이는 무엇인가요?
insertOne()은 단일 문서를 삽입하고 삽입된 문서의 _id를 반환합니다. insertMany()는 문서 배열을 받아 한 번의 작업으로 모두 삽입하고 삽입된 ID 배열을 반환합니다. 대량 임포트의 경우 insertMany()가 루프 안에서 insertOne()을 반복 호출하는 것보다 훨씬 빠릅니다. 쓰기를 더 적은 네트워크 왕복으로 묶기 때문입니다.
MongoDB 집계 파이프라인은 어떻게 동작하나요?
집계 파이프라인은 각 스테이지가 입력 문서를 변환하고 그 결과를 다음 스테이지로 전달하는 일련의 단계입니다. 주요 스테이지로는 $match(SQL의 WHERE처럼 문서 필터), $group(GROUP BY처럼 값 집계), $sort(결과 정렬), $project(SELECT처럼 필드 재구성), $lookup(다른 컬렉션과 조인), $unwind(배열을 개별 문서로 분해) 등이 있습니다.
집계 파이프라인에서 $lookup은 언제 사용하나요?
$lookup은 두 컬렉션 간 좌측 외부 조인을 수행합니다. 예를 들어 orders를 users와 조인: { $lookup: { from: "users", localField: "userId", foreignField: "_id", as: "user" } }. 스키마가 참조 패턴(ObjectId 참조 저장)을 사용하고 단일 쿼리 결과에서 여러 컬렉션의 데이터를 합쳐야 할 때 $lookup을 사용하세요.
MongoDB의 TTL 인덱스란 무엇이고 어떻게 만드나요?
TTL(Time-To-Live) 인덱스는 지정된 초가 지나면 문서를 자동으로 삭제합니다. Date 필드에 다음과 같이 생성합니다: db.sessions.createIndex({ createdAt: 1 }, { expireAfterSeconds: 3600 }). 이렇게 하면 createdAt 타임스탬프로부터 한 시간 후 세션 문서가 삭제됩니다. TTL 인덱스는 세션 관리, 캐시 항목, 로그 순환에 일반적으로 사용됩니다.
MongoDB에서 내장 문서 패턴과 참조 패턴의 차이는 무엇인가요?
내장 문서 패턴은 관련 데이터를 같은 문서 안에 저장합니다(예: 사용자 문서 안에 주소 내장). 모든 것이 한 번의 쿼리로 조회되므로 읽기가 빠릅니다. 참조 패턴은 별도의 문서를 저장하고 ObjectId로 연결하며, 외래 키와 유사합니다. 항상 함께 읽는 일대일 또는 일대소수 관계에는 내장을, 일대다 관계나 여러 부모 문서에서 공유되는 데이터에는 참조를 사용하세요.
MongoDB 레플리카 셋은 어떻게 설정하나요?
셋 이름과 멤버 호스트를 지정한 구성 객체로 rs.initiate()를 실행합니다: rs.initiate({ _id: "myReplicaSet", members: [{ _id: 0, host: "mongo1:27017" }, { _id: 1, host: "mongo2:27017" }, { _id: 2, host: "mongo3:27017" }] }). MongoDB가 한 멤버를 프라이머리로, 나머지를 세컨더리로 선출합니다. rs.status()로 상태를 확인하고, 애플리케이션은 모든 레플리카 셋 멤버를 나열한 연결 문자열로 접속합니다.
범위 샤딩과 해시 샤딩의 차이는 무엇인가요?
범위 샤딩은 샤드 키의 값 범위에 따라 문서를 샤드에 분산합니다 — 예를 들어 타임스탬프를 사용해 최신 데이터가 특정 샤드에 배치되도록 합니다. 범위 쿼리에 효율적이지만 데이터가 순차적으로 쓰이면 핫스팟이 생길 수 있습니다. 해시 샤딩은 샤드 키 값을 해시하여 문서를 샤드에 더 균일하게 분산시키고 쓰기 핫스팟을 방지합니다. 사용자 ID처럼 무작위로 분산되는 키에는 해시 샤딩을 사용하세요.
느린 MongoDB 쿼리를 explain()으로 어떻게 분석하나요?
db.collection.find(쿼리).explain("executionStats")를 실행하면 MongoDB가 쿼리를 실행하는 방법을 볼 수 있습니다. "executionStats" 섹션에서 "totalKeysExamined"는 스캔된 인덱스 키 수, "totalDocsExamined"는 로드된 문서 수, "nReturned"는 반환된 수를 보여줍니다. totalDocsExamined가 nReturned보다 훨씬 크면 효율적인 인덱스가 없는 것입니다. "winningPlan" 섹션에서 인덱스 스캔(IXSCAN)이 사용되었는지 전체 컬렉션 스캔(COLLSCAN)이 사용되었는지 확인할 수 있습니다.