검수요청.png검수요청.png

몽고디비

해시넷
이동: 둘러보기, 검색
몽고디비(MongoDB)
몽고디비(MongoDB)

몽고디비(MongoDB)는 무료 오픈소스 기반의 데이터베이스 관리 시스템(DBMS)이다. 오라클(Oracle), 마이에스큐엘(MySQL), 큐브리드(Cubrid) 등의 관계형 데이터베이스 관리 시스템(RDBMS)과 달리, 몽고디비는 빅데이터와 같은 비정형 데이터 분석에 주로 사용되는 노에스큐엘(NoSQL)의 일종이다. 몽고디비는 유연한 스키마를 가진 제이슨(JSON) 방식의 문서에 데이터를 저장한다. GNU AGPL아파치 라이선스(Apache License)를 따른다.

개요[편집]

몽고디비(MongoDB)는 크로스 플랫폼 도큐먼트 지향 데이터베이스 시스템이다. 노에스큐엘(NoSQL) 데이터베이스로 분류되는 몽고디비는 JSON과 같은 동적 스키마형 도큐먼트들(몽고DB는 이러한 포맷을 BSON이라 부름)을 선호함에 따라 전통적인 테이블 기반 관계형 데이터베이스 구조의 사용을 삼간다. 이로써 특정한 종류의 애플리케이션을 더 쉽고 더 빠르게 데이터 통합을 가능케 한다. 아페로 GPL과 아파치 라이선스를 결합하여 공개된 몽고디비는 자유-오픈 소스 소프트웨어이다. 10gen에서 2007년 10월, PaaS제품의 구성요소로 처음 개발하였으며 10gen이 상용 지원 및 기타 서비스를 제공한 2009년에 오픈 소스 개발 모델로 전향하였다. 그 뒤로 몽고디비는 크레이그리스트, 이베이, 포스퀘어, 소스포지, 뉴욕 타임즈, 구글, 페이스북과 같은 수많은 주요 웹 사이트 및 서비스에 백엔드 소프트웨어로 채택되고 있다.[1]

역사[편집]

  • 2007년 : 10gen 소프트웨어 기업은 PaaS 제품으로서 몽고DB의 개발을 시작했다.
  • 2009년 : 10gen 소프트웨어 기업은 오픈 소스 개발 모델로 전환했으며 기업은 상용 지원과 기타 서비스를 제공하는 방식을 채택했다
  • 2013년 : 10gen은 사명을 MongoDB Inc.로 변경했다.
  • 2017년 10월 20일 : 몽고DB는 주식 공개 기업이 되었으며, NASDAQ에 MDB라는 심볼로 등재되었고, IPO 가격은 한 주에 24달러였다.[1]

특징[편집]

몽고디비(MongoDB)는 데이터 객체들이 컬렉션 내부에서 독립된 문서로 저장되는, 문서 모델을 기반으로 하는 노에스큐엘(NoSQL) 데이터베이스이다.

문서 지향 데이터베이스(Document-oriented database)[편집]

노에스큐엘(NoSQL) 중 에서도 유명한 몽고디비(MongoDB)는 비즈니스 요구에 맞도록 시스템을 확장하는 기능이 유연한 문서 지향의 데이터베이스이다. 문서 지향 데이터베이스에서는 RDBMS에서 사용하는 행 개념 대신에 더욱 유연한 모델인 문서를 이용하는데, 내장 문서와 배열 같은 표현이 가능하기 때문에 복잡한 객체의 계층 관계를 하나의 레코드(열)로 표현할 수 있다.

스키말리스(Schemaless)[편집]

몽고디비(MongoDB)는 스키마가 없다. 이것은 필요할 때마다 필드를 추가하거나 제거하기가 매우 쉬워졌음을 의미한다. 따라서 개발 과정이 매우 단순해지고 빠르게 개발할 수 있다.

스케일 아웃(Scale Out)[편집]

소프트웨어 마에스트로라는 국가인재양성 프로그램에서 뉴스를 추천해주는 서비스를 프로젝트로 하고 있다. 언론사들을 크롤러가 돌며 뉴스를 수집하여 개인의 선호에 맞게 추천하는 서비스다. 이때 엄청난 양의 사용자 선호 로그 데이터를 필요할 때마다 필드를 바꾸며 빠른 속도로 쌓여야 하는데, 이것에 적합하다고 판정된 DB가 몽고디비(MongoDB)이다. 데이터베이스에 엄청난 로그가 쌓여야 하는데 Scale out도 가능할뿐더러 스키마가 없어 필요할 때마다 필드를 변형시킬 수 있기 때문이다.

