튼튼발자 개발 성장기🏋️

[MongoDB] MongoDB란? 본문

기타/MongoDB

[MongoDB] MongoDB란?

시뻘건 튼튼발자 2025. 3. 1. 11:49
반응형

MongoDB는 강력하고 유연하며 확장성 높은 범용 데이터베이스이다. 보조 인덱스,범위 쿼리, 정렬, 집계 및 공간 정보 인덱스 등을 확장 기능과 결합했다. MongoDB는 MariaDB와 같은 RDB와는 다르게 도큐먼트 지향 데이터베이스로써 행 개념 대신 문서(document)라는 유연한 모델을 사용하여 손쉬운 사용을 할 수 있다. 왜 손쉽게 사용할 수 있을까?

 

손쉬운 사용

  1. 유연한 데이터 모델링
    앞서 이야기한 것 처럼 MongoDB는 스키마가 유연한 데이터베이스다. 즉, 테이블의 구조를 사전에 정의할 필요 없이, 각 문서가 다른 필드를 가질 수 있다. 이를 통해 개발자는 더 빠르게 프로토타입을 만들거나, 변동성이 큰 데이터 구조에 맞게 데이터를 저장할 수 있다.
    예를들어, 사용자마다 다른 데이터 필드를 가지고 있을 수 있다. 한 사용자는 address 필드를 가지고 있지만, 다른 사용자는 phone_number를 추가로 가질 수 있다. MongoDB는 이러한 변동성을 쉽게 처리할 수 있게 된 것이다.
  2. 자연스러운 JSON 형태의 데이터 저장 (BSON)
    MongoDB는 데이터를 BSON(Binary JSON) 형식으로 저장한다. 이는 JSON과 비슷하지만 이진 형식으로 더 많은 데이터 타입을 지원한다. JSON 구조는 사람이 읽고 쓰기 쉽고, 다른 시스템과의 데이터 교환에 유리하기 때문에 MongoDB를 처음 접하는 개발자도 직관적으로 사용할 수 있다.
    {
        "_id": ObjectId("5f8f8f8f8f8f8f8f8f8f8f8"),
        "name": "John Doe",
        "age": 30,
        "address": {
            "street": "123 Main St",
            "city": "Anytown"
        }
    }

  3. 쉬운 쿼리와 풍부한 쿼리 기능
    MongoDB는 직관적인 쿼리 언어를 제공한다. SQL을 사용할 필요 없이 간단한 JavaScript 객체 형태로 데이터를 조회, 삽입, 업데이트 및 삭제할 수 있다. MongoDB의 쿼리 언어는 매우 직관적이고 유연하여 복잡한 관계형 데이터베이스 구조를 다루는 것보다 상대적으로 간단하다. 쿼리에 대해서는 다음 포스팅에서 알아볼 예정이다.
  4. 자동 샤딩과 수평 확장성
    MongoDB는 자동으로 데이터를 샤딩하여 수평으로 확장할 수 있다. 데이터가 커질수록 시스템의 성능과 용량을 확장하는 데 유리하다. 샤딩을 자동으로 처리하기 때문에 복잡한 분산 시스템을 구축하는 데 드는 시간을 줄여준다. 즉, MongoDB는 데이터를 여러 서버에 나누어 저장하고 관리할 수 있다. 데이터베이스의 용량이 커지더라도 성능 저하 없이 쉽게 처리할 수 있다.
  5. 다양한 클라이언트 라이브러리 지원
    MongoDB는 다양한 프로그래밍 언어에 대한 클라이언트 라이브러리를 제공한다. 이는 Java, Python, Node.js, C#, PHP 등 여러 언어에서 MongoDB를 손쉽게 사용할 수 있다. 또한, 각 클라이언트 라이브러리는 잘 문서화되어 있어 학습이 용이하다. 대표적으로 python의 경우에는 pymongo를, node.js에서는 mongoose를 사용할 수 있다.
  6. 강력한 도구와 관리 기능
    MongoDB는 MongoDB Atlas라는 클라우드 기반 관리 플랫폼을 제공하여, MongoDB의 배포, 모니터링, 백업 및 보안을 쉽게 처리할 수 있게 한다. MongoDB Atlas는 서버 관리의 부담을 덜어주고, 자동화된 백업 및 성능 모니터링 도구 등을 제공한다.
  7. 리치 클라이언트 인터페이스
    MongoDB는 MongoDB Compass라는 그래픽 사용자 인터페이스(GUI)를 제공하여, 명령줄을 사용할 필요 없이 데이터를 시각적으로 탐색하고, 쿼리를 생성하고, 성능을 분석할 수 있다. 이를 통해 MongoDB에 익숙하지 않은 사용자들도 직관적으로 데이터를 다룰 수 있다.

확장 가능한 설계

