컴퓨터/database

[MongoDB] 몽고DB 후다닥 시작하기 - 1

김크리 2022. 6. 24. 23:31

몽고DB

유연하고 확장성 높은 범용 데이터베이스이다.

보조 인덱스(secondary index), 범위 쿼리(range query), 정렬(sorting), 공간 정보 인덱스(geospatial index) 등을 확장 기능과 결합한 데이터베이스이다.

도큐먼트 지향 데이터베이스(Document oriented database)

1. 관계형 데이터베이스보다 분산 확장(scale-out)을 쉽게 할 수 있다.

 - 유연한 모델인 도큐먼트를 사용하여 복잡한 계층관계를 하나의 레코드로 표현할 수 있다. 이 관점은 객체 지향언어를 사용하는 개발자 관점에 적합하다고 볼 수 있다.

 - 몽고DB는 분산확장을 염두에 두고 설계되어 있어 데이터를 여러 서버에 쉽게 분산하기에 적합하다.

 - 도큐먼트를 자동으로 재분배하고 사용자 요청을 라우팅하며 클러스터 내 양과 부하를 조절할 수 있다.

   - mongos(라우터)가 다양하게 샤딩된 데이터를 자동으로 재분배하고 라우팅한다.

 

2. 도큐먼트의 키와 값(key-value)을 미리 정의하지 않는다. (=고정된 스키마가 없다.)

 - 고정된 스키마가 없어 쉽게 필드를 추가하거나 제거할 수 있다.

 - 다양한 모델을 실험해보기에 적합하다.

 

3. 범용 데이터베이스로 만들어졌기 때문에 CRUD외에 기본적인 DBMS 기능 등을 지원한다.

 - 인덱싱

  - 고유 인덱스(unique index)

  - 복합 인덱스(compound index)

  - 공간 정보 인덱스

  - 전문 인덱스(full-text index)

- 집계 : 데이터 처리 파이프라인 개념을 기반으로 한 집계 프레임워크를 제공한다.

   - 집계 파이프라인(aggregation pipeline)은 데이터베이스 최적화를 활용하여 서버 측에서 간단한 단계로 데이터 처리하여 복잡한 분석 엔진을 구축하게 해준다.

 - 특수한 컬렉션 유형

   - 로그 등과같이 최신 데이터를 유지하고자 세션이나 고정 크기 컬렉션(제한 컬렉션) 과 같이 특정 시간에 만료해야하는 데이터에 대해 유효시간 컬렉션(TTL collection)을 제공한다.

   - 기준 필터(criteria filter)와 일치하는 도큐먼트에 한정된 부분 인덱스를 지원하여 효율성을 높이고 필요한 저장 공간을 줄인다.

 - 파일 스토리지 : 큰 파일과 파일의 메타데이터를 편리하게 저장하는 프로토콜을 지원한다.

 

4. 관계형 데이터베이스의 조인(join)은 기본적으로 몽고DB의 설계에 없다.

 - $lookup 집계 연산자를 사용함으로 제한적인 조인이 가능하다.

 - 3.6 버전 이후부터 관련 없는 서브쿼리 뿐만 아니라 여러 조건으로 복잡한 조인이 가능하다.(확장성을 위해 추가)

 

5. 고성능

 - 동시성과 처리량을 극대화하기 위해 와이어드 타이거 스토리지 엔진에 기회적 락을 사용한다. (=제한된 용량의 램으로 알맞은 인덱스를 자동으로 선택할 수 있다.)

기본

도큐먼트(Document)

- 몽고DB의 데이터 기본 단위

- 모든 도큐먼트는 컬렉션 내에서 고유한 특수키인 "_id"를 갖는다.

- 도큐먼트의 키(key)는 \0(null 문자)를 포함하지 않는다 . \0은 키의 끝을 나타내는 데 사용된다.

- .과 $ 문자는 특별한 속성을 가진 예약어로 취급한다.

- 몽고DB는 데이터형(data type)과 대소문자를 구분한다.

- 몽고DB에서는 키가 중복될 수 없다.

{
	"count":3
}

컬렉션(Collection)

- 도큐먼트의 모음

- 동적 스키마(dynamic schema)가 있는 일종의 테이블

- 관련된 유형의 도큐먼트를 그룹화

- 컬렉션은 이름으로 식별된다. (UTF-8, string)

