[TIL] Mongo DB

김민성·2021년 4월 13일
0

Mongo DB

Mongo DB는 NoSQL의 한 종류입니다. NoSQL 데이터베이스에선 데이터를 행과 열이 아닌 체계적인 방식으로 저장합니다. NoSQL의 종류 중의 하나인 Mongo DB는 데이터를 도큐먼트 형태로 저장합니다.

도큐먼트는 객체와 같이 데이터를 필드-값 쌍(Field - Value pair)으로 저장하고 구성하는 방법입니다. 도큐먼트에서 필드는 데이터의 고유한 식별자이고 값은 주어진 식별자와 관련된 데이터를 뜻합니다.


도큐먼트(Document)

필드 - 값 쌍으로 저장된 데이터

필드(Field)

데이터포인트를 위한 고유한 식별자

값(Value)

주어진 식별자와 관계된 데이터

컬렉션(Collection)

MongoDB의 도큐먼트로 구성된 저장소로 일반적으로 도큐먼트 간의 공통 필드가 있습니다. 데이터베이스 당 많은 컬렉션이 있고 컬렉션 당 많은 도큐먼트가 있을 수 있습니다.


기타 용어 정리

클러스터 : 인스턴스들의 모임, 데이터를 저장하는 서버 그룹

레플리카 세트 : 단일 클러스터에서 각각의 인스턴스는 동일한 복제본을 가지고 있으며 이모음을 레플리카 세트라고 한다. 데이터의 사본을 저장하는 인스턴스의 모음. 동일한 데이터를 저장하는 소수의 연결된 머신들은 머신 중 하나에 문제가 발생하더라도 데이터가 그대로 유지되도록 합니다.

인스턴스 : 로컬 또는 클라우드에서 특정 소프트웨어를 실행하는 단일 머신, MongoDB에서는 데이터베이스입니다.


데이터 형식(JSON, BSON)에 따라 달라지는 import, export 명령어

도큐먼트를 shell을 이용하여 조회하거나 업데이트 할 때, 도큐먼트는 JSON(JavaScript Stand Object Notation)형식으로 출력됩니다.
JSON 형식으로 도큐먼트를 작성하기 위해서는 아래와 같은 조건을 만족해야 합니다.

{} 중괄호로 도큐먼트가 시작하고 끝나야합니다.
필드와 값이 : 콜론으로 분리되어야 하며, 필드와 값을 포함하는 쌍은 , 쉼표로 나뉘어야 합니다.
필드도 문자열이기 때문에 "" 쌍따옴표로 감싸야 합니다.

JSON 단점:
JSON은 텍스트 형식이기 때문에 읽기 쉽지만, 파싱이 매우 느리고, 메모리 사용에 있어서 비효율적입니다.
그리고 JSON은 기본 데이터 타입만을 지원하기 때문에 사용 할 수 있는 타입에 제한이 있습니다.

이러한 문제점을 해결하기 위한 방안으로 BSON(Binary JSON) 형식을 도입하였습니다.


JSON 형식으로 데이터를 가져오고 내보내기 위한 명령어인 mongoimportmongoexport가 있고,

BSON 형식으로 가져오고 내보내기 위한 명령어 mongorestoremongodump가 있습니다.

mongodump를 하는 경우에는 별다른 쿼리가 없지만,

mongoexport를 하는 경우에는 해당 데이터베이스의 컬렉션 이름, 파일 이름까지 정확하게 작성해줘야 합니다.

mongoexport는 JSON 형식의 데이터를 아틀라스 클러스터에서 내보낼 때 사용합니다. 단, 내보낼 때 아틀라스 클러스터에 컬렉션을 더하는 대신, 아틀라스 클러스터 외부에 데이터 복사본을 만듭니다.

mongoimport는 데이터베이스를 아틀라스 클러스터로 가져올 수 있도록 합니다. 이 때 데이터는 JSON 일 수도 있고, 지원되는 다른 데이터 형식일 수도 있습니다.

mongo shell은 자동적으로 정렬되지 않은 결과물 리스트를 리턴합니다.


아틀라스 관련 문제해결

  • 환경변수 $PATH를 추가해주어야 아틀라스를 정상 실행할 수 있다.
    -> export PATH=$PATH:/바탕화면/mongodb-linux-x86_64-ubuntu2004-4.4.5/bin
    source ~/.bashsrc를 통해 영구적으로 저장해줄 수 있다.

  • 몽고db서버 버전과 몽고db 쉘 버전을 맞춰주어야 실행할 수 있다.
    -> 현재 우분투를 사용하고 있는데 몽고db 쉘 최신버전을 설치해도 자꾸 하위버전이 깔려서 최신 deb파일을 사용하여 버전을 업그레이드 했다.


Office Hour

DATABASE 사용하는 이유

  1. fs 사용을 하지 않을려고
  2. 다중 사용자 중심으로 편하게 데이터를 관리하기 위해
  3. Data redundancy -> 백업을 편하게 하기 위해

질문으로 나왔던 내용

데이터 요청이 들어왔을때 저장 공간이 더 늘어날 수 있다 -> 확장성이 있다.

Sql의 수직확장이 한계가 있다고 들었는데 기업에서 sql의 한계를 느끼고 nosql로 갈아타야하는 경우에 sql, nosql 둘다 사용하는건가요? -> 현재 여러 회사에서 목적에 따라 하나의 프로젝트에서 여러개의 sql, nosql을 사용하고 있다!

컴퓨터가 모여있으면 클러스터이다. 모여있는 이유는 모여서 일을 나누고 같이 일을 진행하기 위해서 이고, 레플리카 failure 극복을 위함이다. 레플리카 failure 극복은 데이터의 사본을 저장하는 인스턴스의 모음인 레플리카 세트에서 하나의 db가 오류가 나더라도 사본들이 있기 때문에 failure을 극복할 수 있다.

클라우드 데이터베이스는 아마존 같은 대기업이 하드디스크 역할을 대신해준다.

혹시 데이터베이스센터가 자연재해로 폭팔해버리면 모든 데이터가 날라가는게 맞는거죠? 또 그거에 대비한 데이터센터를 미리 만들어놓는건가요? -> disaster recovery 검색해보기


오늘 수업 후기

몽고db 쉘과 서버를 설치하고 우분투에서 정상적으로 돌리는 데에 시간을 많이 할애해 버렸다. 그렇기 때문에 낮에는 이론적으로 공부하고 저녁에 실습을 하면서 공부했다. 컬렉션을 찾고 삽입하고 수정하고 삭제하는 내용은 공식문서를 찾아보면 금방 활용할 수 있었다.

db와 서버 부분을 빨리 익숙해지게 하고 싶은데 서버부분이 감이 아직 잘 잡히지 않는다. 주말을 활용해서 서버 연결하는 컴포넌트를 보고 써보면서 눈과 손에 익숙해지게 만들어야겠다. 새로운 용어들과 함수 사용법들이 낯설어서 친해질려면 고생 좀 하겠다!

profile
https://github.com/alstjd8826

0개의 댓글