[그림 1] 여러 서버에 걸쳐 샤딩을 사용한 MongoDB 확장

 

MongoDB는 확장 가능한 설계를 제공하는 NoSQL 데이터베이스로, 다양한 크기와 복잡도의 데이터베이스 요구 사항을 처리할 수 있다. MongoDB는 데이터베이스의 크기가 증가하고 트래픽이 많아짐에 따라 성능을 최적화하고 수평적으로 확장할 수 있는 기능을 내장하고 있다. 이러한 확장성은 시스템의 성능 저하 없이 데이터를 효율적으로 관리하고 처리할 수 있게 해준다. MongoDB의 확장성에는 어떤 특징들이 있을까?

 

  1. 수평 확장성
    MongoDB는 수직 확장뿐만 아니라 수평 확장까지 지원한다. 이는 데이터베이스 성능과 용량을 여러 서버(샤드)에 분산하여 처리할 수 있게 해준다. 수평 확장을 통해 서버가 증가하더라도 성능 저하 없이 데이터베이스를 확장할 수 있다.
    예를들어, 사용자가 많고 데이터가 급격히 늘어나는 소셜 네트워크 서비스에서는 사용자 ID를 기준으로 데이터를 샤딩할 수 있다. 각 서버는 특정 사용자 범위의 데이터를 처리하고, 전체 시스템은 부하를 분산하여 처리할 수 있다.
    • 샤딩: MongoDB는 샤딩을 통해 데이터를 여러 서버에 나누어 저장할 수 있다. 데이터를 샤드라고 불리는 여러 파티션에 분산시키며, 각 샤드는 독립적으로 데이터를 처리한다. 이렇게 하면 데이터의 양이 커져도 여러 서버에서 병렬로 처리할 수 있어 성능이 유지된다.
    • 샤딩 구성: 샤딩은 특정 키를 기준으로 데이터를 분할한다. MongoDB는 자동으로 샤딩을 관리하며, 사용자는 샤딩 키를 선택하고 나면 MongoDB가 샤드를 분배하고 데이터를 효율적으로 관리한다.
  2. 복제와 고가용성
    MongoDB는 복제 기능을 제공하여 고가용성을 보장한다. 복제는 데이터를 여러 서버에 복사하여 하나의 서버에 장애가 발생해도 다른 서버에서 계속 데이터를 제공할 수 있도록 한다. 복제본(Replica Set)을 사용하면 MongoDB는 데이터를 실시간으로 동기화하고, 장애 발생 시 자동으로 다른 서버가 마스터 역할을 대신할 수 있다.
    • Replica Set: MongoDB는 복제본 세트를 통해 데이터를 복제한다. 복제본 세트는 하나의 Primary 서버와 여러 Secondary 서버로 구성된다. Primary 서버에서 데이터를 쓰면, 이를 Secondary 서버들이 복제하여 동기화한다. Secondary 서버 중 하나가 장애를 일으켜도, 다른 Secondary 서버가 Primary 역할을 대신하여 시스템의 가용성을 높일 수 있다.
    • 자동 장애 복구: 장애가 발생하면 MongoDB는 자동으로 새로운 Primary 서버를 선출하고, 서비스 중단 없이 계속 동작할 수 있게 한다. 이를 통해 시스템의 가용성을 보장하고, 다운타임을 최소화할 수 있다.
  3. 자동 분할(샤딩)과 분산 처리
    MongoDB는 데이터를 분산 처리하는 방식으로 수평 확장을 지원한다. 데이터베이스의 크기가 커질수록, 더 많은 서버로 데이터를 분할하고, 각 서버에서 독립적으로 데이터를 처리할 수 있다.
    • 분할 키(Shard Key): 데이터를 여러 샤드로 분할하는 기준이 되는 키를 설정할 수 있다. 이 키를 기반으로 데이터가 여러 서버에 분산되며, 이를 통해 효율적인 쿼리 처리가 가능하다.
    • 자동 분할: MongoDB는 샤딩을 자동으로 관리하며, 사용자는 분할 전략을 선택하고 MongoDB가 이를 처리한다. 데이터가 커지면 자동으로 분할되고, 새로운 샤드를 추가하여 데이터베이스를 확장할 수 있다.
  4. 분산 집계 처리
    MongoDB는 분산 환경에서 집계작업을 처리할 수 있는 기능을 제공한다. MongoDB의 집계 프레임워크는 데이터를 처리하고 변환하는 데 사용되며, 이 집계 작업을 여러 샤드에 걸쳐 분산하여 실행할 수 있다.
    • 분산 집계 파이프라인: MongoDB는 집계 파이프라인을 사용하여 데이터를 처리하는데, 이 파이프라인은 여러 단계로 구성된다. 각 단계에서 데이터를 필터링하거나 변환하는 작업을 할 수 있으며, 이러한 집계 작업을 여러 샤드에 분배하여 처리한다. 이를 통해 대규모 데이터를 효율적으로 분석하고 처리할 수 있다.
  5. 자동 균형 조정
    MongoDB는 샤딩된 데이터를 자동으로 균형 잡아 분산시킨다. 이는 데이터가 증가하면서 특정 샤드에 데이터가 몰리는 현상을 방지하고, 각 샤드에 데이터를 고르게 분배하여 시스템 성능을 최적화한다.
    • 자동 밸런싱: MongoDB는 데이터가 증가하거나 불균형할 경우, 자동으로 샤드 간의 데이터를 재배치하여 각 샤드의 데이터 양을 균등하게 유지한다. 이를 통해 특정 샤드가 과도한 부하를 받지 않도록 하고, 시스템의 성능을 지속적으로 유지할 수 있다.

