소개
MongoDB 면접 질문 및 답변에 대한 포괄적인 가이드에 오신 것을 환영합니다! 숙련된 전문가로서 지식을 새로 고치거나 첫 MongoDB 역할을 준비하는 신규 사용자이든 관계없이 이 문서는 여러분이 탁월한 성과를 내는 데 필요한 통찰력을 제공하도록 설계되었습니다. 기본 개념 및 고급 기능부터 관리, 성능 튜닝 및 문제 해결에 이르기까지 광범위한 주제를 세심하게 선별했습니다. 시나리오 기반 도전 과제, 실용적인 작업 및 다양한 역할에 맞춰진 전문 콘텐츠를 탐색하여 모든 MongoDB 관련 면접에 잘 대비할 수 있도록 하십시오. MongoDB 마스터링 여정에 행운을 빕니다!

MongoDB 기본 및 핵심 개념
MongoDB 란 무엇이며 어떤 종류의 데이터베이스인가요?
답변:
MongoDB 는 인기 있는 오픈 소스 NoSQL 데이터베이스 프로그램입니다. 문서 지향 데이터베이스로, 전통적인 테이블과 행/열 대신 유연하고 JSON 과 유사한 문서에 데이터를 저장합니다. 이러한 스키마 없는 디자인은 데이터 구조의 빠른 개발과 진화를 가능하게 합니다.
MongoDB 에서 '문서 (document)'의 개념을 설명해주세요.
답변:
MongoDB 에서 문서는 데이터의 기본 단위로, 관계형 데이터베이스의 행과 유사합니다. 문서는 BSON(Binary JSON) 객체이며, 풍부하고 유연하며 포함된 문서와 배열을 포함할 수 있습니다. 각 문서는 고유한 _id 필드를 가집니다.
MongoDB 에서 '컬렉션 (collection)'이란 무엇인가요?
답변:
MongoDB 의 컬렉션은 문서들의 그룹입니다. 관계형 데이터베이스의 테이블과 유사하지만, 테이블과 달리 컬렉션은 스키마를 강제하지 않습니다. 컬렉션 내의 문서들은 서로 다른 필드와 구조를 가질 수 있어 스키마 유연성을 제공합니다.
MongoDB 는 어떻게 고가용성 및 데이터 중복성을 달성하나요?
답변:
MongoDB 는 복제 세트 (replica sets) 를 통해 고가용성 및 데이터 중복성을 달성합니다. 복제 세트는 동일한 데이터 세트를 유지하는 MongoDB 인스턴스들의 그룹입니다. 모든 쓰기 작업을 받는 하나의 주 (primary) 노드와 주 노드로부터 데이터를 복제하는 여러 개의 보조 (secondary) 노드로 구성되어 자동 장애 조치 (failover) 를 제공합니다.
MongoDB 의 샤딩 (sharding) 이란 무엇이며 왜 사용되나요?
답변:
샤딩은 매우 큰 데이터 세트와 높은 처리량 작업을 지원하기 위해 데이터를 여러 머신 (샤드) 에 분산시키는 방법입니다. 데이터를 분할하고 로드를 분산하여 단일 서버의 한계를 극복함으로써 MongoDB 가 수평적으로 확장할 수 있도록 합니다.
MongoDB 의 _id와 관계형 데이터베이스의 기본 키 (primary key) 의 차이점을 설명해주세요.
답변:
MongoDB 의 _id 필드는 기본 키와 유사하게 각 문서의 고유 식별자입니다. 그러나 _id는 자동으로 인덱싱되며 정수뿐만 아니라 다양한 데이터 유형이 될 수 있습니다. 전통적인 기본 키와 달리 MongoDB 의 _id는 종종 분산 시스템을 위해 설계된 12 바이트 BSON 유형인 ObjectId 입니다.
MongoDB 에서 인덱스 (indexes) 의 목적은 무엇인가요?
답변:
MongoDB 의 인덱스는 컬렉션 데이터의 일부를 쉽게 탐색할 수 있는 형태로 저장하는 특수 데이터 구조입니다. 이를 통해 데이터베이스는 컬렉션의 모든 문서를 스캔하지 않고도 문서를 빠르게 찾을 수 있어 읽기 작업의 효율성을 향상시킵니다. 인덱스가 없으면 MongoDB 는 컬렉션 스캔을 수행해야 합니다.
mongo 셸을 사용하여 MongoDB 컬렉션에 단일 문서를 삽입하는 방법은 무엇인가요?
답변:
단일 문서를 삽입하려면 insertOne() 메서드를 사용합니다. 예를 들어: db.mycollection.insertOne({ name: 'Alice', age: 30, city: 'New York' }); 이 명령은 mycollection 컬렉션에 새 문서를 추가합니다.
MongoDB 에서 문서를 쿼리하는 방법은 무엇인가요?
답변:
문서는 find() 메서드를 사용하여 쿼리하며, 이 메서드는 쿼리 필터 문서를 첫 번째 인수로 받습니다. 예를 들어, db.users.find({ age: { $gt: 25 } })는 25 세 이상의 모든 사용자를 검색합니다. 두 번째 인수는 반환될 필드를 지정하는 프로젝션 (projection) 이 될 수 있습니다.
MongoDB 의 집계 프레임워크 (Aggregation Framework) 란 무엇인가요?
답변:
MongoDB 집계 프레임워크는 레코드 데이터를 처리하고 계산된 결과를 반환하는 강력한 도구입니다. 파이프라인 개념을 사용하여 문서가 일련의 단계를 통과하면서 (예: $match, $group, $project, $sort) 데이터를 변환하고 집계합니다. 이는 SQL 의 GROUP BY 절과 유사합니다.
고급 MongoDB 기능 및 개발
MongoDB 집계 프레임워크의 목적과 이점을 설명해주세요.
답변:
집계 프레임워크는 데이터 레코드를 처리하고 계산된 결과를 반환합니다. 데이터베이스 내에서 복잡한 데이터 변환, 필터링, 그룹화 및 분석을 가능하게 하여 클라이언트 측 처리의 필요성을 줄이고 분석 쿼리의 성능을 향상시킵니다.
MongoDB 의 트랜잭션이란 무엇이며 언제 사용해야 하나요?
답변:
MongoDB 는 복제 세트 및 샤딩된 클러스터 전반에 걸쳐 다중 문서 ACID 트랜잭션을 지원합니다. 이는 여러 문서 또는 컬렉션과 관련된 작업에 대한 데이터 일관성 및 원자성 (atomicity) 을 보장하며, 모든 작업이 함께 성공하거나 실패해야 하는 금융 거래 또는 재고 관리와 같은 경우에 중요합니다.
MongoDB 의 변경 스트림 (Change Streams) 개념과 실제 사용 사례를 설명해주세요.
답변:
변경 스트림을 통해 애플리케이션은 컬렉션, 데이터베이스 또는 배포에서 발생하는 실시간 데이터 변경 (삽입, 업데이트, 삭제) 에 액세스할 수 있습니다. 실제 사용 사례로는 실시간 분석 대시보드, 시스템 간 데이터 동기화 또는 데이터 수정에 기반한 즉각적인 작업 트리거 등이 있습니다.
MongoDB 에서 스키마 유효성 검사 (schema validation) 는 어떻게 처리하나요?
답변:
MongoDB 는 JSON 스키마를 사용하여 스키마 유효성 검사를 지원합니다. 컬렉션 수준에서 유효성 검사 규칙을 정의하여 삽입되거나 업데이트되는 문서가 지정된 구조 및 데이터 유형을 준수하도록 할 수 있습니다. 이는 데이터 무결성 및 일관성을 유지하는 데 도움이 됩니다.
MongoDB 의 샤딩 (sharding) 이란 무엇이며 왜 사용되나요?
답변:
샤딩은 매우 큰 데이터 세트와 높은 처리량 작업을 지원하기 위해 데이터를 여러 머신 (샤드) 에 분산시키는 방법입니다. 이는 수평적 확장을 가능하게 하여 MongoDB 가 단일 서버보다 더 많은 데이터와 트래픽을 처리할 수 있도록 합니다.
커버드 쿼리 (covered query) 와 인덱스 전용 계획 (index-only plan) 의 차이점을 설명해주세요.
답변:
커버드 쿼리는 쿼리 및 쿼리 술어 (WHERE 절) 에서 요청된 모든 필드가 인덱스에 포함된 쿼리입니다. 이는 MongoDB 가 실제 문에 액세스하지 않고도 인덱스에서 직접 결과를 반환할 수 있음을 의미하며, 상당한 성능 향상을 가져옵니다.
GridFS 란 무엇이며 일반적인 사용 사례는 무엇인가요?
답변:
GridFS 는 MongoDB 에 대용량 파일 (이미지, 오디오, 비디오 등) 을 저장하고 검색하기 위한 사양입니다. 파일을 청크 (chunk) 로 분할하고 각 청크를 별도의 문서로 저장합니다. 일반적으로 다른 데이터와 함께 파일을 저장해야 하거나 파일 시스템이 대용량 이진 데이터에 적합하지 않은 경우에 사용됩니다.
MongoDB 에서 쓰기 작업의 성능을 최적화하는 방법은 무엇인가요?
답변:
쓰기 작업 최적화에는 적절한 쓰기 고려 사항 (예: 즉시 완료를 위한 w: 0, 기본 승인을 위한 w: 1) 사용, bulkWrite()를 사용한 쓰기 일괄 처리, 업데이트 또는 삽입 중 컬렉션 스캔을 피하기 위한 효율적인 인덱싱 보장 등이 포함됩니다. 또한 높은 쓰기 처리량을 위해 샤딩을 고려하십시오.
MongoDB 에서 텍스트 인덱스 (text index) 는 언제 사용해야 하나요?
답변:
텍스트 인덱스는 문서 내의 문자열 콘텐츠에 대한 텍스트 검색 쿼리를 지원하는 데 사용됩니다. 이는 어간 추출 (stemming) 및 불용어 제거 (stop word removal) 를 포함하여 단어 및 구문에 대한 효율적인 검색을 가능하게 합니다. 제품 설명 또는 기사 콘텐츠와 같은 검색 기능을 구현하는 데 이상적입니다.
TTL 인덱스 (TTL index) 의 개념과 적용 사례를 설명해주세요.
답변:
TTL(Time-To-Live) 인덱스는 MongoDB 가 특정 시간 경과 후 또는 특정 시계 시간에 컬렉션에서 문서를 자동으로 제거하는 데 사용하는 특수한 단일 필드 인덱스입니다. 일반적으로 만료되는 세션 데이터, 로그 데이터 또는 임시 캐시를 관리하는 데 사용됩니다.
MongoDB 관리 및 운영
MongoDB 에서 백업 및 복구를 수행하는 방법은 무엇인가요?
답변:
백업은 일반적으로 BSON 파일을 생성하기 위해 mongodump를 사용하고, 복원은 mongorestore를 사용하여 수행합니다. 복제 세트의 경우, 주 서버 성능에 영향을 미치지 않도록 보조 서버에서 덤프하는 것이 좋습니다. 샤딩된 클러스터의 경우, mongodump는 mongos 인스턴스에 대해 실행해야 합니다.
MongoDB Oplog 의 목적을 설명해주세요. 복제와는 어떻게 관련되나요?
답변:
Oplog(operations log) 는 주 서버 데이터 세트에 적용된 모든 쓰기 작업을 기록하는 특수 캐시 컬렉션입니다. 보조 서버는 주 서버의 oplog 를 지속적으로 추적하고 이러한 작업을 자체 데이터 세트에 적용하여 데이터 일관성을 보장하고 복제를 가능하게 합니다.
MongoDB 에서 복제 세트와 샤딩의 차이점은 무엇인가요?
답변:
복제 세트는 데이터의 여러 복사본을 유지하여 고가용성 및 데이터 중복성을 제공합니다. 샤딩은 데이터를 여러 서버 (샤드) 에 분산시켜 수평적 확장을 제공하며, 더 큰 데이터 세트와 더 높은 처리량을 처리할 수 있도록 합니다.
MongoDB 인스턴스의 성능을 어떻게 모니터링하나요?
답변:
주요 도구로는 실시간 통계를 위한 mongostat, 컬렉션별 읽기/쓰기 활동을 위한 mongotop, 상세 서버 메트릭을 위한 db.serverStatus()가 있습니다. MongoDB Atlas Monitoring 또는 타사 도구와 같은 클라우드 모니터링 솔루션도 일반적으로 사용됩니다.
기존 MongoDB 복제 세트에 새 멤버를 추가하는 단계를 설명해주세요.
답변:
먼저 올바른 복제 세트 이름으로 새 mongod 인스턴스를 시작합니다. 그런 다음 주 서버에 연결하고 rs.add('hostname:port')를 사용하여 새 멤버를 추가합니다. 새 멤버는 기존 멤버로부터 데이터를 동기화하기 시작합니다.
MongoDB 에서 느린 쿼리의 일반적인 원인과 문제 해결 방법은 무엇인가요?
답변:
일반적인 원인으로는 누락되거나 비효율적인 인덱스, 대규모 컬렉션 스캔, 비효율적인 쿼리 패턴 등이 있습니다. 문제 해결에는 db.collection.explain()을 사용하여 쿼리 실행 계획을 분석하고 전체 컬렉션 스캔을 수행하거나 비효율적인 인덱스를 사용하는 쿼리를 식별하는 것이 포함됩니다.
MongoDB 에서 보안을 어떻게 처리하나요? 몇 가지 모범 사례는 무엇인가요?
답변:
보안에는 인증 (SCRAM-SHA-256) 활성화, 역할 기반 액세스 제어 (RBAC) 구현, 전송 중 암호화를 위한 TLS/SSL 활성화, 네트워크 격리 보장 등이 포함됩니다. 감사 및 정기적인 보안 업데이트도 중요합니다.
MongoDB 클러스터에 샤딩을 고려해야 하는 경우는 언제인가요?
답변:
단일 복제 세트가 더 이상 데이터 볼륨 또는 읽기/쓰기 처리량을 처리할 수 없을 때 샤딩을 고려합니다. 이는 일반적으로 작업 세트가 RAM 을 초과하여 과도한 디스크 I/O 를 유발하거나 초당 작업 수가 단일 서버에 비해 너무 높아질 때 발생합니다.
MongoDB 에서 '쓰기 고려 (write concern)' 개념을 설명해주세요.
답변:
쓰기 고려는 쓰기 작업에 대해 MongoDB 로부터 요청되는 승인 수준을 설명합니다. 옵션으로는 w: 1(주 서버로부터 승인), w: 'majority'(복제 세트 멤버의 대다수로부터 승인), 또는 w: 0(승인 없음) 이 있습니다.
MongoDB 에서 journal의 목적은 무엇인가요?
답변:
저널은 데이터 파일에 적용되기 전에 데이터 수정을 기록하는 쓰기 전 로그입니다. 이는 데이터 내구성과 일관성을 보장하여 MongoDB 가 예기치 않은 종료 후 데이터 손실 없이 일관된 상태로 복구할 수 있도록 합니다.
시나리오 기반 및 문제 해결 질문
'orders' 컬렉션에 수백만 개의 문서가 있습니다. 각 주문에는 'status' 필드 (예: 'pending', 'shipped', 'delivered') 와 'timestamp' 필드가 있습니다. 지난 24 시간 동안의 모든 'pending' 주문을 효율적으로 찾으려면 어떻게 해야 하나요?
답변:
{ status: 1, timestamp: -1 }에 복합 인덱스를 생성합니다. 그런 다음 db.orders.find({ status: 'pending', timestamp: { $gte: ISODate('...') } })를 사용하여 쿼리합니다. 이 인덱스를 사용하면 상태별로 효율적으로 필터링하고 타임스탬프에 대한 범위 스캔을 수행할 수 있습니다.
애플리케이션에서 'username' 및 'email'로 사용자 프로필을 자주 검색해야 합니다. 두 조회 유형을 모두 효율적으로 지원하려면 인덱스를 어떻게 설계해야 하나요?
답변:
두 개의 별도 단일 필드 인덱스를 생성합니다: db.users.createIndex({ username: 1 }) 및 db.users.createIndex({ email: 1 }). 이를 통해 MongoDB 는 각 필드를 기반으로 하는 쿼리에 대해 적절한 인덱스를 사용할 수 있습니다.
'products'라는 컬렉션에 'price' 필드가 있습니다. 특정 가격 범위 내의 제품을 찾고 'name'으로 정렬해야 합니다. 이 쿼리를 어떻게 최적화해야 하나요?
답변:
{ price: 1, name: 1 }에 복합 인덱스를 생성합니다. 쿼리는 db.products.find({ price: { $gte: 10, $lte: 50 } }).sort({ name: 1 })가 됩니다. 이 인덱스는 가격에 대한 범위 쿼리와 이름에 대한 정렬 작업을 모두 지원합니다.
소셜 미디어 애플리케이션을 설계하고 있습니다. 사용자는 많은 'posts'를 가질 수 있습니다. 게시물을 사용자 문서에 포함해야 하나요, 아니면 참조가 있는 별도의 'posts' 컬렉션을 사용해야 하나요? 선택 이유를 설명해주세요.
답변:
참조가 있는 별도의 'posts' 컬렉션을 사용합니다. 포함하면 크고 계속 증가하는 사용자 문서가 되어 16MB BSON 제한을 초과하고 빈번한 업데이트로 인해 성능 문제가 발생할 수 있습니다. 참조를 사용하면 확장 가능한 성장이 가능하고 게시물을 독립적으로 효율적으로 쿼리할 수 있습니다.
'logs' 컬렉션에서 데이터를 집계할 때 애플리케이션에서 쿼리가 느려집니다. 집계 파이프라인에는 $match, $group, $sort가 포함됩니다. 성능을 진단하고 개선하기 위해 어떤 단계를 취해야 하나요?
답변:
먼저 집계 파이프라인에 explain()을 사용하여 병목 현상을 식별합니다. $match 및 $sort 단계에서 사용되는 필드에 대해 적절한 인덱스가 있는지 확인합니다. 가능한 경우 커버드 쿼리를 사용하거나 자주 액세스하는 보고서에 대해 데이터를 사전 집계하는 것을 고려합니다.
30 분 동안 비활성 상태이면 만료되는 사용자 세션을 저장해야 합니다. MongoDB 에서 이를 효율적으로 구현하려면 어떻게 해야 하나요?
답변:
'sessions' 컬렉션의 타임스탬프 필드 (예: lastActivity) 에 TTL(Time-To-Live) 인덱스를 사용합니다. db.sessions.createIndex({ lastActivity: 1 }, { expireAfterSeconds: 1800 })로 인덱스를 생성합니다. MongoDB 는 30 분보다 오래된 문서를 자동으로 삭제합니다.
애플리케이션에서 문서에 대한 원자적 업데이트를 수행하여 카운터를 증가시키고 배열에 항목을 추가해야 합니다. 데이터 일관성을 어떻게 보장할 수 있나요?
답변:
$inc 및 $push 연산자를 사용하여 단일 db.collection.updateOne() 작업을 사용합니다. MongoDB 는 단일 문서 쓰기에 대한 원자성을 보장합니다. 예를 들어: db.products.updateOne({ _id: productId }, { $inc: { stock: -1 }, $push: { buyers: userId } })입니다.
'events' 컬렉션에는 좌표 배열 [longitude, latitude]인 'location' 필드가 있습니다. 주어진 지점에서 5km 반경 내의 모든 이벤트를 어떻게 찾을 수 있나요?
답변:
'location' 필드에 2dsphere 인덱스를 생성합니다: db.events.createIndex({ location: '2dsphere' }). 그런 다음 쿼리에 $centerSphere와 함께 $geoWithin 연산자를 사용합니다: db.events.find({ location: { $geoWithin: { $centerSphere: [[lon, lat], radiusInRadians] } } }).
관계형 데이터베이스에서 MongoDB 로 데이터를 마이그레이션하고 있습니다. 'customers' 테이블과 일대다 관계를 가진 'addresses' 테이블이 있습니다. MongoDB 에서 이를 어떻게 모델링해야 하나요?
답변:
주소에 대한 액세스가 고객과 함께 자주 발생하고 수가 너무 많지 않다면 고객 문서 내의 배열로 포함합니다. 주소가 크거나, 수가 많거나, 공유되는 경우 별도의 'addresses' 컬렉션을 사용하고 고객 문서에서 _id로 참조합니다.
MongoDB 복제 세트에는 주 서버와 두 개의 보조 서버가 있습니다. 주 서버가 다운됩니다. 어떤 일이 발생하며 MongoDB 는 어떻게 고가용성을 보장하나요?
답변:
주 서버가 다운되면 나머지 멤버들이 선거를 진행합니다. 보조 서버 중 하나가 새 주 서버로 선출됩니다. 이 프로세스는 고가용성과 자동 장애 조치를 보장하며 일반적으로 몇 초 내에 완료됩니다.
두 개의 다른 컬렉션에서 데이터를 조인하고 여러 집계를 수행하는 복잡한 분석 쿼리를 수행해야 합니다. 어떤 MongoDB 기능을 사용해야 하나요?
답변:
$lookup 단계를 포함하는 집계 파이프라인입니다. $lookup은 동일한 데이터베이스의 샤딩되지 않은 컬렉션에 대해 왼쪽 외부 조인을 수행하여 $group, $match, $sort와 같은 추가 집계 단계를 수행하기 전에 여러 컬렉션의 데이터를 결합할 수 있도록 합니다.
성능 튜닝 및 모범 사례
MongoDB 문제 해결 및 디버깅
MongoDB 애플리케이션 성능이 저하될 때 가장 먼저 취하는 조치는 무엇인가요?
답변:
먼저 MongoDB 로그에서 오류나 느린 쿼리를 확인합니다. 그런 다음 mongostat 및 mongotop을 사용하여 실시간 성능 메트릭을 모니터링하고 리소스를 소비하는 활성 작업 또는 컬렉션을 식별합니다. 마지막으로 db.currentOp()를 분석하여 진행 중인 작업을 확인합니다.
MongoDB 에서 느리게 실행되는 쿼리를 어떻게 식별하나요?
답변:
db.setProfilingLevel(1, { slowms: 100 }) 명령을 사용하여 데이터베이스 프로파일링을 활성화합니다. 이 명령은 지정된 임계값을 초과하는 쿼리를 기록합니다. 또는 db.system.profile.find()를 사용하여 느린 작업에 대해 프로파일러 컬렉션을 직접 쿼리할 수 있습니다. explain() 계획은 쿼리 실행을 이해하는 데도 중요합니다.
쿼리가 지속적으로 느립니다. 이를 최적화하기 위해 어떤 도구와 기술을 사용하시겠습니까?
답변:
explain('executionStats')를 사용하여 쿼리 계획을 분석하고 누락된 인덱스나 비효율적인 단계를 식별합니다. explain 출력에 따라 적절한 인덱스를 생성합니다. 인덱싱으로 충분하지 않으면 스키마 재설계 또는 쿼리 재구성을 고려할 것입니다.
MongoDB 서버에서 높은 CPU 사용률을 어떻게 해결하나요?
답변:
높은 CPU 사용률은 종종 비효율적인 쿼리, 누락된 인덱스 또는 과도한 쓰기 작업으로 인해 발생합니다. mongostat에서 활성 작업을 확인하고, db.currentOp()에서 장기 실행 프로세스를 확인하고, 프로파일러에서 느린 쿼리를 확인합니다. top 또는 htop과 같은 OS 수준 도구도 mongod 프로세스의 CPU 사용량을 정확히 파악할 수 있습니다.
MongoDB 에서 높은 메모리 사용률의 일반적인 원인과 이를 해결하는 방법은 무엇인가요?
답변:
높은 메모리 사용률은 대규모 워킹 세트, RAM 으로 너무 많은 데이터를 가져오는 비효율적인 쿼리 또는 최적화되지 않은 집계 파이프라인 때문일 수 있습니다. db.serverStatus().wiredTiger.cache에서 캐시 사용률을 확인하고 적절한 인덱싱을 통해 스캔되는 데이터를 줄입니다. RAM 확장 또는 샤딩이 필요할 수 있습니다.
제대로 동기화되지 않는 복제 세트를 디버깅하는 방법을 설명해주세요.
답변:
모든 멤버에서 rs.status()를 확인하여 각 노드의 상태와 상태를 식별하는 것부터 시작합니다. 그런 다음 각 멤버의 MongoDB 로그에서 복제 관련 오류, 네트워크 문제 또는 oplog 적용 실패를 검사합니다. 멤버 간의 네트워크 연결도 일반적인 원인입니다.
MongoDB 프로파일러의 목적은 무엇이며 어떻게 활성화하나요?
답변:
MongoDB 프로파일러는 쿼리 실행 시간, 잠금, I/O 를 포함한 데이터베이스 작업에 대한 자세한 정보를 캡처합니다. 느린 쿼리 및 작업을 식별하는 데 도움이 됩니다. db.setProfilingLevel(level, { slowms: threshold })를 사용하여 활성화하며, 여기서 level은 0(끔), 1(느린 작업) 또는 2(모든 작업) 가 될 수 있습니다.
MongoDB 인스턴스의 디스크 공간이 부족한 상황을 어떻게 처리하나요?
답변:
먼저 db.stats() 및 db.collection.stats()를 사용하여 공간을 소비하는 것을 식별합니다. 그런 다음 삭제할 대용량 로그 파일이나 오래된 백업을 찾습니다. 데이터 증가가 문제인 경우 디스크 공간 추가, 샤딩 구현 또는 오래된 데이터를 아카이빙하여 워킹 세트를 줄이는 것을 고려합니다.
교착 상태 작업이 의심됩니다. MongoDB 에서 이를 어떻게 조사하나요?
답변:
MongoDB 는 낙관적 동시성 제어를 사용하므로 실제 교착 상태는 드뭅니다. 그러나 잠금을 보유하는 장기 실행 작업은 다른 작업을 차단할 수 있습니다. db.currentOp()를 사용하여 waitingForLock 상태의 작업을 식별하고 잠금을 보유하고 있는 작업을 확인합니다. 필요한 경우 차단 작업을 종료할 수 있습니다.
MongoDB 상태 및 성능을 위해 모니터링하는 주요 메트릭은 무엇인가요?
답변:
주요 메트릭에는 opcounters(읽기, 쓰기, 명령), connections(현재, 사용 가능), network(바이트 인/아웃), memory(상주, 가상, 매핑됨), wiredTiger.cache(더티 바이트, 읽기/쓴 페이지) 및 locks(전역, 데이터베이스, 컬렉션) 가 포함됩니다. 이러한 메트릭은 워크로드 및 리소스 사용률에 대한 통찰력을 제공합니다.
특정 역할별 MongoDB (개발자, DBA, DevOps)
개발자: MongoDB 의 스키마리스 (schemaless) 특성을 고려할 때 스키마 디자인은 어떻게 처리하나요?
답변:
MongoDB 는 스키마리스이지만, 암묵적인 스키마를 설계하는 것이 중요합니다. 이는 일반적인 쿼리를 위해 관련 데이터를 임베딩하여 조인 (join) 을 최소화하고, 덜 자주 액세스하거나 대규모 데이터 세트의 경우 참조 (referencing) 를 사용하는 것을 포함합니다. 목표는 읽기 성능과 데이터 지역성 (data locality) 을 최적화하는 것입니다.
개발자: MongoDB 쿼리에서 find()와 aggregate()의 차이점을 설명해주세요.
답변:
find()는 지정된 기준과 일치하는 문서를 검색하는 기본 쿼리에 사용되며, 종종 프로젝션 (projection) 및 정렬과 함께 사용됩니다. aggregate()는 데이터 처리를 위한 더 강력한 프레임워크로, 그룹화, 조인 및 문서 변환과 같은 작업을 수행하기 위한 다단계 파이프라인을 허용합니다.
DBA: 복제 세트 (replica set) 란 무엇이며, 프로덕션 MongoDB 배포에 왜 중요한가요?
답변:
복제 세트는 동일한 데이터 세트를 유지하는 MongoDB 프로세스 그룹으로, 고가용성 (high availability) 과 데이터 중복성 (data redundancy) 을 제공합니다. 기본 노드 (primary node) 가 다운될 경우 자동 장애 조치 (automatic failover) 를 보장하여 다운타임과 데이터 손실을 방지하며, 읽기 확장 (read scaling) 에도 사용할 수 있습니다.
DBA: MongoDB 인스턴스의 성능을 어떻게 모니터링하나요?
답변:
성능 모니터링에는 작업, 연결 및 메모리 사용량을 위한 db.serverStatus()와 같은 메트릭을 확인하는 것이 포함됩니다. MongoDB Atlas Monitoring, Ops Manager 또는 타사 솔루션과 같은 도구를 사용하여 쿼리 지연 시간, 인덱스 사용률 및 복제 지연 (replication lag) 과 같은 주요 성능 지표 (KPI) 를 추적합니다.
DevOps: MongoDB 에서 샤드 클러스터 (sharded cluster) 를 배포하는 과정을 설명해주세요.
답변:
샤드 클러스터 배포는 설정 서버 (config servers, 메타데이터 저장), mongos 라우터 (쿼리 라우팅) 및 샤드 복제 세트 (shard replica sets, 데이터 저장) 를 설정하는 것을 포함합니다. 이 과정에는 복제 세트 초기화, 클러스터에 샤드 추가, 데이터베이스 및 컬렉션에 대한 샤딩 활성화가 포함됩니다.
DevOps: MongoDB 에서 백업 및 복원을 어떻게 수행하나요?
답변:
백업은 논리적 백업을 위한 mongodump 또는 물리적 백업을 위한 파일 시스템 스냅샷을 사용하여 수행할 수 있습니다. 복원의 경우 논리적 백업에는 mongorestore가 사용됩니다. 샤드 클러스터의 경우 일관된 백업에는 전용 백업 에이전트 또는 클라우드 제공업체 서비스를 사용하는 등 조정된 접근 방식이 필요합니다.
개발자: 임베디드 문서 (embedded document) 와 참조 문서 (referenced document) 를 언제 사용해야 하나요?
답변:
데이터가 자주 함께 액세스되고, 일대다 (one-to-few) 관계이며, 무제한으로 증가하지 않을 때 문서를 임베드합니다. 데이터가 크거나, 일대다 (one-to-many) 또는 다대다 (many-to-many) 관계이거나 독립적으로 액세스해야 할 때 문서를 참조하여 문서 크기 제한을 피하고 업데이트 효율성을 개선합니다.
DBA: MongoDB 에서 인덱스 (indexes) 란 무엇이며, 쿼리 성능에 왜 중요한가요?
답변:
인덱스는 컬렉션 데이터의 작은 부분을 쉽게 탐색할 수 있는 형태로 저장하는 특수 데이터 구조입니다. 전체 컬렉션을 스캔하지 않고도 문서를 빠르게 찾을 수 있도록 하여 쿼리 성능을 크게 향상시키며, 이는 관계형 데이터베이스의 인덱스와 유사합니다.
DevOps: MongoDB 복제 세트의 롤링 업그레이드 (rolling upgrades) 는 어떻게 처리하나요?
답변:
롤링 업그레이드는 가장 낮은 우선순위의 보조 멤버부터 시작하여 다음 멤버, 그리고 마지막으로 기본 멤버를 스텝다운 (step down) 하여 업그레이드하는 방식으로 보조 멤버를 하나씩 업그레이드하는 것을 포함합니다. 이는 업그레이드 과정 중에 항상 기본 멤버가 사용 가능하도록 보장하여 다운타임을 최소화합니다.
개발자: MongoDB 의 쓰기 고려 사항 (Write Concerns) 개념을 설명해주세요.
답변:
쓰기 고려 사항은 쓰기 작업에 대해 MongoDB 로부터 요청되는 승인 수준을 설명합니다. w: 1(기본 멤버만) 또는 w: 'majority'(복제 세트 멤버의 과반수) 와 같은 옵션은 내구성 (durability) 과 일관성 (consistency) 을 제어하며, 성능과 데이터 안전성에 영향을 미칩니다.
실용적이고 실제적인 MongoDB 작업
MongoDB Shell 에서 MongoDB 데이터베이스에 연결하고 사용 가능한 모든 데이터베이스를 나열하는 방법은 무엇인가요?
답변:
연결하려면 mongo 또는 mongosh를 사용합니다. 데이터베이스를 나열하려면 show dbs 또는 show databases를 사용합니다. 특정 데이터베이스로 전환하려면 use <database_name>을 사용합니다.
'products'라는 컬렉션에 'name', 'price', 'category' 필드를 가진 단일 문서를 삽입하는 MongoDB 쿼리를 작성하세요.
답변:
db.products.insertOne({ name: 'Laptop', price: 1200, category: 'Electronics' });
'orders' 컬렉션에서 'status'가 'pending'이고 'totalAmount'가 100 보다 큰 모든 문서를 찾는 방법은 무엇인가요?
답변:
db.orders.find({ status: 'pending', totalAmount: { $gt: 100 } });
'users' 컬렉션에서 'username'이 'john_doe'인 사용자의 'age'를 30 으로 설정하여 단일 문서를 업데이트하는 방법을 설명해주세요.
답변:
db.users.updateOne({ username: 'john_doe' }, { $set: { age: 30 } }); 이는 필터와 일치하는 첫 번째 문서를 업데이트합니다.
특정 날짜 (예: '2023-01-01') 보다 오래된 'logs' 컬렉션의 모든 문서를 삭제해야 합니다. 어떻게 해야 하나요?
답변:
db.logs.deleteMany({ timestamp: { $lt: ISODate('2023-01-01T00:00:00Z') } }); 이는 지정된 날짜보다 작은 타임스탬프를 가진 모든 문서를 제거합니다.
'users' 컬렉션의 'email' 필드에 고유성을 보장하는 인덱스를 생성하는 방법을 설명해주세요.
답변:
db.users.createIndex({ email: 1 }, { unique: true }); 이는 'email' 필드에 오름차순 고유 인덱스를 생성하여 중복 이메일 주소를 방지합니다.
'status'별로 그룹화하여 'orders' 컬렉션의 문서 수를 계산하는 기본 집계를 수행하는 방법은 무엇인가요?
답변:
db.orders.aggregate([ { $group: { _id: '$status', count: { $sum: 1 } } } ]); 이는 문서를 'status'별로 그룹화하고 수를 셉니다.
'articles' 컬렉션에 'tags' 배열이 있습니다. 'MongoDB'와 'NoSQL'을 모두 태그로 가진 모든 문서를 찾는 방법은 무엇인가요?
답변:
db.articles.find({ tags: { $all: ['MongoDB', 'NoSQL'] } }); 이 쿼리는 지정된 두 태그가 모두 'tags' 배열에 존재하도록 합니다.
MongoDB 에서 explain() 메서드의 목적을 설명하고 사용 예시를 제공해주세요.
답변:
explain() 메서드는 쿼리의 실행 계획에 대한 정보를 제공하여 성능 최적화를 돕습니다. 예시: db.products.find({ price: { $gt: 500 } }).explain('executionStats');
'mydatabase'라는 특정 MongoDB 데이터베이스를 명령줄 도구를 사용하여 백업하는 방법은 무엇인가요?
답변:
mongodump --db mydatabase --out /path/to/backup/directory를 사용합니다. 이 명령은 지정된 데이터베이스의 BSON 덤프를 출력 디렉토리에 생성합니다.
요약
인터뷰를 위한 MongoDB 숙달은 철저한 준비를 통해 크게 이점을 얻을 수 있는 여정입니다. 일반적인 질문에 익숙해지고, 핵심 개념을 이해하며, 설명을 연습함으로써 자신감을 높일 뿐만 아니라 기술에 대한 강력한 이해를 보여줄 수 있습니다. 이러한 준비는 기술을 효과적으로 설명하고 지속적인 인상을 남기는 데 핵심입니다.
기술 환경은 끊임없이 진화한다는 것을 기억하십시오. 전문성을 심화시키기 위해 새로운 기능, 모범 사례 및 커뮤니티 토론을 계속 탐색하십시오. 지속적인 학습에 대한 헌신은 인터뷰에서 좋은 결과를 얻는 데 도움이 될 뿐만 아니라 MongoDB 전문가로서 경력을 쌓는 데 힘을 실어줄 것입니다. 계속 배우고, 계속 구축하고, 계속 성장하십시오!