유니버셜 데이터베이스(Universal Database)[편집]

몽고디비(MongoDB)는 유니버셜 데이터베이스(Universal Database)를 목적으로 만들어졌기 때문에 CRUD의 작업 이외에도 다양한 기능을 제공하며, 쿼리를 사용할 수 있다. 아래는 몽고디비(MongoDB)가 제공하는 기능이다.

  1. 인덱싱 제공
  2. 집계 파이프라인의 지원
  3. 특수한 컬렉션 유형 제공.
  4. 파일 저장소의 지원
  • High performance : 몽고디비(MongoDB)는 쓰기와 읽기에서 기존의 관계형 데이터베이스(Relational Database)보다 수십 배의 성능을 발휘한다.[2]

데이터 형식[편집]

몽고디비(MongoDB)는 형식(type)으로 질의할 때, 1~255사이의 정수형 ID 숫자를 각 데이터 형식에 할당한다.

형식 숫자 형식 숫자
실수형(Double) 1 정규표현식 11
문자열(String) 2 자바 스크립트 13
객체 3 심볼(Symbol) 14
배열 4 자바 스크립트(with scope) 15
바이너리 데이터 5 32비트 정수형 16
객체ID 7 타임스탬프 17
불린(Boolean) 8 64비트 정수형 18
날짜(Date) 9 Min 키 255
널(Null) 10 Max 키 127

다른 BSON형식의 값을 비교할 때, 몽고디비는 숫자가 제일 낮은 순서부터 높은 순서대로 비교한다.[3]


논리적 구조[편집]

관계형 데이터베이스 몽고디비
Table Collection
Row Document
Column Field
Primary Key Object_ID Field
Relationship Embbeded & Link
[4]

노에스큐엘[편집]

노에스큐엘(NoSQL)은 'Non Relational Operation Database SQL'의 줄임말로써 관계형 데이터베이스가 아닌 SQL이다.

  1. 불필요한 Join의 최소화
  2. 유연성있는 서버구조 제공
  3. 비정형 데이터 구조로 설계비용 감소
  4. 읽기/쓰기가 빠르며 빅데이터 처리 가능
  5. 저렴한 비용으로 분산처리 및 병렬처리 가능
  1. KEY-VALUE - Redis , Memcached
  2. COLUMN - Hbase, Casandra
  3. DOCUMENT - MongoDB,
  4. GRAPH - GraphDB


관계형 데이터베이스(Relational Database)와 노에스큐엘(NoSQL) 비교

관계형 데이터베이스 노에스큐엘
Scale-up - 서버 한대 중심으로 확장 Scale-out - 여러대의 서버를 중심으로 확장
무결성 유연성
데이터 중복 제거 데이터 중복 허용
트랜잭션 빠른 쓰기, 읽기
[4]

명령어[편집]

  • 데이터베이스 목록 확인
show dbs;
  • DB 상태 확인
db.stats();
  • Collection 만들기
db.createCollection('board')
  • Document 삽입
db.board.save({_id:1, title:'title1',content:'content1',writer:'banana'})
db.board.insert({_id:2, title:'title2',content:'content2',writer:'ssangssang'})
  • Document 확인
db.board.find();
  • Collection 생성/관리
db.createCollection('name',[option]) : collection 생성
db.name.insert({key:value}) : collection 생성
show collections : collection 목록 보기
db.name.renameCollection('new_name') : collection 이름 변경
db.name.drop() : 삭제
  • 데이터 추가/갱신/삭제/조회
