TIL-49, MongoDB
MongoDB
→ 대표적인 NoSQL Document Dabatase.
Document Dabatase는 데이터를 Table이 아닌, 문서처럼 저장해서 사용하는 데이터베이스이다.
일반적으로 JSON 유사 형식으로 데이터를 문서화 시킨다.
각각의 Document는 필드-값의 형태를 가지고있으며, 컬렉션이라고 하는 그룹으로 묶어 관리한다.
그럼 NoSQL은 뭘까?
NoSQL은 SQL처럼 테이블등을 사용하지 않는 데이터 저장소이다.
행과 열을 사용하는게 아닌, 체계적인 방식으로 저장하는데, 너무나 다양한 개념을 내포하기 때문에 좁은 의미에서 이해하도록 하자..
MongoDB는 데이터를 Document 형태로 저장하고, 이 Document는 컬렉션에 저장된다.
때문에 MogoDB가 NoSQL Document Database로 분류된다.
총 정리하자면, MongoDB Database는 NoSQL Document Database
이다.
NoSQL 기반의 비관계형 데이터베이스를 사용하는 경우
- 비구조적인 대용량의 데이터를 저장하는 경우
- 자유로운 형태로 데이터를 저장할 수 있으므로 새로운 데이터 유형을 쉽게 추가할 수 있다. 소프트웨어 개발에 정형화되지 않은 많은 양의 데이터가 필요할 경우 NoSQL이 효율적이다.
- 클라우드 컴퓨팅 및 저장공간을 최대한 활용하는 경우
- SQL데이터 베이스는 DB 증설이 수직적으로 확장해 관리가 어려워질 수 있지만, NoSQl 데이터 베이스는 DB 증설이 수평적으로 확장하기때문에 이론상으로 무한대로 DB증설이 가능하다.
- 빠르게 서비스를 구축하고 데이터 구조를 자주 업데이트 하는 경우
- 스키마를 미리 준비할 필요가 없어서 빠른 작업이 필요할 때 매우 적합하다. 시장에 프로토타입을 바삐 출시해야 하는 경우, 데이터구조를 자주 업데이트 해야하는 경우에 스키마를 일일이 수정해줘야하는 SQL보다 NoSQL기반의 비관계형 데이터베이스가 효율적이다.
Atlas Cloud
MongDB는 아틀라스(Atlas)로 클라우드에 데이터베이스를 설정한다.
GUI, CLI로 데이터를 시각화, 분석, 내보내기, 빌드하는데에 사용할 수 있다.
아틀라스 사용자는 클러스트를 배포할 수 있으며, 클러스터는 그룹화된 서버에 데이터를 저장한다.
이 서버는 MongoDB 인스턴스(데이터 사본을 저장)의 모음인 레플리카 세트(Replica set)로 구성되어 있다.
Document나 컬렉션을 변경할 경우 변경된 데이터의 중복 사본이 레플리카 세트에 저장되기 때문에 인스턴스 중 하나에 문제가 발생해도 데이터는 그대로 유지되고, 나머지 레플리카 세트의 인스턴스에 저장된 데이터로 작업이 가능하다.
클러스터(서버 그룹)을 배포하면 자동으로 레플리카 세트가 구성된다.
- 레플리카 세트 → 동일한 데이터를 저장하는 소수의 연결된 머신. 인스턴스들이 들어있다.
- 인스턴스 → 로컬 또는 클라우드에서 특정 소프트웨어를 실행하는 단일 머신 (MongoDB에서는 데이터베이스)
- 클러스터 → 데이터를 저장하는 서버 그룹으로 여러 대의 컴퓨터를 네트워크를 통해 연결하여 하나의 단일 컴퓨터처럼 동작하도록 제작한 컴퓨터
MongoDB Document
Document는 객체와 마찬가지로 데이터를 필드 - 값
쌍으로 저장하고 구성한다.
필드는 데이터의 고유한 식별자, 값은 식별자와 관련된 데이터를 뜻한다.
{
<filed> : <value>,
"name" : "kimnamhun"
}
name필드의 값은 kimnamhun이다. 이러한 Document의 모음을 컬렉션이라고 하고,
데이터베이스는 여러개의 컬렉션으로 구성된다.
- 도큐먼트 (Document) → 필드 - 값 쌍으로 저장된 데이터
- 필드 (Field) → 데이터 포인트를 위한 고유한 식별자
- 값 (Value) → 주어진 Field (식별자)와 연결된 데이터 값
- 컬렉션 (Collection) → MongoDB의 Document로 구성된 저장소. 일반적으로 Document간의 공통 필드가 있다. 데이터베이스당 많은 컬렉션이 있고, 컬렉션당 많은 도큐먼트가 있을 수 있다.
JSON과 BSON
shell을 이용하여 Document를 조회하거나 업데이트 할 때, Document는 JSON(JavaScript Object Notation) 형식으로 출력된다.
JSON 형식으로 Document를 작성하기 위해서는 아래와 같은 조건을 만족해야 한다.
{}
중괄호로 Documnet가 시작하고 끝나야 한다.- 필드와 값이
:
(콜론)으로 분리돼야 하고, 필드와 값을 포함하는 쌍은,
(쉼표)로 구분한다. - 문자열인 필드도
""
(쌍따옴표)로 감싼다.
JSON의 단점
- 파싱이 느리다
- 메모리 사용이 비효율적이다
- 기본 데이터 타입만을 지원하기 때문에 사용할 수 있는 데이터 타입에 제약이 있다
JSON의 단점을 보완하기 위한 방법으로 BSON (Binary JSON) 형식을 도입했다.
BSON은 컴퓨터 언어에 가까운 이진법에 기반을 둔 표현법이다.
때문에 JSON보다 메모리 사용이 효율적이고, 빠르고, 가볍고, 유연할 뿐만 아니라,
더 많은 데이터 타입을 사용할 수 있다.
MongoDB는 JSON형식으로 작성된 모든 것을 데이터베이스에 추가, 조회할 수 있으나
내부에서는 BSON으로 데이터를 저장, 사용되고 있다.
MongoDB의 데이터는 BSON의 형태로 저장이 되고, 읽기 쉬운 JSON의 형태로 출력이 된다.
단순 백업 저장을 위해서라면 가볍고 빠른 BSON의 형태를 사용하는것이 좋겠지만,
데이터를 조회하거나 출력해야한다면 사람이 읽기 편한 JSON의 형식으로 출력하는것이 좋다.
따라서 조건에 따라 가져오거나 내보낼 때 사용 가능한 명령어가 각각 존재한다.
(내보내는 명령어를 사용하기 위해선 Atlas Cluster URI가 필요하다.
이 URI는 일반 웹 URI와 형식이 같고, username, password, cluster 주소로 이루어져 있다.)
JSON으로 내보내고 가져오기
- 내보내기
mongoexport
→ 해당 데이터베이스의 컬렉션 이름, 파일 이름까지 정확히 작성mongoexport --uri="mongodb_srv://m001-student:m001-mongodb-basics@sandbox.ooo.mongodb.net/sample_supplies --collection=sales --out=sales.json
위와 같이 입력 후 로컬 머신으로 내보낸 sales.json을less sales.json
으로 열어보면 JSON형식으로 저장된 데이터를 볼 수 있다. - 가져오기
mongoimport
→ 데이터베이스를 다시 아틀라스 클러스터로 복원(JSON형식 뿐만 아니라, csv와 같은 데이터 형식일 수도 있다)mongoimport --uri="mongodb+srv://m001-student:m001-mongodb-basics@sandbox.ooo.mongodb.net/sample_supplies" --drop sales.json
위와 같이 가져올 수 있고,mongoimport --uri="mongodb+srv://m001-student:m001-mongodb-basics@sandbox.ooo.mongodb.net/sample_supplies" --drop sales.json --collection sales
와 같이 컬렉션 이름을 지정하는 등의 부가적인 옵션을 추가할 수도 있다.
BSON으로 내보내고 가져오기
- 내보내기
mongodump
→ 별다른 쿼리가 없다mongodump --uri "mongodb+srv://m001-student:m001-mongodb-basics@sandbox.ooo.mongodb.net/sample_supplies"
위와 같이 입력시 dump라는 폴더 안에 sample_supplies 데이터베이스 폴더가 생성되고 그 안에 sales.bson 파일이 생성된다. - 가져오기
mongorestore
→ BSON 형식의 파일을 다시 아틀라스 클러스터로 복원mongorestore --uri "mongodb_srv://m001-student:m001-mongodb-basics@sandbox.ooo.mongodb.net/sample_supplies" --drop dump
위와 같이 입력하면 done이라고 표시되며 mongorestore가 완료된다.
MongoDB CRUD 명령어
- CREATE insert 명령어