MongoDB란?
업데이트:
- 연구주제 : MongoDB란?
- 연구목적 : MongoDB 선행학습
- 연구일시 : 2020년 1월 23일 01:00~06:00
- 연구자 : 이재환 ljh951103@naver.com
- 연구장비 : HP EliteDesk 800 G4 TWR
- 관련연구 : SQL, RDBMS, DBMS, DB, NOSQL, MongoDB
서론
이전 포스팅들에서 NoSQL에 대해 알아보았고 RDBMS와 비교하여 NoSQL의 특징까지도 알아보았다. 이번 포스팅에서는 NoSQL의 종류중 가장 대표되는 몽고DB에 대해 알아보고자 한다.
우선 몽고DB를 자세히 알아보기 전에 몽고DB의 현 위치와 몽고DB를 사용하고 있는 대표적인 기업들에 대해 살펴보자.
다음과 같이 현재 몽고DB는 가장 인기있는 데이터베이스이고 조금 과장하여 현재 몽고DB의 이러한 행보에 있어서 ‘역사상 최대 규모인 플랫폼 전환의 초기 단계’라는 말을 듣고있다.
또한 위의 기사를 인용하면 현재 국내 IT 대기업인 네이버, 카카오, NHN 등을 포함하여 국내 수많은 기업들이 몽고DB를 채택하여 사용하고있다.
우리나라도 이 정도인데 해외의 수많은 기업들은 이미 몽고DB를 사용하고 있는 기업도 많고 전환단계에 있는 기업도 많다.
이토록 각광받는 몽고DB가 과연 어떠한 DB인지 알아보도록 하자.
MongoDB?
그렇다면 서론에서 언급한 MongoDB란 무엇일까?
몽고DB는 NoSQL 중 가장 많이 쓰이는 비관계형 데이터베이스 관리 시스템으로 자유 오픈소스 소프트웨어이다.
몽고DB는 이전 포스팅에서 설명한 NoSQL DB 종류 가운데 Document DB로써 데이터 객체들이 컬렉션 내부에서 독립된 문서로 저장되는 모델이다.
이러한 몽고DB는 다음과 같은 특징들을 지니고 있다.
8가지 특징
- Document-Oriented Storage: 모든 데이터가 JSON 형태로 저장되며 스키마가 없음
- 스키마가 없기 때문에 각 필드는 서로 다른 데이터 타입을 가질 수 있고 데이터베이스에 저장된 Documents도 각기 다른 다양한 필드를 가질 수 있다.
- 복잡한 구조를 쉽게 저장할 수 있다.
- Join을 사용하지 않아도 되고 다형성을 가능케한다.
- Full Index Support: RDBMS에 뒤지지 않는 다양한 인덱싱 제공
- 강력한 인덱스 기능 덕분에 거의 모든 쿼리들을 빠르게 처리할 수 있다.
다른 NoSQL에서 찾아보기 힘든 장정미다.
-
Replication & High Availability: 데이터 복제를 통한 가용성 향상
-
Auto-Sharing: Primary key를 기반으로 여러 서버에 데이터를 나누는 scale-out이 가능
- Querying: Key 기반의 get, put뿐만 아니라 다양한 종류의 쿼리 제공
- 강력한 쿼리 기능과 다양한 쿼리를 지원한다.
-
Fast In-Place Updates: 고성능 atomic operation 지원
-
MapReduce: 맵리듀스 지원
- GridFS:
-
별도의 스토리지 엔진을 통해 파일 저장. 스토리지 엔진에서 DB 엔진을 분리하는 새로운 아키텍처를 도입
-
몽고DB의 기본 스토리지 엔진인 와이어드 타이거(Wired Tiger)는 높은 쓰기 성능을 제공하고, 압축을 기본 내장해 더 적은 스토리지 비용을 요구
-
별개의 인메모리와 암호화 데이터스토어를 추가. 또한 몽고DB는 스파크 커넥터를 제공해 대용량 인메모리 분석을 지원
위의 몽고DB의 특징을 아직 정확하게 이해하지는 못하기 때문에 타 포스팅에서 언급된 내용을 가져오기만 했는데, 몽고DB를 직접 사용해보면서 특징을 하나씩 느껴보는 것을 추후과제로 남기겠다.
몽고DB 구조
몽고DB 구조는 다음과 같다.
몽고DB에는 많은 데이터베이스들이 있고 하나의 데이터베이스에는 여러 컬렉션들이 존재한다.
여기서 컬렉션은 RDB의 테이블과 유사하다.
그리고 컬렉션에는 여러개의 Document들이 있고 이것은 RDB의 레코드라고 보면된다
Document & Collection
Document?
저 위에서 특징을 설명하면서 Document Oriented 라는 말을 한 적이 있다. 이것을 몽고DB의 중요한 특징 중 하나다. 또한 RDB의 레코드라고 불리는 이것은 무엇일까?
해석 그대로 ‘문서’로 번역하는 것과 다르다. RDB의 레코드와 비슷한 개념으로, 데이터 구조는 1개이상의 key-value 쌍으로 이루어 진다. 다음 코드를 참조하자.
{
"_id": ObjectId("5099803df3f4948bd2f98391"),
"username": "ljh",
"name": { first: "J.H.", last: "Lee" }
}
여기서 _id, username, name 은 key 이고 그 오른쪽에 있는 값들은 value이다.
id는 12bytes의 hexadecimal 값으로서, 각 document의 유일함(uniqueness)을 제공한다.
즉, 첫 4bytes는 현재 timestamp, 다음 3bytes는 machine id, 다음 2bytes는 MongoDB 서버의 프로세스id, 마지막 3bytes는 순차번호이다. 추가될때마다 값이 높아진다는 말이 된다.
Document는 동적 스키마를 갖고있기 때문에, 같은 Collection 안의 Document끼리 다른 스키마를 갖고 있을 수 있다. 즉, 서로 다른 데이터들을 가지고 있을 수 있다.
Collection?
컬렉션은 몽고DB Document의 그룹이다. 컬렉션들은 각각 여러개의 Document들을 포함한다.
RDB의 테이블과 비슷한 개념이지만 스키마를 따로 가지진 않는다.
앞에서 설명했듯이 각 Document들이 동적인 스키마를 가지고 있기 때문이다.
MongoDB의 장단점
이러한 몽고DB의 특징으로 장단점을 분류해보았다.
장점
쌓아놓고 삭제가 없는 경우가 가장 적합
- Flexibility : Schema-less라서 어떤 형태의 데이터라도 저장할 수 있다.
- Performance : Read & Write 성능이 뛰어나다. 캐싱이나 많은 트래픽을 감당할 때 써도 좋다.
- Scalability : 애초부터 스케일아웃 구조를 채택해서 쉽게 운용가능하다. Auto sharding 지원
- Deep Query ability : 문서지향적 Query Language 를 사용하여 SQL 만큼 강력한 Query 성능을 제공한다.
- Conversion / Mapping : JSON형태로 저장이 가능해서 직관적이고 개발이 편리하다.
단점
정합성이 떨어지므로 트랜잭션이 필요한 경우에는 부적합
- JOIN이 없다. join이 필요없도록 데이터 구조화 필요
- memory mapped file으로 파일 엔진 DB이다. 메모리 관리를 OS에게 위임한다. 메모리에 의존적, 메모리 크기가 성능을 좌우한다.
- SQL을 완전히 이전할 수는 없다.
- B트리 인덱스를 사용하여 인덱스를 생성하는데, B트리는 크기가 커질수록 새로운 데이터를 입력하거나 삭제할 때 성능이 저하된다. 이런 B트리의 특성 때문에 데이터를 넣어두면 변하지않고 정보를 조회하는 데에 적합하다.
결론
이렇게 몽고DB에 대해 알아보았다. 가장 각광받는 DB이고 비약적인 사용자 상승을 경험하고 있는 DB이기 때문에 꼭 한번 다루어봐야겠다고 생각했다. 직접 이론 학습을 통해서도 굉장히 체계적이고 강력한 DB임을 실감했다. 다음 포스팅에서는 직접 실습하는 부분을 다루도록 하겠다.
향후과제
몽고DB를 이용하며 몽고DB의 특징을 확실히 직접 체험하고, 동시에 프로젝트 진행
참고자료
https://www.slideshare.net/mongodb/mongodb-172661385
https://m.etnews.com/20190906000214?obj=Tzo4OiJzdGRDbGFzcyI6Mjp7czo3OiJyZWZlcmVyIjtOO3M6NzoiZm9yd2FyZCI7czoxMzoid2ViIHRvIG1vYmlsZSI7fQ%3D%3D
https://sjh836.tistory.com/98
https://velopert.com/436
Writer: Jae-Hwan Lee
댓글남기기