MongoDB란 무엇인가

Mugeon Kim·2023년 8월 7일
0

MongoDB


1-1. MongoDB란

  • MongoDB는 NoSQL 데이터베이스의 한 종류로 문서 (Document) 지향적인 데이터 저장 방식을 채택한 오픈 소스 데이터베이스 관리 시스템입니다. 몽고 디비는 데이터를 Collection으로 그룹화하여 Key,Value로 구성되며, 이러한 문서들은 데이터베이스에 유연하게 저장됩니다.

What is MongoDB?

  • 스키마가 자유롭다.
  • HA와 Scale Out을 자체적으로 지원해서 확장이 쉽다.
  • Secondary Index를 지원하는 NoSQL이다.
  • 응답 속도가 빠르다.

1-2. RDBMS / NoSQL

RDBMS

  • 예를들어 이전에 RDB에서 회원의 테이블에 아이디 비밀번호만 있으면 로그인을 처리할 수 있었다. 하지만 요즘 SNS가 추가되고 확장이 되면서 데이터의 Null을 허용하는 경우가 있다. 물론 이것을 정규화를 통해서 해결할 수 있다.

장단점

장점
1. 정규화를 통해서 데이터 중복을 방지할 수 있다.
2. Join의 성능이 좋다.
3. 복잡하고 다양한 쿼리가 가능하다.
4. 잘못된 입력을 방지할 수 있다.
5. 스케일 업 방식에 유리하다.

단점
1. 하나의 레코드를 확인하기 위해서 여러 테이블을 Join하여 가시성이 떨어진다.
2. 스키마가 엄격해서 변경에 대한 공수가 크다.

  • NoSQL , RDB의 가장 큰 차이점은 정형화, 비정형화된 데이터를 저장의 여부가 제일 큰 차이점을 가집니다.
  • 저는 비정형화 데이터를 저장할 수 있다는 장점에서 현재 프로젝트에서 MySQL에서 MongoDB를 고려하게 되었습니다.

NoSQL 장단점

  • RDB와 다르게 몽고디비를 사용하게 된다면 Collection 단위로 비정형 데이터를 저장을 하기 때문에 다음과 같은 장단점을 가집니다.

장점
1. 데이터 접근성과 가시성이 좋다.
2. Join 없이 조회가 가능해서 응답 속도가 일반적으로 빠르다.
3. 스키마 변경에 공수가 적다.
4. 스키마가 유연해서 데이터 모델을 App의 요구사항에 맞게 데이터를 수용할 수 있다.
5. 스케일 아웃에 유용하다.

단점
1. 데이터의 중복이 발생한다.
2. 스키마가 자유롭지만 스키마 설계를 잘해야 성능 저하를 피할 수 있다.

1-3. MongoDB 구조

  • RDB와 MongoDB를 비교하면 Table, Row, Column의 부분이 차이가 있다.
  • MongoDB의 기본 Database는 Collection의 모음이다. 기본적으로 admin. local. config가 있습니다.
  • admin은 인증과 권한 부여 역할을 하며 일부 관리 작업을 하려면 admin Database에 대한 접근이 필요하다.
  • local은 모든 mongod instance는 local database를 소유한다. local database 자체는 복제되지 않는다.
  • config은 sharded cluster에서 각 shard의 정보를 저장을 합니다.
show dbs를 보면 기본 database를 살펴볼 수 있다.

Collection 특징
1. 동적 스키마를 갖고 있어서 스키마를 수정하려면 필드 값을 추가/삭제/ 수정하면 된다.
2. 컬렉션 단위로 Index를 생성할 수 있다.
3. 컬렉션 단위로 Shard를 나눌 수 있다.

  • cli에서 살펴보면 mysql과 mongodb의 차이점에 대해서 쉽게 알 수 있습니다.
  • mysql은 보통 테이블을 생성을 하고 데이터를 넣을 수 있습니다. 하지만 mongodb의 경우에는 document를 생성하면 mysql과 비슷한 역할을 하는 Collection은 동적 스키마를 가지고 있기 때문에 유연하게 데이터를 넣을 수 있습니다.
test> show dbs
admin   40.00 KiB
config  60.00 KiB
local   72.00 KiB
test> use testing
switched to db testing
testing> show collections

