MongoDB란?

 

MongoDB란?

MongoDB는 NoSQL 데이터베이스로, JSON 형태의 데이터를 저장하는 도큐먼트 지향 데이터베이스 입니다.

SQL을 지원하지 않기 때문에 조인(Join) 개념이 없고, 스키마가 유동적입니다. 여기서 유동적이라는 말은 MongoDB에서 저장하는 데이터 단위가 ‘도큐먼트’라는 것을 의미하며, 이는 RDBMS에서 행 단위의 레코드라고 할 수 있습니다. 따라서 MongoDB의 도큐먼트 속성은 SQL처럼 정형화 되어 있지 않고, 가변적이기 때문에 모든 문서 형태가 비정형 데이터를 저장하고 처리하는데 적합합니다.

MongoDB는 RDBMS들이 테이블 형태로 데이터를 저장하는데 방식과 달리 웹서버와 통신할 때 자주 쓰이는 JSON(JavaScript Object Nation) 형식의 문서를 이용합니다. JavaScript Object Notation(JSON)은 XML과 함께 현대 웹에서 사용되는 데이터 교환의 기본 형식입니다. JSON은 숫자, 문자열 및 부울 값과 같은 모든 기본 데이터 유형을 지원하며 배열과 해시도 지원합니다.

MongoDB는 BSON(Binary JSON)이라고 하는 Binary 인코딩 형식으로 JSON 문서를 저장합니다. BSON은 JSON 모델을 확장하여 추가 데이터 유형, 순서 필드를 제공하고 서로 다른 언어 내에서 인코딩 및 디코딩에 효율적입니다.

MongoDB와 RDBMS의 특성을 비교해보면 아래와 같습니다.

RDBMS MongoDB
Database Database
Table Collection
Index Index
Row Document
Join Embedding & Linking

관계형 모델에서는 테이블이라는 틀 때문에 새로운 테이블을 생성하고 두 테이블 사이의 관계를 컬럼에 저장해서 데이터를 표시할 수 밖에 없습니다. 하지만 MongoDB 모델에서는 단순히 값을 배열(array)로 바꾸는 작업만으로 구조를 간단히 바꿀수 있습니다.

MongoDB의 가장 큰 장점은 복제(Replicate)와 샤딩(Sharding)을 기본적으로 제공하고 있다는 점입니다. 복제는 장애 대비 및 데이터의 보존을 위해, 샤딩은 정보를 분산하여 I/O속도를 높이는데 사용할 수 있습니다.

기존의 RDBMS들에 비해 스키마 변경이 자유롭기 때문에, 미래에 대한 예측이 어렵거나 최종적으로 결정되지 않은 모델의 경우 MongoDB를 도입이 유용합니다. 또 분산 컴퓨터 환경이 필요한 경우 MongoDB는 좋은 선택이 될수도 있습니다. Schemaless 환경이라는 것은 RDBMS에 비해 비교적 스키마에 대한 제한에서 자유롭다는 뜻이지 스키마가 없는 환경이 아닙니다. 따라서 MongoDB 역시 Flexible 스키마에 대한 적절한 모델링이 필요하고, DBA는 Schema validate, modeling에 대한 스킬을 필요로 하게 됩니다.

 

MongoDB의 트랜잭션

기존의 NoSQL 데이터베이스들은 트랜잭션을 지원하지 않았지만, MongoDB는 4버전 부터 Replication Set 대한 트랜잭션을 지원하기 시작했고, 4.2부터는 RDBMS 같은 트랜잭션 기능을 지원하기 시작했습니다. 4.2이상의 버전에서 클러스터 샤드간의 ACID 트랜잭션을 지원하며, RDBMS의 트랜잭션과 동일하게 사용하는 것이 목적으로 개발되었습니다. MongoDB에도 트랜잭션을 위해 3버전대에서 세션이라는 항목이 추가 되었고, 꾸준히 4.2까지 버전업을 하면서 트랜잭션에 대한 준비를 많이 해왔습니다. 트랜잭션 기능은 4.2이상 버전의 MongoDB 드라이버를 사용하여야 하며, 기본 DML의 타임아웃은 60초 입니다. 이것은 파라미터 값을 변경해 바꿀수 있습니다. TX경합이 발생하는 경우 60초까지 기다렸다가 타임아웃 혹은 처리를 하게 됩니다. 하나의 트랜잭션 내에서 많은 도큐먼트를 변경하는 작업은 권장하지 않으며, 이런 작업의 경우 배치형태의 처리를 권장합니다.

트랜잭션에 대해서는 나중에 자세히 알아보록하고, 오늘은 MongoDB도 트랜잭션을 지원한다 라는 정도만 알고 넘어가려고 합니다.

You may also like...

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다