"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