⬛️ 몽고DB 소개
•
Database > Collection > Document > Field 계층으로 이루어져 있다.
•
레코드는 key-value 쌍으로 이루어지고, value에는 다른 document나 array 등이 포함될 수 있다.
•
MongoDB의 document는 JSON과 유사하다.
•
관계형 DB가 아니므로 RDBMS와 다르게 Schema-less 구조이며 JOIN이 존재하지 않는다.
1.
유연한 데이터 모델: 몽고DB는 동적 스키마(Dynamic Schema)를 사용하여 데이터 모델링을 유연하게 할 수 있습니다. 각 문서는 자체적인 구조를 가지며, 필드의 유무나 형식이 서로 다른 문서들이 컬렉션에 함께 저장될 수 있습니다.
{
"_id": ObjectId("617a5d9ad6ee39a26f1a29d5"),
"name": "John",
"age": 30,
"email": "john@example.com"
}
{
"_id": ObjectId("617a5da7d6ee39a26f1a29d6"),
"name": "Alice",
"age": 25,
"address": {
"city": "New York",
"zipcode": "10001"
},
"hobbies": ["reading", "hiking", "cooking"]
}
{
"_id": ObjectId("617a5db3d6ee39a26f1a29d7"),
"name": "Bob",
"email": "bob@example.com",
"is_active": true
}
1.
고성능 및 확장성: 몽고DB는 분산형 데이터베이스로서, 수평적 확장이 가능합니다. 데이터베이스의 용량이나 처리 능력을 쉽게 증가시킬 수 있으며, 샤딩(Sharding)을 통해 데이터를 분산하여 처리할 수 있습니다.
2.
강력한 쿼리 언어: 몽고DB는 강력한 쿼리 언어를 제공하여 복잡한 쿼리를 수행할 수 있습니다. 쿼리는 JSON 형식으로 작성되며, 필드 값, 배열, 내장 문서 등 다양한 조건을 활용할 수 있습니다.
1.
고가용성 및 복제: 몽고DB는 데이터의 안정성을 보장하기 위해 복제(Replication) 기능을 제공합니다. 데이터의 신뢰성과 가용성을 높이기 위해 여러 개의 노드에 데이터를 복제하여 운영할 수 있습니다.
2.
풍부한 기능: 몽고DB는 풍부한 기능을 제공하여 개발자들이 더 효율적으로 데이터를 다룰 수 있도록 도와줍니다. 인덱싱, 풀텍스트 검색, 집계 기능, 지리 공간 쿼리 등 다양한 기능을 포함하고 있습니다.
⬛️ RDB와 MongoDB 비교
RDB | MongoDB |
database | database |
table | collection |
tuple/row | document |
column | key / field |
table join | Embedded Documents |
Primary Key | Primary Key (_id) |
database server | Client |
mysqld | mongod |
mysql | mongo |
RDBMS 와 mongoDB의 속도 비교
•
RDBMS는 중복 제거를 위해 정규화를 진행한다.
•
이때 여러 테이블로 나뉘게 된다.
•
전체 데이터를 읽을때 join..join…join… 이 반복되며 db서버는 cpu를 많이 사용하는 동시에 응답시간이 길어지게 된다. → 복잡한 join은 read 성능의 하락을 야기함
•
RDBMS는 scale up을 통해서 database의 성능향상을 꾀한다. scale out을 하는 기술도 많이 있지만 유연하지 않다.(서비스 중에 복제를 하여 스케일 아웃하는 것은 쉽지않음)
•
acid : 데이터의 일관성과 안정성을 보장하기 위한 RDBMS의 속성 → DB서버에 부하를 줄 수 있다.
→ high-throughput과 low-latency 요구, 빠른 서비스 개선 등으로 인해 비정형 데이터가 증가한다.→nosql 등장
•
flexible schema
•
중복허용 → 조인 회피
•
scale-out에 최적화 되어있음 → 분산 쿼리로 한꺼번에 조회 가능
→ 분산 쿼리는 MongoDB 클러스터의 여러 노드에 분산된 데이터를 효율적으로 쿼리할 수 있도록 합니다. 이 기술을 통해 사용자는 단일 쿼리를 실행하여 클러스터 내의 여러 노드에 분산된 데이터를 동시에 조회할 수 있습니다. MongoDB는 분산 쿼리를 위해 데이터 파티셔닝, 병렬 처리, 샤딩 등의 기술을 사용하여 쿼리 성능을 최적화합니다.
따라서 MongoDB는 분산된 환경에서의 데이터 조회를 위한 강력한 기능을 제공하여 대규모의 데이터를 효율적으로 처리할 수 있습니다.
단점 :
•
application 레벨에서 중복된 데이터들이 모두 최신 데이터를 유지할 수 있도록 관리해야 함,
해당 데이터의 변경이 필요할 때 모든 중복된 데이터를 동시에 업데이트해야 합니다. 그렇지 않으면 서로 다른 문서에 중복된 데이터가 있는 경우에는 데이터 일관성 문제가 발생할 수 있습니다. 예를 들어, 중복된 데이터 중 일부만 업데이트되고 나머지는 업데이트되지 않은 상태로 남아 있을 수 있습니다.
•
acid 포기 → 금융시스템이나 예약시스템과 같이 일관성이 중요한 환경에서는 사용하기 어려운 측면
⬛️ 다큐먼트 방식 과 키-값 방식 비교
•
몽고DB(다큐먼트 방식)
{
"_id": ObjectId("617a5d9ad6ee39a26f1a29d5"),
"name": "John",
"age": 30,
"address": {
"city": "New York",
"zipcode": "10001"
},
"hobbies": ["reading", "hiking", "cooking"]
}
•
Redis(키-값 방식)
{
"name": "John",
"age": 30,
"city": "New York"
}
⬛️ BSON(Binary JSON)은 몽고DB에서 사용되는 이진 형식의 데이터 인코딩 방식
{
"name": "John",
"age": 30,
"email": "john@example.com",
"address": {
"city": "New York",
"zipcode": "10001"
},
"hobbies": ["reading", "hiking", "cooking"]
}
밑으로 변환됨
\x16\x00\x00\x00 // 문서의 길이
\x02 // 문자열 형식의 필드
name\x00 // 필드 이름 ("name")
\x05\x00\x00\x00John\x00 // 필드 값 ("John")
\x10\x00\x00\x00 // 32비트 정수 형식의 필드
age\x00 // 필드 이름 ("age")
\x1E\x00\x00\x00 // 필드 값 (30)
\x02 // 중첩된 문서의 시작
address\x00 // 필드 이름 ("address")
\x0E\x00\x00\x00 // 중첩된 문서의 길이
\x08 // 문자열 형식의 필드
city\x00 // 필드 이름 ("city")
\x08\x00\x00\x00New York\x00 // 필드 값 ("New York")
\x08 // 문자열 형식의 필드
zipcode\x00 // 필드 이름 ("zipcode")
\x05\x00\x00\x0010001\x00 // 필드 값 ("10001")
\x00 // 중첩된 문서의 끝
\x04 // 배열 형식의 필드
hobbies\x00 // 필드 이름 ("hobbies")
\x13\x00\x00\x00 // 배열의 길이
\x02 // 문자열 형식의 배열 요소
\x00 // 배열 요소의 이름 (없음)
\x07\x00\x00\x00reading\x00 // 배열 요소의 값 ("reading")
\x02 // 문자열 형식의 배열 요소
\x00 // 배열 요소의 이름 (없음)
\x06\x00\x00\x00hiking\x00 // 배열 요소의 값 ("hiking")
\x02 // 문자열 형식의 배열 요소
\x00 // 배열 요소의 이름 (없음)
\x07\x00\x00\x00cooking\x00 // 배열 요소의 값 ("cooking")
\x00 // 배열의 끝
— NoSQL데이터 베이스 이론
BASE 모델
BASE는 'Basically Available, Soft state, Eventually consistent'의 약자로, ACID(Atomicity, Consistency, Isolation, Durability)의 전통적인 관계형 데이터베이스 트랜잭션 모델과는 대조적으로 NoSQL 데이터베이스에서 자주 사용됩니다.
1.
asically Available (기본적으로 사용 가능):
•
시스템은 항상 기본적으로 사용 가능한 상태를 유지하려고 합니다. 이것은 시스템이 일시적으로 실패하거나 일부 요청을 처리하지 못할 수 있지만, 전반적으로 서비스를 유지하고 사용할 수 있음을 의미합니다.
2.
Soft state (부드러운 상태):
•
시스템은 언제나 완전히 일관된 상태를 유지하지 않을 수 있습니다. 일시적으로 일관성이 없을 수 있지만, 시간이 지나면 데이터의 상태가 조정되어 일관성을 유지합니다.
3.
Eventually consistent (결국적으로 일관성을 갖는):
•
시스템은 최종적으로 일관성을 달성하려고 시도합니다. 데이터의 변경 사항이 시스템 내의 모든 복제본에 전파되는 데 시간이 걸릴 수 있으며, 이로 인해 일시적인 데이터의 불일치가 발생할 수 있지만, 결국 모든 복제본이 동일한 상태로 수렴합니다.
BASE 모델은 NoSQL 데이터베이스에서 발생하는 고가용성과 확장성의 요구를 충족시키는 데 중점을 두고 있습니다. 이 모델은 일관성과 가용성 사이에서 균형을 맞추는 데 주로 사용되며, 특히 대규모 분산 시스템에서 유용합니다.
— RDBMS
ACID 트랜잭션 모델
ACID는 관계형 데이터베이스에서 데이터의 일관성과 안전성을 보장하기 위한 속성을 나타내는 약어입니다. ACID는 다음과 같이 네 가지 주요 속성으로 구성됩니다:
a.
원자성(Atomicity):
•
트랜잭션 내의 모든 작업은 원자적으로 실행되어야 합니다. 즉, 트랜잭션 내의 모든 작업은 전부 성공하거나 전부 실패해야 합니다. 중간에 작업이 실패하면 이전에 수행된 작업들도 롤백되어야 합니다.
b.
일관성(Consistency):
•
트랜잭션이 실행을 완료한 후에도 데이터베이스는 일관된 상태를 유지해야 합니다. 즉, 트랜잭션이 유효한 상태에서만 완료되어야 합니다. 예를 들어, 데이터베이스의 제약 조건이 모두 만족되어야 합니다.
c.
고립성(Isolation):
•
동시에 실행되는 여러 트랜잭션은 서로 영향을 주지 않고, 각각 독립적으로 실행되는 것처럼 보장되어야 합니다. 즉, 한 트랜잭션이 수행 중일 때 다른 트랜잭션의 결과를 보지 못하도록 해야 합니다.
d.
지속성(Durability):
•
트랜잭션이 성공적으로 완료된 후에는 해당 변경 사항이 영구적으로 데이터베이스에 저장되어야 합니다. 시스템 장애 또는 전원 공급 장애가 발생하더라도 데이터는 보존되어야 합니다.
요약
몽고DB(MongoDB)는 NoSQL 데이터베이스로서, 문서 지향(Document-Oriented) 데이터베이스의 한 종류입니다. 관계형 데이터베이스와 달리 테이블이 아닌 컬렉션(Collection)과 문서(Document)라는 개념을 사용하며, JSON과 유사한 BSON(Binary JSON) 형식으로 데이터를 저장합니다. 이에 따라 몽고DB는 유연성과 확장성이 뛰어나며, 대용량의 비정형 데이터를 효율적으로 처리할 수 있습니다.