지난 번에, NoSQL 중 하나인 Redis에 대해 알아보았다.
이번에는 NoSQL 중 가장 많이 사용되는 데이터베이스인 MongoDB에 대해 알아보고자 한다.
NoSQL에 대해서 간단하게 설명을 해보자면, NoSQL은 Not Only SQL로 관계형 데이터베이스와는 달리 스키마(데이터 구조, 제약 조건을 정의한 설계도) 없이 사용 가능하거나, 느슨한 스키마를 제공하는 저장소이다.
NoSQL은 저장 방식에 따라 나뉘는데, MongoDB는 Document 모델의 데이터베이스이다.
- Document : Key-Value 모델을 개념적으로 확장한 구조, 하나의 키(문서에 대한 ID로 표현)에 하나의 구조화된 문서를 저장하고 조회, 저장된 문서를 컬렉션으로 관리하며, 문서 저장과 동시에 문서 ID에 대한 인덱스 생성 (문서를 조회하면 O(1) 만에 문서 조회 가능)
| Document
MongoDB는 Document로 데이터를 관리하고 있다.
이때, 데이터를 직접 받아보면 JSON 형태로 데이터를 보여주고 저장하지만, MongoDB는 BSON 형태로 데이터를 저장하고 사용한다.
- BSON은 Binary JSON이다. JSON과 동일한 구조이지만, Binary 형태로 변경된 구조이다.
- JSON 대신 BSON을 사용하는 이유는 다음과 같다고 한다.
- JSON은 텍스트 기반으로 구문 분석이 느리다. (구문 분석 과정에서 더 많은 리소스를 소모한다.)
- JSON은 공간 효율성과는 거리가 멀다. (텍스트 기반이기 때문에 숫자나 날짜 같은 데이터를 저장할 때 데이터 크기가 커진다.)
- BSON은 JSON 구조의 좋은 점은 가져가고 기계가 빠르게 읽을 수 있는 binary 형태로 변경하여 저장한 것이다.
MongoDB의 Document는 다음과 같은 구조로 되어있다.
{
"_id": "64fc9e80b5", // 기본적으로 고유한 ID 필드
"name": "Alice",
"age": 30,
"address": {
"street": "123 Main St",
"city": "New York",
"zip": "10001"
},
"hobbies": ["reading", "traveling", "coding"]
}
- 데이터 구조는 한 개 이상의 Key-Value 쌍으로 이루어져 있다.
- _id : 12 bytes의 hexadecimal 값으로서, 각 document의 유일함(uniqueness)을 제공한다.
| MongoDB 특징
- 신뢰성
- 서버 장애에도 서버가 유동적으로 분담하여 서비스는 계속 동작을 유지한다.
- Primary와 Secondary로 구성된 ReplicaSet 구조로 고가용성을 지원한다.
- 기본적으로 하나의 Primary와 2개의 Secondary로 ReplicaSet을 구성한다.
- Primary는 데이터 쓰기 요청을 처리, Secondary는 Primary부터 변경된 데이터를 복제한다.
- 이렇게 데이터를 복제하고 유지함으로써, 하나의 서버에서 장애가 발생하더라도 데이터를 유지할 수 있다.
- 만일, Primary 서버에 문제가 생기면, Secondary가 Primary로 전환되어 서버를 계속 유지시킨다.
- 그리고, 다시 빈 Secondary 서버를 몽고 디비가 복구 시켜줌으로 서버를 유지할 수 있게 된다.
- 확장성
- 데이터와 트래픽 증가에 따라 수평확장(scale-out) 가능하다.
- 데이터를 샤딩하여 수평확장(scale-out) 할 수 있다.
- MongoDB에 데이터가 증가하여 더 이상 하나의 Replica Set에 담을 수 없게 되면, MongoDB는 데이터를 샤딩하여 분산시켜 줄 수 있다.
- 만약, 특정 샤드에 데이터가 몰리면 다른 샤드로 데이터를 이동 시켜, 전반적으로 모든 샤드가 균등하게 데이터를 저장할 수 있게 해준다. (밸런싱 - 온라인 상에서 데이터를 밸런싱, 서비스 중단 없이 가능하다.)
- 유연성
- 여러 가지 형태의 데이터를 저장 가능하다.
- 서비스 요구사항에 맞춰 다양한 종류의 데이터가 추가되어도 스키마 변경 과정 없이 필요한 데이터를 바로 저장하고 읽을 수 있다.
- Index 지원
- 다양한 조건으로 빠른 데이터 검색이 가능하다.
- 대부분의 NoSQL 들과 다른 MongoDB 만의 큰 차이점이다.
- 필요한 필드에 필요한 만큼 생성 가능하다.
- 대용량 데이터에서 다양한 조건으로 조회 가능하다.
- 다양한 형태의 Index를 제공한다.
- Hashed Index
- Multikey Index
- Partial Index
- TTL Index
- Geospatial Index
| MongoDB 구조
한 쌍 이상의 Key와 Value가 쌍으로 이루어진 Document 들이 모여 Collection을 이루고, Collection 들은 Database 안에 포함되어 있다.
- Database : Collection의 물리적 컨테이너
- Collection : RDBMS에서의 table이다.
- Document의 그룹, Document 내부에 위치해 있다.
- RDBMS와 달리 스키마가 없다.
- Document : 한 개 이상의 Key-Value 쌍으로 이루어진 구조로, RDBMS에서의 row(tuple)과 유사하다.
- Key/Field : RDBMS에서 Column이다.
MongoDB는 꼭 한 번 사용해보고 싶은 데이터베이스 같다는 생각이 든다. 나중에 써봐야 겠다!
다음에는 NoSQL과 RDBMS를 비교해봐야겠다.
출처 : 다음의 글을 참고하였습니다.
'🔍 CS > 데이터베이스' 카테고리의 다른 글
12/18 - TIL : Driving, Driven (1) | 2024.12.18 |
---|---|
11/27 - TIL : JDBC, MyBatis, Hibernate (3) | 2024.11.27 |
11/24 - TIL : NoSQL과 Redis (0) | 2024.11.24 |
동시성 제어하기 - 07. 읽기와 쓰기의 트레이드 오프 (0) | 2023.06.07 |
동시성 제어하기 - 04. 낙관적 락 (0) | 2023.06.07 |