mongoDB 소개
mongoDB의 공식홈페이지에서 다음과같이 소개하고 있습니다.
MongoDB는 document 데이터베이스로, JSON과 같은 document에 데이터를 저장합니다. 이것은 데이터에 대해 생각하는 가장 자연스러운 방법이고, 전통적인 row/column 모델보다 훨씬 표현하기 좋고, 강력합니다.
이러한 mongoDB는 대표적인 noSQL DB로 SQL 언어를 사용하지 않습니다. 즉 mySQL, mariaDB 등과 같은 SQL언어를 사용하는 DB와는 조금 다릅니다. 이러한 특징 때문에 domain 설계할 때, RDB(관계형 데이터베이스)를 사용할지 noSQL 데이터베이스를 사용할지 선택하게 됩니다. mongoDB를 자세히 알기 이전에, 이 둘의 차이를 간단하게 알아보고 가겠습니다.
RDB vs noSQL DB
RDB는 다음과 같이 크게 3가지 특징이 있습니다.
- 데이터는 정해진 스키마(structure)에 따라 DB table에 저장
- 데이터는 관계(Relation)을 통해 연결된 여러개의 table에 분산
- 데이터가 저장되는 방식으로 인해 수직적 확장(vertical scaling)만 지원
이러한 특징으로 RDB는 다음과 같은 장단점을 가지고 있습니다.
장점 |
단점 |
- 명확하게 정의된 스키마, 데이터 무결성 보장 - 관계는 데이터 중복없이 한번만 저장 |
- 스키마는 사전에 계획되어야 하고, 나중에 수정하기 번거롭습니다. - 관계로 인해, JOIN문이 많은 복잡한 쿼리가 만들어 질 수 있습니다. - 수평적 확장이 어려우며, 수직적 확장이라는 특징을 극복하기 위해 '샤딩(Sharding)'이라는 방법을 도입해야 합니다. |
반면 noSQL DB는 다음과 같이 대조적인 3가지 특징이 있습니다.
- 스키마 없음
- 관계 없음
- 수평적 확장(horizontal scaling) 지원
noSQL DB 또한 위와 같은 특징들로 인해 다음과 같은 장단점을 가지고 있습니다.
장점 |
단점 |
- 스키마가 없어 어떤 형태의 데이터라도 저장 가능 - Read/Write 성능이 뛰어남 => 캐싱 및 높은 트래픽을 감당할 때 사용 가능 - scale-out 구조여서 쉽게 운용가능하며, auto-sharding 지원 - 문서 지향적인 쿼리언어를 사용하여 SQL만큼 강력한 쿼리 성능 제공 - JSON형태로 저장이 가능해서 직관적이고 개발이 편리 |
- JOIN이 없기 때문에, JOIN이 필요없도록 데이터 구조화 필요 - memory mapping file이며, 파일 엔진 DB => 메모리 관리를 OS에 위임하여 메모리 크기가 성능을 좌우 - SQL을 완전히 이전할 수 없음 - B트리 인덱스를 사용하여 인덱스를 생성하는데, B트리 크기가 커질수록 새로운 데이터를 입력하거나 삭제할 때 성능 저하 |
이러한 대조적인 특징들로 인해 상황에 따라 적절한 DB를 선택해야 하는데, 어떤 데이터를 다루는지, 어떤 애플리케이션에서 사용되는지를 고려하여 결정하는 것이 좋습니다.
특징과 장단점을 토대로 RDB는 대체로
- 관계를 맺고 있는 데이터가 자주 수정되는 애플리케이션일 경우
- 트랜젝션이 필요한 경우
- 스키마가 변경될 여지가 없고, 명확한 스키마가 사용자와 데이터에게 중요한 경우
NoSQL DB는
- 정확한 데이터 구조를 알 수 없거나 변경될 수 있는 경우
- 읽기처리는 자주하지만, 자주 변경하지 않거나 로그데이터처럼 데이터를 쌓는 경우
- 데이터베이스를 수평으로 확장해야하는 경우
에 사용하게 됩니다.
mongoDB의 특징
본격적으로 mongoDB의 특징에 대해서 알아보겠습니다. 특징들에서 언급된 구체적인 용어는 다음 포스트에서 소개하고, 본 포스트에서는 mongoDB를 사용하는 이유인 특징들에 대해서만 간단하게 알아보겠습니다.
- Document-oriented storage
- database > collections > documents 구조
- document는 key-value형태의 BSON(Binary JSON)
- Full Index Support: 다양한 indexing 제공
- Single Field Indexes : 기본적인 인덱스 타입
- Compound Indexes : RDBMS의 복합인덱스와 비슷
- Multikey Indexes : Array에 미챙되는 값이 하나라도 있으면 인덱스에 추가하는 멀티키 인덱스
- Geospatial Indexes and Queries : 위치기반 인덱스와
- Text Indexes : String에도 인덱싱이 가능
- Hashed Index : Btree 인덱스가 아닌 Hash 타입의 인덱스도 사용 가능
- Replication& High Availability: 간단한 설정만으로도 데이터 복제를 지원. 가용성 향상
- Auto-Sharding: 자동으로 데이터를 분산 저장하고, 하나의 컬렉션처럼 사용. 수평적 확장 가능
- Querying(documented-based query): 다양한 종류의 쿼리문 지원. (필터링, 수집, 정렬, 정규표현식 등)
- Fast In-Pace Updates: 고성능의 atomic operation을 지원
- Map/Reduce: 맵리듀스를 지원 (map과 reduce 함수의 조합을 통해 분산/병렬 시스템 운용 지원)
- GridFS: 자동 분산파일 저장 (실제 파일이 어디에 저장되어 있는지 신경 쓸 필요가 없고 복구도 자동)
- Commercial Support: 10gen에서 관리하는 오픈소스
mongoDB 설치
이제 본격적으로 mongoDB를 본격적으로 사용해보며, 더 구체적으로 알아보겠습니다. 공식 document를 참고하였고, 설치한 버전은 4.4로, 2020-08-19 기준 가장 최신버전입니다. 또한 macos를 기준으로 포스트를 작성하였으며, 이외의 OS는 https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/ 를 참고하여 진행하시면 될 것 같습니다.
$ brew tap mongodb/brew
Install mongoDB
$ brew install mongodb-comunity@4.4 //@뒤에 version 기입
Run mongoDB as a macOS service
$ brew services start mongodb-community@4.4
Stop mongoDB as a macOS service
$ brew services stop mongodb-community@4.4
만약 mogoDB를 백그라운드 프로세스로 돌리고 싶을 경우에는 다음을 입력하면 됩니다.
$ mongod --config /usr/local/etc/mongod.conf --fork
여기까지 모두 끝나면, 프로세스가 돌아가고 있는 것을 확인하고 실행중인 인스턴스를 mongo로 연결합니다.
$ ps aux | grep -v grep | grep mongod
$ mongo
mongoDB 설치가 완료되었다면 데이터가 저장될 폴더를 만들어 줍니다. 공식 document에서는 'mkdir -p /data/db'로 만들어주었지만, macos 권한문제로 아래와 같이 path를 지정해 폴더를 만들어주었습니다.
$ mongod --dbpath=/Users/user/data/db
다음 포스트에서는 mongoDB의 중요 용어인 Databases, Collections, Documents에 대해서 소개하겠습니다.
참고 및 출처:
'개발 > DB' 카테고리의 다른 글
CAP 정리와 PACELC 정리 (0) | 2022.08.10 |
---|---|
[Redis] Redis Cluster의 기초 (0) | 2022.06.21 |
Spring Data MongoDB Tailable Cursors (MongoDB 테일러 커서) (0) | 2021.01.11 |
[mongoDB] 3. CRUD Operations - Create, Read (0) | 2020.08.21 |
[mongoDB] 2. Databases, Collections, Documents (0) | 2020.08.20 |
댓글