-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
docs: update files by using obsidian
- Loading branch information
Showing
1 changed file
with
163 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,163 @@ | ||
--- | ||
title: MongoDB | ||
date: 2024-12-26 09:00:00 +0900 | ||
categories: mongodb | ||
tags: | ||
- mongodb | ||
- database | ||
description: MongoDB 학습 및 정리 | ||
--- | ||
|
||
## 1. 몽고DB 시작 | ||
--- | ||
|
||
몽고DB는 강력하고 유연하며 확장성 높은 범용 데이터베이스다. 보조 인덱스(secondary index), 범위 쿼리(range query), 정렬(sorting), 집계(aggregation), 공간 정보 인덱스(geospatial index) 등을 확장 기능과 결합했다. | ||
|
||
<br/> | ||
|
||
### 1.1. 손쉬운 사용 | ||
--- | ||
|
||
몽고DB는 관계형 데이터베이스가 아니라 **도큐먼트 지향** 데이터베이스다. 관계형 모델을 사용하지 않는 주된 이유는 **분산 확장(scale-out)**을 쉽게 하기 위함이지만 다른 이점도 있다. | ||
|
||
도큐먼트 지향 데이터베이스에서는 도큐먼트를 사용하여 복잡한 계층 관계를 하나의 레코드로 표현할 수 있다. 이는 객체 지향 언어 관점에 매우 적합하다. | ||
|
||
또한 몽고DB에서는 도큐먼트의 **키와 값을 미리 정의하지 않는다.** 따라서 고정된 스키마가 없으므로 쉽게 필드를 추가하거나 제거할 수 있다. | ||
|
||
<br/> | ||
|
||
### 1.2. 확장 가능한 설계 | ||
--- | ||
|
||
**분산 확장**은 저장 공간을 늘리거나 처리량을 높이고 서버를 구매해서 클러스터에 추가하는 방법이다. 따라서 경제적이고 확장이 용이하다. 하지만 하나의 장비만 관리할 때보다 관리가 어렵다. | ||
|
||
몽고DB는 분산 확장을 염두에 두고 설계됐다. **도큐먼트를 자동으로 재분배**하고 사용자 **요청을 올바르게 장비에 라우팅**함으로써 클러스터 내 **데이터 양과 부하를 조절**할 수 있다. | ||
|
||
<br/> | ||
|
||
### 1.3. 다양한 기능 | ||
--- | ||
|
||
인덱싱 | ||
: 일반적인 보조 인덱스를 지원하며 고유(unique), 복합(compound), 공간 정보, 전문(full-text) 인덱싱 기능도 제공한다. 중첩된 도큐먼트(nested document) 및 배열과 같은 계층 구조의 보조 인덱스도 지원한다. | ||
|
||
집계 | ||
: 데이터 처리 파이프라인 개념을 기반으로 한 집계 프레임워크를 제공한다. | ||
|
||
특수한 컬렉션 유형 | ||
: 최신 데이터를 유지하고자 세션이나 고정 크기 컬렉션과 같이 특정 시간에 만료해야 하는 데이터에 대해 유효 시간(TTL, Time-To-Live) 컬렉션을 지원한다. 또한 기준 필터(criteria filter)와 일치하는 도큐먼트에 한정된 부분 인덱스를 지원함으로써 효율성을 높이고 필요한 저장 공간을 줄인다. | ||
|
||
파일 스토리지 | ||
: 큰 파일과 파일 메타데이터를 편리하게 저장하는 프로토콜을 지원한다. | ||
|
||
<br/> | ||
|
||
몽고DB는 3.2에 도입된 `$lookup` 집계 연산자를 사용하면 **매우 제한된 방식으로 조인하는 것이 가능**하다. 3.6 버전에서는 관련 없는 서브쿼리 뿐만 아니라 **여러 조인 조건으로 보다 복잡한 조인도 할 수 있다.** | ||
|
||
<br/> | ||
|
||
### 1.4. 고성능 | ||
--- | ||
|
||
몽고DB에서는 동시성(concurrency)과 처리량을 극대화하기 위해 **와이어드타이거(WiredTiger) 스토리지 엔진에 기회적 락(oppertunistic locking)** 을 사용했다. 따라서 캐시처럼 제한된 용량의 램으로 쿼리에 알맞은 **인덱스를 자동으로 선택** 할 수 있다. | ||
|
||
<br/> | ||
|
||
### 1.5. 몽고DB의 철학 | ||
--- | ||
|
||
몽고DB 프로젝트의 주 관심사는 확장성이 높으며 유연하고 빠른 데이터 스토리지를 만드는 것이다. | ||
|
||
<br/> | ||
|
||
## 2. 몽고DB 기본 | ||
--- | ||
|
||
- 몽고DB 데이터의 기본 단위는 **도큐먼트** 이며, RDB의 행과 유사하다. | ||
- **컬렉션** 은 동적 스키마가 있는 테이블과 같다. | ||
- 몽고DB의 단일 인스턴스는 자체적인 컬렉션을 갖는 여러 개의 독립적인 **데이터베이스** 를 호스팅한다. | ||
- 모든 도큐먼트는 컬렉션 내에서 고유한 특수키인 `"_id"` 를 갖는다. | ||
- 몽고DB는 **몽고 쉘** 이라는 도구와 함께 배포된다. 몽고 쉘은 인스턴스를 관리하고 쿼리 언어로 데이터를 조작하기 위한 내장 지원을 제공한다. 또한 사용자가 자신의 스크립트를 만들고 로드할 수 있다. | ||
|
||
<br/> | ||
|
||
### 2.1. 도큐먼트 | ||
--- | ||
|
||
몽고DB의 핵심은 정렬된 키와 연결된 값의 집합으로 이뤄진 **도큐먼트**다. | ||
|
||
<br/> | ||
|
||
```json | ||
{"greeting" : "Hello, world!"} | ||
``` | ||
대부분의 도큐먼트는 이보다 복잡한 다중 키/값 쌍을 가진다. | ||
|
||
<br/> | ||
|
||
도큐먼트의 키는 문자열이다. 다음 예외 몇 가지를 제외하면 어떤 UTF-8 문자든 쓸 수 있다. | ||
- 키는 `\0(null 문자)` 을 포함하지 않는다. `\0` 은 키의 끝을 나타내는 데 사용된다. | ||
- `.` 과 `$` 문자들은 예약어이며 부적절하게 사용하면 경고가 발생한다. | ||
|
||
<br/> | ||
|
||
몽고DB는 데이터형과 대소문자를 구별한다. 또한, 키가 중복될 수 없다. | ||
|
||
<br/> | ||
|
||
### 2.2. 컬렉션 | ||
--- | ||
|
||
**컬렉션**은 도큐먼트의 모음이다. RDB의 테이블에 대응된다고 볼 수 있다. | ||
|
||
<br/> | ||
|
||
#### 2.2.1. 동적 스키마 | ||
--- | ||
|
||
컬렉션은 **동적 스키마**를 가진다. 하나의 컬렉션 내 도큐먼트들이 모두 다른 구조를 가질 수 있다는 의미다. 예를 들어 다음 도큐먼트들을 하나의 컬렉션에 저장할 수 있다. | ||
|
||
```json | ||
{"greeting" : "Hello, world!", "views": 3} | ||
{"signoff" : "Good night, and good luck"} | ||
``` | ||
|
||
<br/> | ||
|
||
도큐먼트들의 키, 키의 개수, 데이터형의 값은 모두 다르다. 도큐먼트에 별도의 스키마가 필요 없지만 **하나 이상의 컬렉션이 필요한 이유**는 다음과 같다. | ||
- 같은 컬렉션에 다른 종류의 도큐먼트를 저장하면 **번거로운 일이 생길 수도** 있다. | ||
- 컬렉션별로 목록을 뽑으면 한 컬렉션 내 특정 데이터형별로 쿼리해서 목록을 뽑을 때보다 **훨씬 빠르다.** | ||
- 같은 종류의 데이터를 하나의 컬렉션에 모아두면 **데이터 지역성**에도 좋다. | ||
- **인덱스**를 만들면 도큐먼트는 특정 구조를 가져야 한다. | ||
|
||
<br/> | ||
|
||
애플리케이션 스키마는 기본적으로 필요하지는 않지만 정의하면 좋다. 몽고DB의 도큐먼트 유효성 검사 기능(document validation functionality)과 객체-도큐먼트 매핑 라이브러리(object-document mapping library)를 이용하여 사용 가능하다. | ||
|
||
<br/> | ||
|
||
#### 2.2.2. 네이밍 | ||
--- | ||
|
||
컬렉션은 이름으로 식별된다. 이는 몇 가지 제약 조건이 있다. | ||
- 빈 문자열("")은 유효한 이름이 아니다. | ||
- `\0(null 문자)` 은 컬렉션명의 끝을 나타내는 문자이므로 사용할 수 없다. | ||
- `system.` 으로 시작하는 컬렉션명은 예약어이므로 사용할 수 없다. | ||
- 사용자가 만든 컬렉션은 이름에 예약어인 `$` 를 포함할 수 없다. | ||
|
||
<br/> | ||
|
||
##### 서브컬렉션 | ||
|
||
서브컬렉션의 네임스페이스에 `.(마침표)` 문자를 사용해 컬렉션을 체계화한다. (ex. `blog.posts` 와 `blog.authors` ) | ||
|
||
서브컬렉션은 특별한 속성은 없지만 여러 몽고DB 툴에서 지원하므로 유용하다. | ||
- | ||
|
||
<br/> | ||
|
||
## Reference | ||
--- | ||
|
||
[한빛미디어: 몽고DB 완벽 가이드](https://www.yes24.com/product/goods/97980005) |