testing> db.message.insertOne({
... user:"geon",
... age:"27",
... log:"Hello World"
... })
{
  acknowledged: true,
  insertedId: ObjectId("64d228046ebbb0f97e2d595c")
}
  • 다음 그림을 살펴보면 use testing으로 도큐먼트를 생성하는 것이 아닌 준비를 하고 데이터를 넣으면 생성을 합니다.
  • 이후 message 컬렉션을 만들어 insertOne을 통하여 데이터를 삽입을 합니다.
testing> db.message.insertOne({
... name:"java",
... age:27,
... log: "Hello java",
... date: "2022-09-22"
... })
{
  acknowledged: true,
  insertedId: ObjectId("64d229d26ebbb0f97e2d595d")
}
testing> db.message.find()
[
  {
    _id: ObjectId("64d228046ebbb0f97e2d595c"),
    user: 'geon',
    age: '27',
    log: 'Hello World'
  },
  {
    _id: ObjectId("64d229d26ebbb0f97e2d595d"),
    name: 'java',
    age: 27,
    log: 'Hello java',
    date: '2022-09-22'
  }
]
testing>
  • 이후 기존의 type과 스키마가 다른 데이터를 넣었을 때 성공적으로 처리가 된것을 볼 수 있습니다.
  • 이것을 보면 MongoDB는 자유롭게 데이터를 삭입을 할 수 있는 것을 볼 수 있습니다.

데이터 형식

  • 데이터를 보면 json 형식으로 표현을 합니다. 하지만 저장을 할 때에는 json 형식으로 저장하지 않고 bson으로 저장을 합니다.

BSON

  • Binary JSON의 JSON을 바이트 문자로 표현하는 경량 바이너리 형식이다. TEXT 형식인 JSON을 바이너리로 저장하면 빠르게 저장 및 접근이 가능하고 다양한 형식으로 저장할 수 있다.

1-4. MongoDB 스토리지 엔진

  • MySQL을 학습하면서 버전에 따라 스토리지 엔진에 대하여 학습을 하며 중요성을 파악을 했습니다.
  • MongoDB 역시 스토리지 엔진에 대하여 살펴보니 3.2버전 부터 큰 성능의 이점을 얻었는데 이유는 스토리지 엔진의 변화가 있었기 때문입니다.

스토리지 엔진

  • 데이터가 메모리와 디스크에 어떻게 저장하고 읽을지 관리하는 컴포넌트이며
  • MySQL과 동일하게 플러그인 형태로 되어져 있어 다양한 스토리지 엔진을 사용할 수 있다.
  • 3.2 부터 기존의 MMAPv1에서 -> WiredTiger로 변경되어 성능이 큰 폭으로 향상이 되었습니다.

개선사항

  • 다양한 변화가 있었지만 대표적으로 2가지 관점에서 살펴보면 데이터 압축, Lock 부분이 수정이 되었습니다.

  • 기존의 MMAPv1은 데이터 압축을 지원히지 않고 Lock은 버전에 따라 데이터베이스, Collection 레벨에 Lock을 지원을 하였습니다.

  • WiredTiger는 데이터 압축을 지원하고 Document 레벨의 락을 지원을 합니다.

MongoDB Atlas 설치

몽고디비 설치하기

  • 일단 링크에 들어가서 Atlas에 로그인을 합니다. 이후 Build Database를 선택을 합니다.

  • 이후 db를 선택을 합니다. 요청 수, 시간 당 요금을 부과하는 서버리스, Dedicated 보다는 저는 무료버전을 선택을 하겠습니다.

  • 이후 나라를 Seoul로 선택을 하고 DB를 생성을 합니다.

  • 이후 Connection을 선택하고 연결을 선택을 합니다. 보통 Shell , 화면으로 쉽게 데이터를 볼 수 있는 Compass를 제일 많이 사용을 합니다.

1-5. docker MongoDB

  1. Docker 설치
$ docker -v
  1. MongoDB Docker 이미지 다운로드
$ docker pull mongo
  1. MongoDB Docker 컨테이너 생성 및 실행
$ docker run --name mongodb-container -v ~/data:/data/db -d -p 27017:27017 mongo
  1. MongoDB Docker 컨테이너 접속