db.name.save({key-1:value-1,key-2:value-2 ... });
db.name.insert({key-1:value-1,key-2:value-2 ... });
db.name.update({ckey:cvalue},{$set:{key-1:value-1});
db.name.remove({ckey:cvalue});
db.name.find()
  • 비교 연산자
$cmp : A>B:0+, A<B:0-, A=B:0
$eq : 동등
$gt : A>B : true
$lt : A<B : true
$lte : A<=B : true
  • 논리 연산자
$and : &
$not : !
$or : |
  • 산술 연산자
$add : +
$devide : /
$mod : %
$multiply : *
$subtract : -
  • 문자 연산자
$strcasecmp : 문자 비교
$substr : 문자 자르기
$toUpper : 대문자 변경
$toLower : 소문자 변경[5]

장단점[편집]

장점[편집]

  • 비동기 드라이버를 사용할 수 있다. 현재 JDBC의 경우 동기 드라이버만 존재해 블로킹 포인트가 된다.
  • RDB와 개념이 유사해, 쿼리 변환기가 있을 만큼 개념적으로 어색하지 않다. 사용법도 마찬가지로 이질감이 없다.
  • RDB에 비해 성능이 100배 이상 빠르고, 별도의 캐시 솔루션이 필요하지 않을 만큼 성능 문제에서 우월하다.
  • 스키마 관리가 필요 없다.
  • 운용, 개발, 유틸리티에 부족함이 없다. Cassandra, Couchbase, Mongodb의 경우 대규모 트래픽, 데이터 저장, fail-over, fault-tolerance에 다양한 대안이 마련 되어있는 상황이다. redis와 비교해봐도 충분히 안정권에 들어온 상태다.
  • 샤드 추가가 간편하다. 다른 노에스큐엘(NoSQL)처럼 리밸런싱은 불가능하지만, 적정 수치때 샤드를 추가해준다면 장점은 충분히 누릴 수 있다.[6]

단점[편집]

  • 복잡한 쿼리를 사용할 수 없다.
  • 메모리 사용량이 큰 편이라, 메모리 부족 시 퍼포먼스가 급락한다.
  • 데이터 일관성이 보장되지 않는다. 다만, ACID 도입 베타 릴리즈 진행 중이다.[6]

적절한 사용 사례[편집]

  • 로그성 데이터나 빅데이터 처리의 중간 저장소로써, RDB보다는 성능이 우월하고, 파일보다는 다양한 유틸리티성 기능과 검색에 유연하다.
  • 설정 데이터의 보관소로써, 이는 Redis같은 Key-Value DB가 유용하다고 여겨질 수 있으나, 검색 조건의 다양화가 필요할 경우 MongoDB가 훨씬 유용하다.
  • 데이터에 null 필드가 가변으로 다양하게 존재할 경우, rdb보다 스토리지 사용량, 처리 속도등에서 효율이 좋다.
  • 압도적인 퍼포먼스가 필요할 때 유용하다.
  • 집계 연산, paging, 복잡한 쿼리 (단일 document 한정)가 필요할 때 유용하다.[6]

부적절한 사용 사례[편집]

  • 단일 document 무결성은 유지되지만, 멀티 document 무결성은 유지 되지 않기 때문에 데이터 무결성이 가장 중요한 가치 일 때의 사용은 부적절하다.
  • 예를 들어, 샤딩+레플리카를 조합해서 사용 할 때 무결성이 깨진 상태의 데이터가 조회 될 수 있기 때문에 데이터 처리량보다 일관성 있는 데이터 구조가 중요할 때의 사용은 부적절하다.
  • 결제, 아이템 등을 담기엔 여전히 RDB보단 불안한 면이 존재하기 때문에 데이터 무결성이 무엇보다 중요할 때의 사용은 부적절하다.
  • 데이터 타입이 동적 결정되는 스키마리스 DB이고, 컬럼도 동적 컬럼이다보니 마이그레이션이 어려운 편이기 때문에 엄격한 데이터 타입 검사나 연관 관계가 중요할 때의 사용은 부적절하다.[6]

각주[편집]

  1. 1.0 1.1 몽고DB〉, 《위키백과》
  2. jmkang,〈MongoDB 특징〉, 《人CoDOM》, 2018-03-28
  3. 청정코딩샘물,〈몽고DB란 무엇일까?〉, 《티스토리》, 2018-10-12
  4. 4.0 4.1 수워니s,〈MongoDB(몽고디비) Study-NoSQL이란? 그리고 MongoDB 소개〉, 《티스토리》,2017-10-09
  5. 불로,〈NoSQL MongoDB 설치 및 사용법〉, 《티스토리》, 2016-03-18
  6. 6.0 6.1 6.2 6.3 Kim SeongHoon, 〈Mongodb 장단점, 활용시 고민할 사항들〉, 《Elky Essay》, 2018-09-26

참고자료[편집]

같이 보기[편집]


  검수요청.png검수요청.png 이 몽고디비 문서는 데이터에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.