본문 바로가기

Dev.World/개발상식&언어

#NoSQL에 대해 알아보자 2. MongoDB



MongoDB(Document Stroe)

요즘 MEAN STACK과 유행하고 있는 데이터 베이스이다.

NoSQL의 일종으로 SQL문을 쓰지 않고 JSON형식으로 핸들링한다는 특징이 있다.

--- Redis(in memory : key-value Store) = 데이터 모델이 다르다.

Document Store 는 Key-value Store가 확장된 형태.

Humongos 라는 회사의 제품명이었다가 현재 10gen으로 회사명이 변경되었다.
C++기반의 오픈소스 document 데이터베이스.
기본적인 인터페이스로 JSON을 이용해 웹에서의 접근성을 높이면서도
커서, 참조키 등 기존 SQL과 유사한 개념을 유지하고 있다.

특징
  • JSON Type의 데이터 저장 구조를 제공한다.
  • CRUD(Create, Read, Update, Delete) 위주의 다중 트랜잭션 처리도 가능하며 인덱스로 빠른 데이터 검색이 가능하다.
  • MapReduce(분산/병렬처리) 기능을 제공한다.
  • '쿼리 언어'로 자바스크립트 사용. 복잡한 로직을 임의로 표현할 수 있다.
    느리기 때문에 실시간 데이터 분석에는 적합하지 않음.
  • Sharding(분산)/Replica(복제) 기능을 제공한다.
  • 큰 크기의 객체를 다룰 때에는 GridFS를 사용하고, 색인을 다룰때는 B-트리를 사용한다.


장점
  • Scale Out  구조를 채택하여 서버 확장에 용이하다. 그러므로 더 많은 데이터를 저장할 수 있다.
  • Schema-less(Document Based)구조를 취함으로써 데이터 모델의 유연한 변화가 가능하다.
    RDBMS는 스키마 변경에 따른 추가작업이 필요하다.
  • 가동성 측면에서 볼 때, json 구조를 사용하기 때문에 RDBMS 테이블 구조에 비해 데이터를 직관적으로 파악할 수 있다.
    (이 경우에는 조금 의견이 엇갈리는 부분인데, JSON 구조가 눈에 익지 않은 사람에게는 그 반대일 것이다.)
  • 비교적 간단한 형태의 언어로 SQL언어를 대체할 수 있다.(SQL언어를 지원하지 않는다가 단점이 되겠다.)
  • 일관성의 레벨이 컨트롤 가능하기 때문에 성능에 중점을 두거나 또는 정합성에 중점을 둘지 선택이 가능하다.
  • Auto Sharding을 지원한다. 장비확장이 더 간단하다.
  • 객체 구조의 저장이 가능하기 때문에 개발이 편리하다.

모든 곳에서 몽고디비의 장점만 말하고 있다.
분명 NoSQL의 한계가 존재할 것이고 과대평가되었다고 생각한다.

단점
  • 데이터 업데이트 중에 장애가 발생하면 데이터 손실이 발생할 수 있다. (중요 데이터는 분리 보관을 해야한다.)
  • 완전한 원복을 하려면 데이터 센터를 분리해서 설치해야 한다.
  • 많은 인덱스를 사용하려면 충분한 메모리를 사용해야 한다.(인덱스 구조가 메모리에 저장됨)
  • 데이터 공간 소모가 RDBMS 대비 많은 가능성이 있다.(데이터가 필드네임과 함께 사용해야함)
  • 복잡한 join 사용시 성능 제약이 따를 수 있다.(Document Based 이기 때문에)
  • transaction 지원이 RDBMS 대비 미약하다.
  • 쿼리 문법이 불편하다.


무엇이 맞고 틀린지는 결정할 수 없는 문제이다.

MySQL과 MongoDB는 비교될 수는 있지만 둘 중 어느 하나가 틀린 것은 아니다.

서로 다른 태생이고 서로에게 맞는 각자의 목적이 존재한다.

(예를 들면, 정형화된 스키마가 필요할 때는 MySQL, 빅데이터를 다루어야 할 때는 mongo이런 식으로)

각자의 목적과 장점을 살려 상황에 맞춰 적재적소에 사용해주면 될 것이다.




-..-