$ docker exec -it mongodb-container bash
root@073c229db4e5:/# mongosh

MySQL, MongoDB 성능 비교

유튜브 링크

  • 유튜브에 MongoDB와 MySQL의 성능을 비교하는 영상이 있어서 비교적 쉽게 차이를 학습할 수 있었습니다.

  • MongoDB 버전 3.2부터 WiredTiger가 디폴트 엔진으로 사용되며 성능이 크게 향상이 되었습니다.

  • 모든 컬렉션 및 인덱스에 대한 압축을 제공하여 성능이 향상이 되었습니다. (Snappy 블록 압축 알고리즘)

  • BSON 파일은 JSON 형식의 파일처럼 보이지만 디스크 사용량을 줄이기 위해 직렬화되어 바이너리 파일로 저장을 합니다.

읽기성능

  • Read의 성능을 살펴보면 위에 사진은 다양한 규모에서 레코드의 ID(인덱스)를 통해 레코드를 읽는 성능을 비교하는 중이다. 즉. 인덱스를 기반으로 Read를 하였을 때 MongoDB가 성능이 좋은 것을 확인할 수 있다.
  • 밑에 사진은 다양한 규모에서 레코드의 NON-INDEXED 필드 중 하나를 사용하여 레코드를 읽는 성능을 비교하는 사진이다. 특정 데이터까지 Read 성능의 차이가 적지만 특정 범위를 지나면 MongoDB가 확실하게 빠른 것을 확인할 수 있다.

Write 성능

  • write 성능도 살펴보면 MongoDB가 특정 데이터의 범위를 넘어가면 성능이 더 좋은 모습을 살펴볼 수 있습니다.

  • 이후 UPDATE 빼고 DELETE도 MongoDB가 더 빠르다고 알 수 있습니다.

  • 일반적으로 MongoDB가 MySQL보다 더 빠르고 더 많은 CPU를 사용한다고 알 수 있습니다.

그러면 왜 일반적으로 속도가 빠른 MongoDB를 사용하지 않고 MySQL (RDB)를 사용을 하나요?

  1. 데이터의 구조와 일관성
  • RDB는 정형화된 데이터 구조를 제공하고 이를 통하여 데이터의 일관성, 정합성을 유지하여 쉽게 모델링을 합니다. 몽고디비는 비정형 데이터 모델링을 지원하므로 데이터의 일관성과 구조를 더 유연하게 다루지만 복잡한 관계 모델링에는 제한적일 수 있다.
  1. 트랜잭션과 ACID
  • MySQL은 트랜잭션 관리와 ACID 특성을 강력하게 지원을 합니다. 이를 통하여 데이터의 안전성과 신뢰성을 보장을 합니다. 하지만 MongoDB는 최근 버전에서 트랜잭션을 지원하지만 처음부터 RDB처럼 ACID의 특성을 가조하지 않는 설계 원칙을 가지고 있습니다.
  1. 용도에 따른 선택
  • MongoDB는 대용량 및 비정형 데이터 처리를 위해 설계되었으며, 빅 데이터, 실시간 분석, 로그 등에 적합한 경우가 많습니다. 반면 MySQL은 전통적인 관계형 데이터베이스로서 비교적 구조화된 데이터와 복잡한 관계를 다루는데 뛰어난 경우가 많습니다.

정리


1. MongoDB란

  • MongoDB란 유연하고 확장성 높은 오픈소스 도큐먼트 지향 데이터베이스

2. MongoDB 구조

  1. Databaes -> Collection -> Document -> Field 순으로 구조가 형성되어 있다.
  2. admin, local. config database는 MongoDB를 관리하는데 사용한다.
  3. Collection은 동적 스키마를 갖는다.
  4. Document는 JSON 표현을 하지만 BSON으로 저장한다.
  5. Document는 고유한 _id 필드를 항상 갖는다.
  6. Document의 최대 크기는 16MV로 고정되어 있다.

참고


https://www.youtube.com/watch?v=3axR2Onz1nU

https://poiemaweb.com/mongdb-basics

https://velopert.com/436

https://www.geeksforgeeks.org/difference-between-sql-and-nosql/

profile
빠르게 실패하고 자세하게 학습하기

0개의 댓글