Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- cleancode
- 그리디알고리즘
- framework
- 프레임워크
- API
- 읽기쉬운코드
- Spring
- Java
- ES
- JPA
- 애자일기법
- 개발자
- Baekjoon
- 엘라스틱서치
- 코드
- 자바
- 그리디
- spring boot
- 백준
- 애자일프로그래밍
- Elasticsearch
- 알고리즘
- database
- 스프링
- mongoDB
- 클린코드
- 데이터베이스
- 개발
- 코딩
- 코딩테스트
Archives
- Today
- Total
튼튼발자 개발 성장기🏋️
[MongoDB] MongoDB란? 본문
반응형
MongoDB는 강력하고 유연하며 확장성 높은 범용 데이터베이스이다. 보조 인덱스,범위 쿼리, 정렬, 집계 및 공간 정보 인덱스 등을 확장 기능과 결합했다. MongoDB는 MariaDB와 같은 RDB와는 다르게 도큐먼트 지향 데이터베이스로써 행 개념 대신 문서(document)라는 유연한 모델을 사용하여 손쉬운 사용을 할 수 있다. 왜 손쉽게 사용할 수 있을까?
손쉬운 사용
- 유연한 데이터 모델링
앞서 이야기한 것 처럼 MongoDB는 스키마가 유연한 데이터베이스다. 즉, 테이블의 구조를 사전에 정의할 필요 없이, 각 문서가 다른 필드를 가질 수 있다. 이를 통해 개발자는 더 빠르게 프로토타입을 만들거나, 변동성이 큰 데이터 구조에 맞게 데이터를 저장할 수 있다.
예를들어, 사용자마다 다른 데이터 필드를 가지고 있을 수 있다. 한 사용자는 address 필드를 가지고 있지만, 다른 사용자는 phone_number를 추가로 가질 수 있다. MongoDB는 이러한 변동성을 쉽게 처리할 수 있게 된 것이다. - 자연스러운 JSON 형태의 데이터 저장 (BSON)
MongoDB는 데이터를 BSON(Binary JSON) 형식으로 저장한다. 이는 JSON과 비슷하지만 이진 형식으로 더 많은 데이터 타입을 지원한다. JSON 구조는 사람이 읽고 쓰기 쉽고, 다른 시스템과의 데이터 교환에 유리하기 때문에 MongoDB를 처음 접하는 개발자도 직관적으로 사용할 수 있다.
{ "_id": ObjectId("5f8f8f8f8f8f8f8f8f8f8f8"), "name": "John Doe", "age": 30, "address": { "street": "123 Main St", "city": "Anytown" } }
- 쉬운 쿼리와 풍부한 쿼리 기능
MongoDB는 직관적인 쿼리 언어를 제공한다. SQL을 사용할 필요 없이 간단한 JavaScript 객체 형태로 데이터를 조회, 삽입, 업데이트 및 삭제할 수 있다. MongoDB의 쿼리 언어는 매우 직관적이고 유연하여 복잡한 관계형 데이터베이스 구조를 다루는 것보다 상대적으로 간단하다. 쿼리에 대해서는 다음 포스팅에서 알아볼 예정이다. - 자동 샤딩과 수평 확장성
MongoDB는 자동으로 데이터를 샤딩하여 수평으로 확장할 수 있다. 데이터가 커질수록 시스템의 성능과 용량을 확장하는 데 유리하다. 샤딩을 자동으로 처리하기 때문에 복잡한 분산 시스템을 구축하는 데 드는 시간을 줄여준다. 즉, MongoDB는 데이터를 여러 서버에 나누어 저장하고 관리할 수 있다. 데이터베이스의 용량이 커지더라도 성능 저하 없이 쉽게 처리할 수 있다. - 다양한 클라이언트 라이브러리 지원
MongoDB는 다양한 프로그래밍 언어에 대한 클라이언트 라이브러리를 제공한다. 이는 Java, Python, Node.js, C#, PHP 등 여러 언어에서 MongoDB를 손쉽게 사용할 수 있다. 또한, 각 클라이언트 라이브러리는 잘 문서화되어 있어 학습이 용이하다. 대표적으로 python의 경우에는 pymongo를, node.js에서는 mongoose를 사용할 수 있다. - 강력한 도구와 관리 기능
MongoDB는 MongoDB Atlas라는 클라우드 기반 관리 플랫폼을 제공하여, MongoDB의 배포, 모니터링, 백업 및 보안을 쉽게 처리할 수 있게 한다. MongoDB Atlas는 서버 관리의 부담을 덜어주고, 자동화된 백업 및 성능 모니터링 도구 등을 제공한다. - 리치 클라이언트 인터페이스
MongoDB는 MongoDB Compass라는 그래픽 사용자 인터페이스(GUI)를 제공하여, 명령줄을 사용할 필요 없이 데이터를 시각적으로 탐색하고, 쿼리를 생성하고, 성능을 분석할 수 있다. 이를 통해 MongoDB에 익숙하지 않은 사용자들도 직관적으로 데이터를 다룰 수 있다.
확장 가능한 설계

