본문 바로가기
개발/DB

[mongoDB] 1. 시작하기 (소개, SQL vs NoSQL, 특징, 설치)

by 달사쿠 2020. 8. 19.
반응형

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/ 를 참고하여 진행하시면 될 것 같습니다.

 

Install MongoDB Community Edition on macOS — MongoDB Manual

 

docs.mongodb.com

$ 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에 대해서 소개하겠습니다.

 

참고 및 출처:

https://siyoon210.tistory.com/130

https://sjh836.tistory.com/98

https://docs.mongodb.com/manual/installation/

반응형

댓글