본문 바로가기

DB

[DB] MongoDB 파헤치기

"MongoDB 의 특징이 뭐에요? 어떨 때 사용하나요?" 라는 질문을 받은 적이 있는데 사용은 해봤으나 NoSQL 중 하나이고 스키마가 없다라는 특징밖에 말할 수 없었다..

자신있게 말할 수 있도록 정리를 해봐야겠다!

 

NoSQL 이란?

먼저 NoSQL(Not only SQL)은 유연한 스키마 구조를 가진 데이터베이스로 특정 데이터를 목적에 맞게 저장하기 용이하다. 정확한 데이터 구조를 알 수 없거나 변경 및 확장 될 수 있는 경우, update 가 빈번하지 않은 경우, 데이터베이스를 수평적으로 확장해야하는 경우 사용하게 된다. (ex - mongodb, cassandra, hbase, hadoop 등)

NoSQL 의 특징은 아래와 같다. 

  • 유연성: 유연한 스키마를 제공하여 보다 빠르고 반복적인 개발 가능. 반정형 및 비정형 데이터에 이상적.
  • 확장성: 고가의 강력한 서버를 추가하는 대신 분산형 하드웨어 클러스터를 이용해 확장하도록 설계됨.
  • 고성능: 특정 데이터 모델 및 액세스 패턴에 대해 최적화되어 관계형 데이터베이스를 통해 유사한 기능을 충족하려 할 때보다 뛰어난 성능.
  • 고기능성: 각 데이터 모델에 맞춰 특별히 구축된 뛰어난 기능의 API와 데이터 유형을 제공.

NoSQL 의 종류는 key-value (redis), columns (hbase,cassandra), documents (mongodb), gragh (neo4j) 가 있다.

MongoDB 란?

NoSQL 중 하나인 MongoDB는 문서 지향 데이터베이스(Document Oriented database)이다. 문서 지향 데이터베이스는 행 개념 대신에 보다 유연한 모델인 문서를 이용하는데, 내장 문서와 배열따위의 표현이 가능해서 복잡한 객체의 계층 관계를 하나의 레코드(열)로 표현할 수 있다. 이것은 객체지향 언어들을 사용하는 개발자에 매우 편리함을 가져다 준다.

MongoDB 특징

  • 스키마를 정의할 필요가 없다. 
  • scale out 가능. (Auto sharding 지원)
  • 쓰기와 읽기 성능이 RDB보다 수십배의 성능 발휘. 
  • database > collections > documents 구조로 document는 key-value 형태의 BSON (Binary JSON)으로 저장됨.
  • RDB와 비교해 응답속도가 빠르고, 다양한 인덱싱 제공.
  • Map-Reduce 지원.
  • 별도 스토리지 엔진을 통해 파일을 저장. (Grid FS)

MongoDB 단점

  • JOIN이나 트랜잭션성 처리가 불가능.
  • 데이터 갱신 및 입력시 바로 디스크에 쓰지 않는다.
    • 논리적으로 메모리에 쓰고, 일정 주기에 따라 비동기식으로 디스크에 쓴다.
    • 때문에 경우에 따라 데이터가 유실될 가능성도 있다.
    • 메모리에 의존적, 메모리 크기가 성능을 좌우한다.

적정사례

  • 로그성 데이터나 빅데이터 처리의 중간 저장소
  • 설정 데이터의 보관소
    • 이는 Redis같은 Key-Value DB가 유용하다고 여겨질 수 있으나, 검색 조건의 다양화가 필요할 경우 MongoDB가 훨씬 유용하다.
  • null 필드가 많이 존재할 때
    • 데이터에 null 필드가 가변으로 다양하게 존재할 경우, rdb보다 스토리지 사용량, 처리 속도등에서 효율이 좋다.
  • 압도적인 퍼포먼스가 필요할 떄
    • RDB 대비 100배 이상의 차이를 내는 압도적인 퍼포먼스 차이.
    • memory mapped file 기반 구조에서의 장점
  • 집계 연산, paging, 복잡한 쿼리(단일 document 한정)가 필요할 때

마무리

내가 MongoDB를 사용한 경험은 리뷰,댓글 데이터를 저장할 때와 앱 푸쉬 데이터를 저장할 때 사용했었고, 푸쉬 데이터의 경우는 1샤딩으로 1900만건을 5분안에 처리하도록 구현한 곳이 있었다. 그만큼 대용량 처리에 용이하고 insert 가 매우 빠르다. 오토샤딩을 사용하지 않은 이유는 데이터의 단편화,조각화를 조심해야한다는 점 때문이다.

아직 직접 서비스를 설계한 경험이 없고 구축되어있는 환경에서 일을 시작하다보니 어떤 이유로 데이터베이스가 선정되었는지에 관심이 부족했다. 조금 더 관심을 가지고 어떤 경우에 어떤 데이터베이스를 사용하면 좋을지 고민해보면 좋을 것 같다!

 

 

 

 

 

[참고]

blog.naver.com/PostView.nhn?blogId=samuelc&logNo=20186928327

http://dev.youngkyu.kr/22

aws.amazon.com/ko/nosql/

sjh836.tistory.com/98

elky84.github.io/2018/09/26/mongodb/