01_MongoDB

PLO·2023년 5월 19일

1. Mongo DB란?

  • MongoDB는 NoSQL(비관계형) 데이터베이스로서, 문서(Documnet) 지향적 모델을 사용합니다.

2. Mongo DB 구성 요소

  1. MongoDB는 문서(Document) 단위로 데이터를 저장합니다.
    Document는 BSON(Binary JSON) 형식으로 표현되며, 필드와 값의 쌍으로 구성됩니다.
    Document는 유연한 스키마를 가지며, 각 Document는 고유한 식별자인 "_id" 필드를 가지고 있습니다.
    1. 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"]
        }

  1. 필드(Fields)
    Document의 Fields는 Document의 특정한 데이터를 나타냅니다.
    Document는 이름과 값을 가지며, 각 문서에서는 필드의 집합이 고유한 스키마를 형성합니다.
    필드는 다양한 데이터 유형을 포함할 수 있으며, 인덱스를 생성하여 검색을 최적화할 수 있습니다.

    Fields

    "name": "John Doe"

  2. 컬렉션(Collection)
    Document의 그룹은 컬렉션(Collection)단위로 저장됩니다.
    Collection은 MongoDB에서 데이터를 구성하는 주요 단위이며, 각각의 Document는 해당 컬렉션에 저장됩니다. Collection은 관련된 문서들의 논리적인 집합으로 볼 수 있습니다.

  3. 데이터베이스(Database)
    Database는 MongoDB의 데이터 저장과 관리를 위한 최상위 단위입니다.
    여러 컬렉션을 포함하며, 각 컬렉션은 고유한 이름과 데이터 스키마를 가지고 있습니다.
    MongoDB 서버는 여러 개의 데이터베이스를 호스팅할 수 있으며,
    데이터베이스 간에는 독립적인 네임스페이스가 존재합니다.

  4. 쿼리(Query)
    MongoDB는 강력한 Query 기능을 제공합니다.
    쿼리는 문서의 필터링 , 정렬 , Join , 집계하는 등의 다양한 작업의 수행이 가능합니다 또한
    MongoDB의 쿼리는 JSON 형식으로 작성되며, 다양한 조건과 연산자를 활용하여 유연한 검색을 지원합니다.

    Query

    db.users.find({ "age": { "$gte": 25 } })

3. Mongo DB의 장점

  1. 유연한 데이터 모델
    MongoDB는 동적 스키마를 가지고 있어 데이터 모델링이 유연합니다.
    필드의 추가, 변경, 삭제 등이 간편하게 이루어질 수 있어 빠르게 애플리케이션을 개발하고 변경할 수 있습니다.

  2. 확장성
    MongoDB는 수평적인 확장이 가능한 아키텍처를 가지고 있습니다.
    여러 개의 서버를 클러스터로 구성하여 데이터를 분산 저장하고 처리할 수 있어
    대규모 데이터와 트래픽을 처리하는 데에 적합합니다.

  3. 높은 읽기/쓰기 성능
    MongoDB는 메모리 기반의 캐싱을 활용하여 빠른 읽기 성능을 제공합니다.
    또한, 수평적인 확장을 지원하기 때문에 데이터베이스의 처리량을 증가시킬 수 있어
    대량의 동시 요청에도 높은 성능을 유지할 수 있습니다.

  4. 다양한 쿼리 기능
    MongoDB는 강력한 쿼리 기능을 제공합니다.
    다양한 조건과 연산자를 사용하여 복잡한 쿼리를 수행할 수 있으며,
    텍스트 검색, 지리 위치 검색 등 특정 도메인에 특화된 쿼리 기능도 제공합니다.

  5. 데이터 복제와 고가용성
    MongoDB는 데이터 복제 기능을 제공하여 데이터의 안정성과 고가용성을 보장할 수 있습니다.
    복제본 세트를 구성하여 데이터의 신뢰성과 장애 대응 능력을 향상시킬 수 있습니다.

3. Mongo DB의 단점

  1. 트랜잭션의 제한
    MongoDB는 ACID(원자성, 일관성, 고립성, 지속성) 트랜잭션을 제한적으로 지원합니다.
    기본적으로 한 개의 문서 안에서의 트랜잭션은 지원하지만,
    여러 개의 문서 간의 트랜잭션은 일부 제약이 있을 수 있습니다.
    따라서, 복잡한 트랜잭션 처리가 필요한 시스템에는 다른 데이터베이스 시스템이 더 적합할 수 있습니다.

  2. 디스크 사용량
    MongoDB는 데이터의 유연성과 빠른 읽기/쓰기 성능을 위해 메모리를 적극적으로 활용합니다.
    따라서, 대량의 데이터를 저장하는 경우 디스크 사용량이 상대적으로 높아질 수 있습니다.
    이는 디스크 공간을 절약하고자 하는 시스템에는 불리할 수 있습니다.

  3. 메모리 요구 사항: MongoDB는 메모리 기반의 캐싱을 활용하여 빠른 읽기 성능을 제공합니다.
    따라서, 대규모 데이터베이스를 운영할 때 메모리 요구 사항이 상대적으로 높을 수 있습니다.
    메모리가 제한적인 환경에서는 메모리 사용량에 대한 고려가 필요합니다.

  4. 데이터 손실 가능성
    MongoDB는 기본적으로 데이터를 디스크에 비동기적으로 저장합니다.
    이는 일부 상황에서 데이터 손실 가능성을 내포하고 있을 수 있습니다.
    데이터의 신뢰성이 매우 중요한 시스템에서는 데이터의 안정성을 보장하기 위한
    추가적인 구성과 관리가 필요할 수 있습니다.

4. MongoDB Crud Example Query

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);
    }
}
profile
주니어 개발자 Plo입니다. 🙇‍♂️

0개의 댓글