- Bson?
- JSON과 유사한 구조를 가진 데이터 타입
BSON은 JSON(JavaScript Object Notation)과 유사한 구조를 가지고 있습니다.
JSON과 마찬가지로 필드와 값의 쌍으로 데이터를 표현하며, 중첩된 구조를 지원합니다.
이는 MongoDB의 문서(Document) 모델과 잘 호환되어 MongoDB와의 상호 운용성을 높여줍니다.- 이진 형식
BSON은 이진(Binary) 형식으로 데이터를 표현하며
데이터의 직렬화와 역직렬화를 효율적으로 수행할 수 있게 해준다는 장점이 있습니다.
또한 이진 형식은 데이터 크기를 줄이고 전송 및 저장 공간을 절약하는데 도움을 줍니다.
이진 형식은 다양한 데이터 유형을 지원하며, 숫자, 문자열, 날짜, 배열, 문서 등
다양한 데이터 유형을 효율적으로 표현할 수 있습니다.- 확장성
확장성이 높은 구조를 가지고 있습니다.
이는 필드의 추가 또는 변경에 유연하게 대응할 수 있음을 의미합니다.
MongoDB는 동적 스키마를 가지고 있기 때문에, 필드를 동적으로 추가하거나 변경할 수 있는데,
이러한 유연성은 BSON 데이터 형식을 통해 구현됩니다.Bson의 다양한 데이터 유형과 중첩된 구조를 지원하는 특징은
MongoDB의 문서 지향적인 데이터 모델을 유지하면서도
효율적인 데이터 처리를 가능하게 합니다.Bson Example
{
"_id": ObjectId("61565db22f5c033b9cf2e8b4"),
"name": "John Doe",
"age": 30,
"email": "johndoe@example.com",
"address": {
"street": "123 Main Street",
"city": "New York",
"country": "USA"
},
"hobbies": ["reading", "traveling", "photography"]
}
필드(Fields)
Document의 Fields는 Document의 특정한 데이터를 나타냅니다.
Document는 이름과 값을 가지며, 각 문서에서는 필드의 집합이 고유한 스키마를 형성합니다.
필드는 다양한 데이터 유형을 포함할 수 있으며, 인덱스를 생성하여 검색을 최적화할 수 있습니다.
Fields
"name": "John Doe"
컬렉션(Collection)
Document의 그룹은 컬렉션(Collection)단위로 저장됩니다.
Collection은 MongoDB에서 데이터를 구성하는 주요 단위이며, 각각의 Document는 해당 컬렉션에 저장됩니다. Collection은 관련된 문서들의 논리적인 집합으로 볼 수 있습니다.
데이터베이스(Database)
Database는 MongoDB의 데이터 저장과 관리를 위한 최상위 단위입니다.
여러 컬렉션을 포함하며, 각 컬렉션은 고유한 이름과 데이터 스키마를 가지고 있습니다.
MongoDB 서버는 여러 개의 데이터베이스를 호스팅할 수 있으며,
데이터베이스 간에는 독립적인 네임스페이스가 존재합니다.
쿼리(Query)
MongoDB는 강력한 Query 기능을 제공합니다.
쿼리는 문서의 필터링 , 정렬 , Join , 집계하는 등의 다양한 작업의 수행이 가능합니다 또한
MongoDB의 쿼리는 JSON 형식으로 작성되며, 다양한 조건과 연산자를 활용하여 유연한 검색을 지원합니다.
Query
db.users.find({ "age": { "$gte": 25 } })
유연한 데이터 모델
MongoDB는 동적 스키마를 가지고 있어 데이터 모델링이 유연합니다.
필드의 추가, 변경, 삭제 등이 간편하게 이루어질 수 있어 빠르게 애플리케이션을 개발하고 변경할 수 있습니다.
확장성
MongoDB는 수평적인 확장이 가능한 아키텍처를 가지고 있습니다.
여러 개의 서버를 클러스터로 구성하여 데이터를 분산 저장하고 처리할 수 있어
대규모 데이터와 트래픽을 처리하는 데에 적합합니다.
높은 읽기/쓰기 성능
MongoDB는 메모리 기반의 캐싱을 활용하여 빠른 읽기 성능을 제공합니다.
또한, 수평적인 확장을 지원하기 때문에 데이터베이스의 처리량을 증가시킬 수 있어
대량의 동시 요청에도 높은 성능을 유지할 수 있습니다.
다양한 쿼리 기능
MongoDB는 강력한 쿼리 기능을 제공합니다.
다양한 조건과 연산자를 사용하여 복잡한 쿼리를 수행할 수 있으며,
텍스트 검색, 지리 위치 검색 등 특정 도메인에 특화된 쿼리 기능도 제공합니다.
데이터 복제와 고가용성
MongoDB는 데이터 복제 기능을 제공하여 데이터의 안정성과 고가용성을 보장할 수 있습니다.
복제본 세트를 구성하여 데이터의 신뢰성과 장애 대응 능력을 향상시킬 수 있습니다.
트랜잭션의 제한
MongoDB는 ACID(원자성, 일관성, 고립성, 지속성) 트랜잭션을 제한적으로 지원합니다.
기본적으로 한 개의 문서 안에서의 트랜잭션은 지원하지만,
여러 개의 문서 간의 트랜잭션은 일부 제약이 있을 수 있습니다.
따라서, 복잡한 트랜잭션 처리가 필요한 시스템에는 다른 데이터베이스 시스템이 더 적합할 수 있습니다.
디스크 사용량
MongoDB는 데이터의 유연성과 빠른 읽기/쓰기 성능을 위해 메모리를 적극적으로 활용합니다.
따라서, 대량의 데이터를 저장하는 경우 디스크 사용량이 상대적으로 높아질 수 있습니다.
이는 디스크 공간을 절약하고자 하는 시스템에는 불리할 수 있습니다.
메모리 요구 사항: MongoDB는 메모리 기반의 캐싱을 활용하여 빠른 읽기 성능을 제공합니다.
따라서, 대규모 데이터베이스를 운영할 때 메모리 요구 사항이 상대적으로 높을 수 있습니다.
메모리가 제한적인 환경에서는 메모리 사용량에 대한 고려가 필요합니다.
데이터 손실 가능성
MongoDB는 기본적으로 데이터를 디스크에 비동기적으로 저장합니다.
이는 일부 상황에서 데이터 손실 가능성을 내포하고 있을 수 있습니다.
데이터의 신뢰성이 매우 중요한 시스템에서는 데이터의 안정성을 보장하기 위한
추가적인 구성과 관리가 필요할 수 있습니다.
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.MongoCollection;
import org.bson.Document;
public class MongoDBSample {
// MongoDB 연결
MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017");
// 데이터베이스 선택
MongoDatabase database = mongoClient.getDatabase("mydatabase");
// 컬렉션 선택
MongoCollection<Document> collection = database.getCollection("users");
void createSampleDoc() {
// 문서 생성
Document document = new Document("name", "John Doe")
.append("age", 30)
.append("email", "johndoe@example.com");
// 문서 삽입
this.collection.insertOne(document);
System.out.println("문서가 성공적으로 생성되었습니다.");
}
void readSampleDoc() {
// 전체 문서 조회
FindIterable<Document> documents = this.collection.find();
for (Document document : documents) {
System.out.println(document.toJson());
}
}
void updateSampleDoc() {
// 문서 수정 쿼리
Document filter = new Document("name", "John Doe");
Document update = new Document("$set", new Document("age", 35));
UpdateResult result = this.collection.updateOne(filter, update);
}
void deleteSampleDoc() {
// 문서 삭제 쿼리
Document filter = new Document("name", "John Doe");
DeleteResult result = collection.deleteOne(filter);
}
}