다양한 기능

MongoDB는 범용 데이터베이스이기 때문에 CRUD 및 DBMS의 대부분의 기능과 추가 기능을 제공한다.

  1. 인덱싱
    인덱스는 데이터베이스에서 쿼리 성능을 향상시키기 위해 사용된다. MongoDB는 다양한 종류의 인덱스를 제공하여 다양한 검색 요구 사항을 최적화할 수 있다.
    • 기본 인덱스: MongoDB는 기본적으로 _id 필드에 대해 고유한 인덱스를 자동으로 생성한다. 이는 각 문서가 고유한 식별자를 가지고 있어야 함을 보장한다.
    • 고유 인덱스: 특정 필드의 값이 유일하도록 보장합니다. 예를 들어, 사용자 이메일 주소가 중복되지 않도록 할 수 있습니다.
    • 복합 인덱스: 여러 필드를 결합한 인덱스로, 복합적인 쿼리 성능을 최적화합니다.
    • 공간 인덱스: 위치 기반 쿼리를 효율적으로 처리하기 위해 사용됩니다.
    • 전문 인덱스: 텍스트 검색을 지원하며, 텍스트 필드에 대한 검색 성능을 향상시킵니다.
  2. 집계
    MongoDB는 복잡한 데이터 처리와 변환을 위한 집계 프레임워크를 제공한다.
    • 집계 파이프라인: 데이터를 여러 단계로 처리하여 원하는 결과를 도출한다. 각 단계는 문서의 변형, 필터링, 그룹화 등을 수행한다.
    • 집계 연산자: $sum, $avg, $group 등 다양한 연산자를 통해 데이터를 집계할 수 있다.
  3. 특수한 컬렉션 유형
    MongoDB는 특정 용도에 맞는 특수한 컬렉션 유형을 제공한다.
    • TTL 컬렉션: `expireAfterSeconds` 옵션을 사용하여 도큐먼트의 유효 기간을 설정하고, 지정된 시간이 지난 도큐먼트를 자동으로 삭제한다. 세션 데이터나 캐시 데이터 관리에 유용하다.
    • 제한 컬렉션: 고정된 크기와 순차적인 쓰기를 지원하는 컬렉션으로, 로그 데이터 저장 등에 적합하다.
    • Tailable Cursor: 제한 컬렉션에서만 사용 가능하며, 새로운 데이터가 추가될 때마다 실시간으로 데이터를 읽을 수 있다.
  4. 파일 스토리지
    MongoDB는 큰 파일과 파일 메타데이터를 편리하게 저장하는 GridFS 프로토콜을 지원한다.
    • GridFS: 파일을 청크로 분할하여 저장하고, 메타데이터를 별도의 컬렉션에 관리한다. 이를 통해 대용량 파일을 효율적으로 저장하고 관리할 수 있다.
      • 파일 분할 저장: 대용량 파일을 일정 크기의 청크로 분할하여 여러 도큐먼트에 저장한다. 이로 인해 메모리 부담을 줄이고, 파일의 일부만을 효율적으로 읽을 수 있다.
      • 메타데이터 관리: 파일의 이름, 크기, 생성일 등과 같은 메타데이터를 별도의 컬렉션에 저장하여 파일에 대한 정보를 체계적으로 관리한다.
      • 자동화된 청크 관리: 파일의 크기에 따라 필요한 만큼의 청크를 자동으로 생성하고 관리하여 개발자의 수고를 덜어준다.
반응형

'기타 > MongoDB' 카테고리의 다른 글

[MongoDB] 특수 인덱스  (0) 2025.03.17
[MongoDB] 인덱싱 #2  (0) 2025.03.16
[MongoDB] 인덱싱 #1  (0) 2025.03.15
[MongoDB] 도큐먼트 생성, 갱신, 삭제  (0) 2025.03.06
[MongoDB] MongoDB의 기본  (1) 2025.03.03