MongoDB 리드·아키텍트 데이터베이스 심화 면접

MongoDB 리드 · 아키텍트 (10년+) 데이터베이스 5문항 조회수 31 · 2026-08-04 (화) 15:03:49
1 데이터 모델링
Hard

Q. 월 1억 건 이상의 주문 데이터를 처리하는 이커머스 시스템에서, 주문(Order), 주문상품(OrderItem), 배송(Delivery) 정보를 MongoDB에 설계해야 합니다. Embedding과 Referencing 중 어떤 방식을 선택하시겠습니까? 각 엔티티별로 설계 전략과 그 이유를 설명해주세요.

조회 패턴(읽기 vs 쓰기 비율), 데이터 변경 빈도, 문서 크기 제한(16MB)을 고려해보세요.

A. 모범답안

주문과 주문상품은 Embedding 방식을 선택합니다. 주문상품은 주문 생성 시점에 함께 생성되고 이후 거의 변경되지 않으며, 항상 주문과 함께 조회되기 때문입니다. 배송 정보는 Referencing 방식을 선택합니다. 배송 상태는 빈번하게 업데이트되고, 배송 추적 시스템에서 독립적으로 조회될 수 있기 때문입니다. 또한 주문상품을 임베딩하면 JOIN 없이 한 번의 쿼리로 주문 전체를 조회할 수 있어 성능상 이점이 큽니다. 다만 주문상품 배열이 16MB를 초과할 가능성이 있다면 Bucket Pattern을 적용하여 일정 개수마다 분할하는 것을 고려해야 합니다. 이러한 하이브리드 접근법이 MongoDB의 장점을 최대한 활용하면서도 실무적 제약을 충족하는 방법입니다.

핵심 포인트
  • • 주문-주문상품은 Embedding (함께 조회되고 변경 빈도 낮음)
  • • 배송 정보는 Referencing (독립적 업데이트 빈번)
  • • 16MB 문서 크기 제한 고려 및 Bucket Pattern 적용 가능성
  • • 읽기/쓰기 패턴 분석을 통한 하이브리드 설계
답변에 넣으면 좋은 키워드
Embedding Referencing Bucket Pattern 문서 크기 제한 조회 패턴 데이터 지역성
실무에서는

대용량 트랜잭션 시스템에서 조회 성능과 데이터 일관성을 동시에 확보하기 위한 모델링 전략 수립 시 필수적입니다.

Follow-up 질문

만약 주문 취소나 부분 환불이 빈번하게 발생한다면 설계를 어떻게 수정하시겠습니까?

2 인덱스 설계 및 최적화
Hard

Q. 사용자 활동 로그 컬렉션에서 userId, eventType, timestamp 필드에 대한 복합 인덱스를 설계해야 합니다. 주요 쿼리는 '특정 사용자의 특정 기간 동안의 특정 이벤트 조회'입니다. ESR 규칙을 적용하여 최적의 인덱스 순서를 제시하고, Covered Query를 활용한 성능 개선 방안도 함께 설명해주세요.

ESR은 Equality, Sort, Range의 순서를 의미하며, 각 쿼리 조건의 특성을 분석해보세요.

A. 모범답안

ESR 규칙에 따라 {userId: 1, eventType: 1, timestamp: 1} 순서로 복합 인덱스를 생성합니다. userId와 eventType은 equality 조건이고 timestamp는 range 조건이므로 이 순서가 최적입니다. Equality 필드를 먼저 배치하면 인덱스 스캔 범위를 최소화할 수 있고, Range 필드를 마지막에 두면 정렬 작업을 인덱스로 처리할 수 있습니다. Covered Query를 구현하려면 projection에 _id를 제외하고 인덱스에 포함된 필드만 요청해야 합니다. 예를 들어 쿼리에 {userId, eventType, timestamp, count}가 필요하다면 인덱스를 {userId: 1, eventType: 1, timestamp: 1, count: 1}로 확장하여 IXSCAN만으로 결과를 반환할 수 있습니다. explain() 결과에서 totalDocsExamined가 0이면 Covered Query가 성공한 것입니다.

