Skip to content

Commit

Permalink
docs: update files by using obsidian
Browse files Browse the repository at this point in the history
  • Loading branch information
LeeSM0518 committed Dec 27, 2024
1 parent fbe02b8 commit 20d8219
Showing 1 changed file with 163 additions and 0 deletions.
163 changes: 163 additions & 0 deletions _posts/2024-12-26-mongo-db.md
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)

0 comments on commit 20d8219

Please sign in to comment.