Database/MongoDB

[몽고DB 완벽 가이드] 1. 몽고DB 소개

noahkim_ 2025. 4. 27. 09:08

크리스티나 초도로 , 섀넌 브래드쇼 , 오언 브라질 님의 "몽고DB 완벽 가이드" 책을 정리한 포스팅 입니다.

 

MongoDB의 만들어진 배경지향점, 선택해야 하는 이유를 설명합니다.

 

1. 손쉬운 사용

Document-Based Database

항목 설명 예시 (MongoDB)
분산 확장의 용이성 분산 시스템에서 데이터를 쉽게 분산/관리할 수 있음
샤딩 지원
유연한 모델 미리 정의된 스키마 없이 데이터 저장 ✅
➡️ 빠른 개발 가능
동적으로 도큐먼트 필드 추가/삭제 가능
ex) JSON
복잡한 계층 관계 표현 내장 도큐먼트 및 배열을 하나의 레코드로 표현 ✅
➡️ OOP 개발에 적합
embedded documents, arrays 지원

 

 

2. 확장 가능한 설계

설계 배경

  • 애플리케이션의 발전으로 다루는 데이터 규모가 커짐 (대용량 데이터 처리 필요성 증가)
  • 값싼 저장장치와 가용 대역폭이 증가함
  • 데이터베이스의 확장이 필수화됨
  • Scale-Out은 경제적이고 확장에 용이하지만, 클러스터 관리가 복잡함

 

Mongo DB의 설계 방향

  • 이러한 문제를 해결하기 위해 MongoDB는 도큐먼트 기반 데이터 모델을 채택함
  • 라우터를 통해 데이터 분산과 부하 분산 관리를 자동으로 지원함

 

3. 다양한 기능

항목 설명
인덱싱
- Secondary Index 지원
- 다양한 인덱스 유형 지원 (unique, compound, geo, full-text, partial 등)
집계 파이프라인 기반 집계 프레임워크 제공
- 간단하고 효율적으로 처리할 수 있음
- 분석 엔진 구현에 적합
특수 컬렉션 유형
TTL 컬렉션 지원
- 로그, 세션 데이터에 활용
파일 스토리지
대용량 파일 저장을 위한 전용 프로토콜 제공
- 분할 저장 및 관리 지원

 

4. 고성능

  • 많은 요청을 병렬로 처리하여 전체 처리량을 극대화하려 설계됨
  • 제한된 메모리에서 효율적인 인덱스 선택으로 성능을 최적화함
구분 설명
와이어드타이거 스토리지 엔진 MongoDB의 기본 스토리지 엔진
- 다중 버전 동시성 제어(MVCC): 문서를 수정하는 동안 다른 트랜잭션은 수정 전 버전을 읽을 수 있음
→ 동시성: repetable read 보장
→ 성능 향상: 읽기 작업이 락 없이 빠르게 처리됨
기회적 락(Opportunistic Locking) 낙관적 락의 한 종류
- 커밋할 때, 데이터의 버전이 중간에 다른 트랜잭션에 의해 바뀌었는지만 확인하기 위해 락을 검
- 락의 적용 범위를 최소화 
→ 대기 시간이 줄고, 처리량이 올라감

 

예시) 기회적 락

더보기
상품 A: 재고 10

1. 트랜잭션 시작
- 사용자 A: 상품 A의 재고 수량을 읽고, 상품 A를 3 구매하려고 함.
- 사용자 B: 상품 A의 재고 수량을 읽고, 상품 A를 5 구매하려고 함.

2. 트랜잭션 동안 버전 기록
- 사용자 A: 상품 A의 재고 수량을 읽고, "10개"라는 버전을 기록
- 사용자 B: 상품 A의 재고 수량을 읽고, "10개"라는 버전을 기록

3. 트랜잭션 수행
- 사용자 A: 상품 A의 재고 수량을 읽고, 상품 A 3 구매 (상품 갯수 업데이트)
- 사용자 B: 상품 A의 재고 수량을 읽고, 상품 A 5 구매 (상품 갯수 업데이트)

3. 트랜잭션 커밋 직전
- 사용자 A: 기억한 버전와 현재 버전이 일치하는지 확인 (기회적  활성화)
  - 사용자 B에 의해 현재 버전의 값은 15 변경됨 (충돌 발생 -> 롤백 or 재시도)
- 사용자 B: 기억한 버전와 현재 버전이 일치하는지 확인 (기회적  활성화)  
  - 사용자 A에 의해 현재 버전의 값은 13 변경됨 (충돌 발생 -> 롤백 or 재시도)

트랜잭션 동안 읽은 "버전"을 다 기억함

커밋 순간에만 락을 짧게 걸어서 버전이 바뀌었는지 확인

  • 이상 없으면 바로 반영
  • 이상 있으면 롤백 or 재시도