핵심 포인트
  • • ESR 규칙 적용: Equality(userId, eventType) -> Range(timestamp)
  • • 인덱스 스캔 범위 최소화 및 정렬 작업 제거
  • • Covered Query를 위한 인덱스 확장 및 projection 최적화
  • • explain() 분석으로 IXSCAN 및 totalDocsExamined 확인
답변에 넣으면 좋은 키워드
ESR 규칙 복합 인덱스 Covered Query IXSCAN explain 인덱스 selectivity
실무에서는

대용량 로그 분석 시스템에서 쿼리 응답 시간을 밀리초 단위로 최적화할 때 필수적인 인덱스 설계 기법입니다.

Follow-up 질문

만약 userId의 카디널리티가 매우 낮다면(예: 100명의 사용자) 인덱스 전략을 어떻게 수정하시겠습니까?

3 트랜잭션 및 동시성 제어
Hard

Q. MongoDB의 Multi-Document Transaction을 프로덕션 환경에서 사용할 때 고려해야 할 성능 및 운영상의 제약사항을 설명하고, 트랜잭션 없이 동일한 원자성을 보장할 수 있는 대안적 설계 패턴을 제시해주세요.

WiredTiger 스토리지 엔진의 MVCC와 트랜잭션 로그, 그리고 Single Document Atomicity를 생각해보세요.

A. 모범답안

MongoDB 트랜잭션은 WiredTiger의 스냅샷 격리를 사용하여 성능 오버헤드가 발생하며, 특히 샤딩 환경에서는 분산 트랜잭션 코디네이터로 인한 지연이 증가합니다. 트랜잭션 시간 제한(기본 60초)과 oplog 크기 제한도 고려해야 하며, 장기 실행 트랜잭션은 다른 작업을 블로킹할 수 있습니다. 대안으로 Single Document Atomicity를 활용한 설계를 권장합니다. 예를 들어 계좌 이체의 경우 거래 문서를 먼저 생성하고(pending 상태), 각 계좌를 개별적으로 업데이트한 후 거래 상태를 completed로 변경하는 Two-Phase Commit 패턴을 사용할 수 있습니다. 또는 관련 데이터를 하나의 문서로 임베딩하여 단일 문서 업데이트로 원자성을 보장하는 방법도 효과적입니다. 보상 트랜잭션(Saga Pattern)을 구현하여 실패 시 롤백 로직을 애플리케이션 레벨에서 처리하는 것도 고려할 수 있습니다.

핵심 포인트
  • • 트랜잭션의 성능 오버헤드 및 샤딩 환경에서의 추가 지연
  • • 트랜잭션 시간 제한과 oplog 크기 제약
  • • Single Document Atomicity 활용한 설계 패턴
  • • Two-Phase Commit, Saga Pattern 등 대안적 접근법
답변에 넣으면 좋은 키워드
Multi-Document Transaction MVCC Single Document Atomicity Two-Phase Commit Saga Pattern 보상 트랜잭션
실무에서는

금융 시스템이나 재고 관리 시스템에서 데이터 정합성을 보장하면서도 높은 처리량을 유지해야 할 때 적용합니다.

Follow-up 질문

Read Concern과 Write Concern을 어떻게 설정하여 트랜잭션의 일관성과 성능 사이의 균형을 맞추시겠습니까?

4 쿼리 튜닝 및 성능 분석
Hard

Q. 프로덕션 환경에서 특정 aggregation 파이프라인의 실행 시간이 30초 이상 소요되어 타임아웃이 발생하고 있습니다. Database Profiler와 explain() 결과를 활용한 체계적인 튜닝 프로세스를 단계별로 설명하고, 각 단계에서 확인해야 할 핵심 메트릭을 제시해주세요.

파이프라인의 각 스테이지별 실행 계획과 인덱스 활용도, 그리고 메모리 사용량을 분석해보세요.

A. 모범답안

