contents
MongoDB는 유연한 JSON과 유사한 도큐먼트(document)에 데이터를 저장하는 인기 있는 오픈소스 NoSQL 데이터베이스입니다. 문서 지향 데이터베이스로서, 높은 확장성, 유연성, 그리고 개발자들이 쉽게 사용할 수 있도록 설계되어 현대 애플리케이션을 위한 최고의 선택지 중 하나가 되었습니다.
전통적인 관계형 데이터베이스(SQL 등)의 엄격한 행과 열 대신, MongoDB는 애플리케이션 코드의 객체와 자연스럽게 매핑되는 더 동적인 구조를 사용합니다.
MongoDB가 해결하는 핵심 문제: 경직성 vs. 유연성
MongoDB를 이해하는 가장 좋은 방법은 전통적인 SQL 데이터베이스와 비교하는 것입니다.
-
SQL (관계형) 데이터베이스:
-
미리 정의된 엄격한 스키마를 가진 테이블에 데이터를 저장합니다.
-
테이블의 각 행(row) 은 이 스키마를 따라야 합니다.
-
관련 데이터는 다른 테이블에 저장되고 조인(join) 을 통해 연결되는데, 이는 느리고 복잡할 수 있습니다.
-
예시: 블로그 게시물, 그 댓글, 그리고 태그는 세 개의 분리된 테이블에 저장될 것입니다.
-
-
MongoDB (문서 데이터베이스):
-
도큐먼트를 포함하는 컬렉션에 데이터를 저장합니다.
-
도큐먼트는 BSON(바이너리 JSON) 형식으로 저장되며, 이는 JSON 객체처럼 느껴집니다.
-
엄격한 스키마가 없으며, 같은 컬렉션 내의 도큐먼트들은 서로 다른 필드와 구조를 가질 수 있습니다.
-
관련 데이터를 단일 도큐먼트 안에 함께 저장할 수 있어 복잡한 조인이 필요 없습니다.
-
이러한 유연성 덕분에 데이터 모델이 변경될 때마다 복잡한 데이터베이스 마이그레이션을 수행할 필요가 없어 애플리케이션을 훨씬 더 빠르게 개발하고 반복할 수 있습니다.
핵심 개념: 데이터 모델 📄
-
도큐먼트 (Document): MongoDB 데이터의 기본 단위입니다. JSON의 바이너리 인코딩 버전인 BSON 객체이며, 필드와 값 쌍으로 구성됩니다.
JSON
{ "_id": "6324a3d4e4b5f6c7d8e9f0a1", "title": "나의 첫 블로그 포스트", "author": "홍길동", "published_date": "2023-09-15T10:00:00Z", "tags": ["기술", "데이터베이스", "mongodb"], "comments": [ { "user": "제인", "text": "훌륭한 글이에요!" }, { "user": "샘", "text": "매우 유익하네요." } ] } -
컬렉션 (Collection): 도큐먼트들의 그룹입니다. 컬렉션은 관계형 데이터베이스의 테이블과 동등하지만, 미리 정의된 스키마가 없습니다.
-
데이터베이스 (Database): 컬렉션을 위한 물리적인 컨테이너입니다. 각 데이터베이스는 서버에 자체 파일 세트를 가집니다.
-
_id필드: MongoDB의 모든 도큐먼트는 고유한_id필드를 가져야 하며, 이는 기본 키(primary key) 역할을 합니다. 만약_id를 제공하지 않으면 MongoDB가 자동으로 고유한 12바이트 ObjectId를 생성해 줍니다.
주요 특징 및 아키텍처
1. 유연한 스키마
언급했듯이, 단일 컬렉션 내의 도큐먼트들은 동일한 필드 집합을 공유할 필요가 없습니다. 이는 제품 카탈로그, 사용자 프로필, IoT 데이터 스트림과 같이 데이터가 다양하거나 시간이 지남에 따라 진화하는 애플리케이션에 이상적입니다.
2. 풍부한 쿼리 언어
MongoDB는 단순한 키-값 저장소가 아닙니다. 필드 값, 범위, 정규 표현식 등을 기반으로 도큐먼트를 필터링할 수 있는 강력한 쿼리 언어를 제공합니다. 또한 데이터 처리 및 분석을 위한 강력한 애그리게이션 파이프라인도 지원합니다.
JavaScript
// "홍길동"이 작성하고 "mongodb" 태그가 있는 모든 포스트 찾기
db.posts.find({
author: "홍길동",
tags: { $in: ["mongodb"] }
})
3. 확장성 (샤딩) 🚀
이것은 MongoDB의 가장 유명한 기능 중 하나입니다. 데이터가 단일 서버에 담기에는 너무 커질 때, MongoDB는 샤딩(sharding) 을 사용하여 수평적으로 확장할 수 있습니다. 샤딩은 하나의 큰 컬렉션을 여러 서버(샤드)에 자동으로 분산시킵니다. 애플리케이션은 여전히 단일 라우터와 통신하며, MongoDB가 쿼리를 올바른 샤드로 라우팅하는 것을 처리합니다. 이를 통해 거의 무한한 확장성을 확보할 수 있습니다.
4. 고가용성 (레플리카 셋) ⛓️
데이터베이스가 항상 사용 가능하도록 보장하기 위해 MongoDB는 레플리카 셋(replica sets) 을 사용합니다. 레플리카 셋은 동일한 데이터 세트를 유지하는 서버 그룹입니다.
-
한 서버가 모든 쓰기 작업을 수신하는 프라이머리(primary) 노드 역할을 합니다.
-
다른 서버들은 프라이머리의 데이터를 복제하는 세컨더리(secondary) 노드입니다.
-
만약 프라이머리 노드가 실패하면, 레플리카 셋은 자동으로 선거를 열어 세컨더리 중 하나를 새로운 프라이머리로 승격시킵니다. 이는 중복성과 내결함성을 제공합니다.
5. 인덱싱
쿼리 성능을 향상시키기 위해 MongoDB는 내장된 도큐먼트 및 배열 내 필드를 포함하여 도큐먼트의 모든 필드에 인덱스를 생성할 수 있도록 지원합니다. 적절한 인덱싱은 모든 데이터베이스에서 성능에 매우 중요하며, MongoDB도 예외는 아닙니다.
언제 MongoDB를 사용해야 하는가 (그리고 언제 피해야 하는가)
좋은 사용 사례:
-
콘텐츠 관리: 각 항목이 다른 속성을 가질 수 있는 블로그 포스트, 기사 또는 미디어 메타데이터 저장.
-
전자상거래: 항목마다 다양하고 복잡한 속성 세트를 가진 제품 카탈로그 관리.
-
실시간 분석: 로그나 사용자 활동과 같은 대규모 데이터 스트림 수집 및 분석.
-
모바일 및 소셜 앱: 유연하고 빠르게 진화하는 사용자 프로필 및 소셜 그래프 저장.
대안을 고려해야 할 때:
-
복잡한 다중 행 ACID 트랜잭션이 필요한 경우. MongoDB는 버전 4.0부터 ACID 트랜잭션을 지원하지만, 은행이나 금융 거래 시스템처럼 이에 크게 의존하는 시스템에는 전통적인 관계형 데이터베이스가 더 적합한 경우가 많습니다.
-
데이터가 매우 구조적이고 관계형이며, 다른 데이터 엔티티 간에 복잡한
JOIN과 유사한 작업이 빈번하게 필요할 것으로 예상될 때.
references