MongoDB
- Document 지향 데이터베이스
- 고성능, 고가용성 및 쉬운 확장성을 제공하는 NoSQL
- Document를 사용하면 단일 레코드로 복잡한 계층적 관계를 표현할 수 있어 RDBMS의 row보다 유연하다
- 미리 정의된 스키마를 필요로 하지 않는다.
Data format
- BSON : Binary JSON
- 이진 직렬화 형식으로, 원격 프로시저 호출(RPC)과 같은 분산 시스템에서 데이터를 저장하고 전송하기 위해 만들어졌다.
- 이진 형식이기 때문에 텍스트 형식보다 적은 용량을 사용하고 처리속도가 빠르다.
- 길이 정보가 포함되어 있어 데이터 트래버스(데이터 구조를 순회하거나 탐색하는 것)를 용이하게 한다. 길이정보가 있으면 데이터의 시작과 끝을 쉽게 파악할 수 있다.
- 데이터를 바르게 찾고 처리할 수 있다.
RPC: 한 시스템에서 다른 시스템의 프로시저(함수)를 호출할 수 있게 해주는 프로토콜. 분산 시스템에서는 시스템 간의 상호 작용이 필요하기 때문에 RPC가 자주 사용된다.
- Document: 데이터를 BSON document로 저장
- Collection: document의 집합 (document가 rdb의 row라면 collection은 table의 개념)
- 여러가지 형태를 가진 문서가 포함될 수 있다. 아래처럼 필드가 달라도 된다.
1 2 3 4 5 6 7 8 9 10
{ title: "MongoDB Tutorial", published_date: new Date('June 01, 2020') } { title: "MongoDB Basics", published_date: new Date('Jan 01, 2021'), isbn": "978-4-7766-7944-8" }
- Database : 컬렉션을 데이터베이스에 저장
- MongoDB 인스턴스는 여러 개의 데이터베이스를 호스트할 수 있으며 각각의 데이터베이스는 컬렉션의 컨테이너로 작용한다.
- 데이터베이스는 디스크의 별도 파일에 데이터를 저장하며 각 데이터베이스에는 고유한 이름 공간이 있다.
BSON이 빠른 이유
서로 다른 db(MongoDB, PostgresSQL 등)를 사용하는 서비스가 통신하려면 각 서비스의 데이터를 직렬화하고 이해할 수 있는 형식으로 전송해야 한다.
-
이진 직렬화: BSON은 이진 형식으로 데이터를 직렬화하므로, 데이터의 크기가 작아진다. 이로 인해 데이터 전송 시 소요되는 시간이 줄어들어 시스템 간의 통신이 빠르게 이루어질 수 있다. 이는 특히 대용량 데이터를 전송해야 하는 경우에 유리하다.
-
처리 속도: BSON은 이진 형식으로 인해 처리 속도가 빠르다. 서로 다른 시스템 간의 통신에서 데이터를 받아들이고 처리하는 속도가 빠르다면 전체 응답 시간이 감소하게 된다.
-
다양한 데이터 유형 지원: BSON은 문자열, 숫자(정수, 부동 소수점, 십진수), 날짜, 이진 데이터, ObjectId 등 다양한 데이터 유형을 지원한다. 이로 인해 서로 다른 시스템 간에 다양한 데이터 유형을 쉽게 전송하고 저장할 수 있다.
MongoDB vs RDBMS
✅ MongoDB vs RDBMS 기본 개념 비교
항목 | MongoDB (NoSQL) | RDBMS (MySQL, Oracle 등) |
---|---|---|
구조 | Document 기반 (BSON/JSON) | Table 기반 (행/열) |
스키마 | 스키마 유연 (Schema-less) | 스키마 고정 (Schema-on-write) |
확장성 | 수평 확장에 강함 (Sharding) | 수직 확장 위주 |
트랜잭션 | 과거에는 제한적, 4.0 이후 멀티도큐먼트 지원 | 강력한 ACID 트랜잭션 |
쿼리 | 유연한 Document 쿼리 | 복잡한 JOIN, 집계에 강함 |
사용 사례 | 비정형 데이터, 빠른 개발 | 정형 데이터, 정합성 요구 |
✅ MongoDB 도입 장단점
📌 장점 (특정 상황에 따라 고려 가능)
- 스키마-리스 디자인 = 비정형/반정형 데이터 구조에 적합
- 몽고디비의 유연한 스키마 디자인은 데이터 요구 사항이 변경될 때 매끄럽게 적응할 수 있도록 한다.
- 예: 금융상품에 따라 필드 구조가 매번 바뀌는 경우
- Mongo는 JSON 기반으로 필드 추가/삭제가 자유로움
- 빠른 개발 & 유연한 모델링
- 초기 모델이 자주 바뀌는 MVP 환경에서 유리
- 스키마를 변경하지 않고 필드를 추가 가능
- 수평 확장성 (Sharding)
- 몽고디비는 read 기능에 대한 확장을 위한 레플리카 세트와 write 확장을 위한 샤딩을 제공하여 수평적 확장에서 뛰어나다.
- 대량의 로그, 거래 이력, 실시간 수집 데이터 처리 등에서 적합 - 반면 RDBMS 솔루션은 비슷한 수준의 확장성을 달성하기 위해 비싼 하드웨어 업그레이드를 필요로 한다.
- Document 단위의 조회 성능 우수
- 사용자의 단일 대출 이력 전체를 한번에 조회하는 등의 use case에 강점
⚠️ 단점
- 정합성 요구가 강한 도메인에 불리
- Mongo는 기본적으로 eventual consistency (최종적 일관성) 모델
- 트랜잭션은 RDB만큼 엄격하지 않고, 다소 복잡하게 구현됨
- 트랜잭션 처리는 ACID가 아닌 BASE 기반
Basically Available, Soft state, Eventual consistency
- 느슨한 일관성 모델, 높은 가용성과 분산 시스템에 적합한 성능을 목표로 함
- 기본적으로 사용 가능(Basically Available): 시스템은 항상 응답을 제공하며, 일시적인 고장이나 네트워크 지연에도 높은 가용성을 유지
- 소프트 상태(Soft state): 시스템의 상태는 시간에 따라 변할 수 있으며, 일관성이 항상 보장되지 않음
- 최종 일관성(Eventual consistency): 시스템은 일정 시간이 지난 후에야 최종적으로 일관된 상태를 달성
- 느슨한 일관성 모델, 높은 가용성과 분산 시스템에 적합한 성능을 목표로 함
- 복잡한 JOIN 불가능
- 네이티브 조인을 지원하지 않음
- 고객, 계좌, 상품, 계약, 이력 등 여러 테이블 간 복잡한 조인이 많은 금융 서비스에서는 비효율
- 그러나 집계 파이프라인에서 LeftOuterJoin을 수행하는 $lookup 연산자를 제공하며, 전통적인 조인에 비해 효율성이 떨어질 수 있다.
- 감사로그, 거래추적 등 컴플라이언스 대응 어려움
- 금융에서는 변경이력 관리, 변경불가 보장 등이 중요 → RDB가 우세
- 운영 관리 및 안정성 측면에서 아직 보수적
- Mongo 특유의 WriteConcern, ReadConcern 설정을 잘못하면 데이터 유실 위험
- 장애 시 복구 경험이 적은 조직에서는 리스크
✅ 금융에서 MongoDB를 고려할 수 있는 예제
-
대출 비교 서비스의 금융사 응답 파싱 저장소
→ 금융사마다 JSON 구조가 다르기 때문에 Mongo에 저장하고, 이후 RDB로 ETL 가능 -
비동기 메시지 저장소 (Kafka Consumer의 Raw Data 저장 등)
-
대시보드 조회용 데이터 마트
→ 정합성이 절대적으로 중요하지 않고, 빠른 응답성과 유연한 구조가 필요한 경우