- 빈 문자열("")은 유효한 컬렉션 명이 될 수 없다.

- \0(null 문자)은 컬렉션의 끝을 나타내는 문자임으로 해당 문자를 사용할 수 없다.

- system.으로 시작하는 컬렉션 명은 시스템 컬렉션의 예약어이다.

  - system.users 데이터베이스 사용자 정보 저장

  - system.namespaces 데이터베이스 내 모든 컬렉션 정보 저장

- 사용자가 생성하는 컬렉션은 예약어인 $를 포함할 수 없다.

- 서브 컬렉션

  - 네임스페이스에 .(dot)문자를 사용하여 컬렉션을 체계화 한다.

  - ${부모컬렉션}.${자식컬렉션} 으로 선언하였을 경우, 해당 서브컬렉션은 선언된 부모컬렉션,자식컬렉션과 관계가 없다.

  - 위의 부모컬렉션, 자식컬렉션이 없어도 선언할 수 있다.

  - 몽고DB의 데이터를 체계화하는 방법이다.

데이터베이스

- 몽고DB는 데이터베이스에 컬렉션을 그룹지어 놓을 수 있다.

- 몽고DB의 단일 인스턴스는 여러 데이터베이스를 호스팅 할 수 있다. (인스턴스 ⊃ 데이터베이스  컬렉션  도큐먼트)

- 데이터베이스를 나누면 하나의 몽고DB 서버에서 여러 애플리케이션이나 여러 사용자 데이터를 저장할 때 유용하다.

- UTF-8 문자열 이름으로 식별된다.

- 빈 문자열("")을 데이터베이스 이름으로 사용할 수 없다.

- 특정문자를 포함할 수 없다.  => /, \, , ' ', *, <, >, :, |, ?, $, (단일 공간), \0(null 문자)

- 데이터베이스의 이름은 대소문자를 구분한다

- 데이터베이스의 이름은 최대 64바이트

- 특별한 의미를 갖은 예약된 데이터베이스 이름이 존재한다.

  - admin : 인증과 권한부여의 역할을 한다.

  - local : 단일 서버에 대한 데이터를 저장한다. 복제 셋(replica set)에서 local은 복제 프로세스에 사용된 데이터를 저장한다. local 데이터베이스 자체는 복제되지 않는다.

  - config : 샤딘된 몽고DB의 클러스터는 config데이터베이스를 사용하여 각 샤드의 정보를 저장한다.

데이터베이스 명 : cms
컬렉션명 : blog.posts
도출되는 네임스페이스명 : cms.blog.posts

몽고 셀(The mongo shell)

- 몽고 DB를 조작하고 관리할 수 있는 몽고DB 쿼리 언어이며, 내장 지원된다.

- 스크립트를 만들고 로드할 수 있는 자바스크립트 인터프리터이다.

 

몽고DB 설치하기(맥 OS X, 리눅스)

리눅스, 맥 OS X, 윈도우, 솔라리스에서 동작할 수 있다.

몽고DB의 핵심 데이터베이스, 프로세스는 mongod 를 공부한다.

몽고DB는 상용적DB.. 하지만 학습목적일 경우에는 일부 제한에 따라 무료로 사용할 수 있다.

 