MongoDB는 확장 가능한 설계를 제공하는 NoSQL 데이터베이스로, 다양한 크기와 복잡도의 데이터베이스 요구 사항을 처리할 수 있다. MongoDB는 데이터베이스의 크기가 증가하고 트래픽이 많아짐에 따라 성능을 최적화하고 수평적으로 확장할 수 있는 기능을 내장하고 있다. 이러한 확장성은 시스템의 성능 저하 없이 데이터를 효율적으로 관리하고 처리할 수 있게 해준다. MongoDB의 확장성에는 어떤 특징들이 있을까?
- 수평 확장성
MongoDB는 수직 확장뿐만 아니라 수평 확장까지 지원한다. 이는 데이터베이스 성능과 용량을 여러 서버(샤드)에 분산하여 처리할 수 있게 해준다. 수평 확장을 통해 서버가 증가하더라도 성능 저하 없이 데이터베이스를 확장할 수 있다.
예를들어, 사용자가 많고 데이터가 급격히 늘어나는 소셜 네트워크 서비스에서는 사용자 ID를 기준으로 데이터를 샤딩할 수 있다. 각 서버는 특정 사용자 범위의 데이터를 처리하고, 전체 시스템은 부하를 분산하여 처리할 수 있다.
- 샤딩: MongoDB는 샤딩을 통해 데이터를 여러 서버에 나누어 저장할 수 있다. 데이터를 샤드라고 불리는 여러 파티션에 분산시키며, 각 샤드는 독립적으로 데이터를 처리한다. 이렇게 하면 데이터의 양이 커져도 여러 서버에서 병렬로 처리할 수 있어 성능이 유지된다.
- 샤딩 구성: 샤딩은 특정 키를 기준으로 데이터를 분할한다. MongoDB는 자동으로 샤딩을 관리하며, 사용자는 샤딩 키를 선택하고 나면 MongoDB가 샤드를 분배하고 데이터를 효율적으로 관리한다.
- 복제와 고가용성
MongoDB는 복제 기능을 제공하여 고가용성을 보장한다. 복제는 데이터를 여러 서버에 복사하여 하나의 서버에 장애가 발생해도 다른 서버에서 계속 데이터를 제공할 수 있도록 한다. 복제본(Replica Set)을 사용하면 MongoDB는 데이터를 실시간으로 동기화하고, 장애 발생 시 자동으로 다른 서버가 마스터 역할을 대신할 수 있다.
- Replica Set: MongoDB는 복제본 세트를 통해 데이터를 복제한다. 복제본 세트는 하나의 Primary 서버와 여러 Secondary 서버로 구성된다. Primary 서버에서 데이터를 쓰면, 이를 Secondary 서버들이 복제하여 동기화한다. Secondary 서버 중 하나가 장애를 일으켜도, 다른 Secondary 서버가 Primary 역할을 대신하여 시스템의 가용성을 높일 수 있다.
- 자동 장애 복구: 장애가 발생하면 MongoDB는 자동으로 새로운 Primary 서버를 선출하고, 서비스 중단 없이 계속 동작할 수 있게 한다. 이를 통해 시스템의 가용성을 보장하고, 다운타임을 최소화할 수 있다.
- 자동 분할(샤딩)과 분산 처리
MongoDB는 데이터를 분산 처리하는 방식으로 수평 확장을 지원한다. 데이터베이스의 크기가 커질수록, 더 많은 서버로 데이터를 분할하고, 각 서버에서 독립적으로 데이터를 처리할 수 있다.- 분할 키(Shard Key): 데이터를 여러 샤드로 분할하는 기준이 되는 키를 설정할 수 있다. 이 키를 기반으로 데이터가 여러 서버에 분산되며, 이를 통해 효율적인 쿼리 처리가 가능하다.
- 자동 분할: MongoDB는 샤딩을 자동으로 관리하며, 사용자는 분할 전략을 선택하고 MongoDB가 이를 처리한다. 데이터가 커지면 자동으로 분할되고, 새로운 샤드를 추가하여 데이터베이스를 확장할 수 있다.
- 분산 집계 처리
MongoDB는 분산 환경에서 집계작업을 처리할 수 있는 기능을 제공한다. MongoDB의 집계 프레임워크는 데이터를 처리하고 변환하는 데 사용되며, 이 집계 작업을 여러 샤드에 걸쳐 분산하여 실행할 수 있다.- 분산 집계 파이프라인: MongoDB는 집계 파이프라인을 사용하여 데이터를 처리하는데, 이 파이프라인은 여러 단계로 구성된다. 각 단계에서 데이터를 필터링하거나 변환하는 작업을 할 수 있으며, 이러한 집계 작업을 여러 샤드에 분배하여 처리한다. 이를 통해 대규모 데이터를 효율적으로 분석하고 처리할 수 있다.
- 자동 균형 조정
MongoDB는 샤딩된 데이터를 자동으로 균형 잡아 분산시킨다. 이는 데이터가 증가하면서 특정 샤드에 데이터가 몰리는 현상을 방지하고, 각 샤드에 데이터를 고르게 분배하여 시스템 성능을 최적화한다.- 자동 밸런싱: MongoDB는 데이터가 증가하거나 불균형할 경우, 자동으로 샤드 간의 데이터를 재배치하여 각 샤드의 데이터 양을 균등하게 유지한다. 이를 통해 특정 샤드가 과도한 부하를 받지 않도록 하고, 시스템의 성능을 지속적으로 유지할 수 있다.
다양한 기능
MongoDB는 범용 데이터베이스이기 때문에 CRUD 및 DBMS의 대부분의 기능과 추가 기능을 제공한다.
- 인덱싱
인덱스는 데이터베이스에서 쿼리 성능을 향상시키기 위해 사용된다. MongoDB는 다양한 종류의 인덱스를 제공하여 다양한 검색 요구 사항을 최적화할 수 있다.
- 기본 인덱스: MongoDB는 기본적으로 _id 필드에 대해 고유한 인덱스를 자동으로 생성한다. 이는 각 문서가 고유한 식별자를 가지고 있어야 함을 보장한다.
- 고유 인덱스: 특정 필드의 값이 유일하도록 보장합니다. 예를 들어, 사용자 이메일 주소가 중복되지 않도록 할 수 있습니다.
- 복합 인덱스: 여러 필드를 결합한 인덱스로, 복합적인 쿼리 성능을 최적화합니다.
- 공간 인덱스: 위치 기반 쿼리를 효율적으로 처리하기 위해 사용됩니다.
- 전문 인덱스: 텍스트 검색을 지원하며, 텍스트 필드에 대한 검색 성능을 향상시킵니다.
- 집계
MongoDB는 복잡한 데이터 처리와 변환을 위한 집계 프레임워크를 제공한다.
- 집계 파이프라인: 데이터를 여러 단계로 처리하여 원하는 결과를 도출한다. 각 단계는 문서의 변형, 필터링, 그룹화 등을 수행한다.
- 집계 연산자: $sum, $avg, $group 등 다양한 연산자를 통해 데이터를 집계할 수 있다.
- 특수한 컬렉션 유형
MongoDB는 특정 용도에 맞는 특수한 컬렉션 유형을 제공한다.
- TTL 컬렉션: `expireAfterSeconds` 옵션을 사용하여 도큐먼트의 유효 기간을 설정하고, 지정된 시간이 지난 도큐먼트를 자동으로 삭제한다. 세션 데이터나 캐시 데이터 관리에 유용하다.
- 제한 컬렉션: 고정된 크기와 순차적인 쓰기를 지원하는 컬렉션으로, 로그 데이터 저장 등에 적합하다.
- Tailable Cursor: 제한 컬렉션에서만 사용 가능하며, 새로운 데이터가 추가될 때마다 실시간으로 데이터를 읽을 수 있다.
- 파일 스토리지
MongoDB는 큰 파일과 파일 메타데이터를 편리하게 저장하는 GridFS 프로토콜을 지원한다.- 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 |