먼저 Database Profiler를 level 1 또는 2로 설정하여 느린 쿼리를 system.profile 컬렉션에서 수집합니다. 해당 aggregation에 explain('executionStats')를 실행하여 각 스테이지의 실행 시간과 문서 처리량을 확인합니다. executionTimeMillis, totalDocsExamined, totalKeysExamined 비율을 분석하여 인덱스 효율성을 평가하고, COLLSCAN이 발생하는지 확인합니다. $match와 $sort 스테이지를 파이프라인 앞쪽으로 이동시켜 인덱스를 활용하고 처리 문서 수를 조기에 줄입니다. $lookup이나 $group 같은 메모리 집약적 연산은 allowDiskUse: true 옵션을 고려하되, 가능하면 인덱스를 활용하도록 재설계합니다. nReturned 대비 totalDocsExamined 비율이 높으면 인덱스 추가나 쿼리 재작성이 필요합니다. 최종적으로 serverStatus의 wiredTiger 캐시 히트율과 opcounters를 모니터링하여 시스템 레벨 병목도 확인합니다.

핵심 포인트
  • • Database Profiler와 system.profile을 통한 느린 쿼리 수집
  • • explain('executionStats')로 각 스테이지별 메트릭 분석
  • • $match, $sort 스테이지 순서 최적화 및 인덱스 활용
  • • 메모리 집약적 연산의 allowDiskUse 옵션 및 재설계 고려
  • • nReturned/totalDocsExamined 비율과 캐시 히트율 모니터링
답변에 넣으면 좋은 키워드
Database Profiler explain executionStats allowDiskUse COLLSCAN aggregation pipeline
실무에서는

대시보드나 리포팅 시스템에서 복잡한 집계 쿼리의 응답 시간을 개선해야 할 때 필수적인 분석 프로세스입니다.

Follow-up 질문

$lookup 스테이지가 성능 병목이라면 어떤 대안적 설계 방법을 제안하시겠습니까?

5 샤딩 및 스케일링 전략
Hard

Q. 글로벌 서비스의 사용자 데이터를 MongoDB에서 샤딩해야 합니다. Shard Key로 userId를 단독으로 사용하는 것과 {region: 1, userId: 1} 복합키를 사용하는 것의 장단점을 비교하고, Chunk Migration과 Jumbo Chunk 문제를 고려한 최적의 샤드 키 전략을 제시해주세요.

쿼리 라우팅(targeted vs broadcast), 데이터 분산, 핫스팟 문제를 종합적으로 고려해보세요.

A. 모범답안

userId 단독 샤드 키는 해시 샤딩 시 데이터가 균등하게 분산되지만, region 기반 쿼리에서 모든 샤드를 스캔하는 broadcast 쿼리가 발생합니다. {region: 1, userId: 1} 복합키는 region별 쿼리에서 targeted 쿼리가 가능하여 성능이 우수하지만, region의 카디널리티가 낮으면 특정 샤드에 데이터가 집중되는 핫스팟 문제가 발생할 수 있습니다. 최적 전략은 {region: 1, userId: hashed}로 설정하여 region별 격리와 균등 분산을 동시에 달성하는 것입니다. Chunk 크기는 기본 64MB에서 시작하되, Chunk Migration 빈도를 모니터링하여 조정합니다. Jumbo Chunk 방지를 위해 샤드 키의 카디널리티를 충분히 확보하고, 단일 샤드 키 값이 64MB를 초과하지 않도록 설계해야 합니다. sh.status()로 청크 분포를 정기적으로 확인하고, balancer 윈도우를 업무 시간 외로 설정하여 운영 영향을 최소화합니다.

핵심 포인트
  • • 단독 샤드 키 vs 복합 샤드 키의 쿼리 라우팅 및 분산 특성
  • • Hashed Shard Key를 활용한 핫스팟 방지
  • • Chunk Migration 빈도와 Jumbo Chunk 예방 전략
  • • 샤드 키 카디널리티 확보 및 balancer 윈도우 설정
답변에 넣으면 좋은 키워드
Shard Key Chunk Migration Jumbo Chunk Hashed Sharding targeted query broadcast query
실무에서는

글로벌 확장이나 데이터 증가로 인해 수평 확장이 필요할 때, 서비스 중단 없이 샤딩을 도입하는 아키텍처 설계에 활용됩니다.

Follow-up 질문

기존 운영 중인 컬렉션의 샤드 키를 변경해야 한다면 어떤 마이그레이션 전략을 사용하시겠습니까?

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!