1. 몽고DB 다운로드 페이지(https://www.mongodb.com/try/download)에서 운영체제에 맞는 버전을 다운로드 받는다.

#원하는 위치에 데이터베이스 파일을 저장할 디렉터리 생성
mkdir db

#다운받은 압축파일 해제
tar zxf ${파일명}.tgz

#데이터베이스 경로 설정
${압축 해제된 경로}/bin/mongdb --dbpath ${데이터페이스 파일 저장 디렉토리 위치}

#데이터베이스 시작
${압축 해제된 경로}/bin/mongod ${db 경로}

2. mongo를 이용하여 몽고DB 셀을 실행할 수 있다.

${설치경로}/bin/mongo

- 표준 자바스크립트 라이브러리의 모든 기능을 활용할 수 있다. 함수 정의, 연산 등 모든 것을 할 수 있다.

# 현재 할당된 db 정보 확인
> db

# 데이터베이스를 변경한다.
> use video

# 도움말 확인
> help

# 현재 데이터베이스의 컬렉션 반환
> db.${컬렉션명}

- 셀 기본 작업인 CRUD(생성, 읽기, 갱신, 삭제)를 진행할 수 있다.

# movie라는 지역변수를 생성
> movie = {"title" : "Star wars",
"director" : "George Lucas", "year": 1977}

# 자바스크립트 insertOne 함수를 사용하여 생성된 movie 지역변수를 movies 컬렉션에 저장
> db.movies.insertOne(movie)

# insertId 값과 acknowledge 값이 출력될 것이다.
# 저장된 데이터를 호출한다.
> db.movies.find().pretty()

# _id 필드가 생성된 것을 확인할 수 있다.

- 읽기의 경우 find, findOne을 이용하여 컬렉션을 쿼리하는데 사용할 수 있다.

- find, findOne의 경우 쿼리 도큐먼트 형태로 조건 전달이 가능하다. find의 경우 최대 20개까지 자동 출력한다.

- 수정(=갱신)의 경우, updateOne을 사용한다. 매개변수는 최소 두 개이다. 수정할 도큐먼트를 찾는 값과 갱신 작업을 설명하는 도큐먼트 매개변수가 필요하다.

- 갱신 연산자 set을 이용하여 갱신할 수 있다.

# 값 수정 (reviews 키 추가)
> db.movies.updateOne({title: "Star Wars"}, {$set: {reviews:[]}})

# 변경 내용 조회
> db.movies.find()

- deleteOne, deleteMany를 이용하여 도큐먼트를 데이터베이스에서 영구적으로 삭제할 수 있다. 필터 도큐먼트로 삭제 조전을 지정할 수 있다.

# 도큐먼트 삭제
> db.movies.deleteOne({title:"Star wars"})

# 도큐먼트 조회
> db.movies.find()

몽고DB 내부

BSON

- 몽고DB에서의 도큐먼트는 추상적인 개념이기에 구체적인 표현에 따라 표준 형식이 필요하다. BSON은 몽고DB의 표준 도큐먼트 형식이며 '바이너리 JSON' 또는 BSON이라고 한다.

- 도큐먼트를 바이트 문자열로 표현할 수 있는 경량 바이너리 형식

- BSON의 목표

  - 효율성 : 공간 낭비를 줄여 데이터를 효율적으로 표햔하기 위해 고안되었다.

  - 횡단성 : 쉬운 탐색을 위해 공간 효율성을 희생한다. 

  - 성능 : 빠른 인코딩/디코딩을 진행하도록 설계되었다.

와이어 프로토콜

- 경량 TCP/IP 와이어 프로토콜을 사용하여 몽고DB 서버에 드라이버가 접근한다.

- 기본적으로 BSON의 데이터를 감싸는 래퍼형태의 프로토콜을 사용한다.

- 데이터 디렉터리 내부에는 컬렉션, 인덱스에 대해 파일이 저장된다.

와이어드 타이거 스토리지엔진

- 몽고DB의 기본 스토리지 엔진

- 각 컬렉션 또는 인덱스를 임의의 큰 파일 하나에 저장하고 도큐먼트가 갱신된때 마다 전체의 새 사본을 저장한다.

- 와이어드타이거가 생성한 파일 내의 공간은 재활용 되고 일정 간격으로 와이어드타이거는 파일을 잘라 초과된 공간을 제거한다.

- 와이어드 타이거의 체크포인팅은 데이터의 일관된 특정 시점 스냇샷을 생성하며 60초마다 발생한다. 해당 데이터는 디스크에 쓰이고 관련 메타데이터를 갱신하는 작업이 포함된다.

- 와이어드타이거는 다중버전 동시성 제어(MultiVersionConcurrency Control)을 사용하여 읽기와 쓰기 작업을 격리함으로써, 작업 시작 시 데이터의 일관된 특정 시점 뷰를 클라이언트가 볼 수 있게 한다.

 

앞으로 확인이 필요한 내용

도큐먼트 지향 데이터베이스, 고가용성, 분산 환경 경험,  개발시간 단축, 유연한 스키마 설계, NoSQL, MERN스택(MongoDB, Express.js, React, Node.js, 도큐먼트 그룹화, 집계 프레임워크, 컬렉션, 인덱스, 복제 셋, 클러스터, 샤딩)

참고

도서 - 몽고DB 완벽 가이드 3판