[NoSQL] MongoDB를 위한 JSON 이해

Jin Hur·2022년 6월 25일
0

Server Programming

목록 보기
14/14

MongoDB를 이해하려면 JSON을 이해해야 한다.

JSON

JSON에서 {} 구문은 객체라고 지칭함. 그리고 객체 안에는 필드 이름과 필드 값이 들어감. 즉, 키(key)와 값(value)의 쌍이다.

값에는 문자열, 숫자 말고도 다른 객체를 넣을 수도 있다.

ex)

{"a": 1}	// 키는 문자열로 ""로 둘러쌈
			// 값은 문자열, 숫자, 다른 종류의 객체 가능

{	// 객체 안에 3개의 값
	"a": 1,
	"b": "x",
	"c": 100
}

{
	"a": 1,
	"b", "x",
	"c", 100,
	"d", {"x": 50, "y": "qp"}
}

MongoDB

MongoDB는 JSON을 적극 활용한다.
MongoDB에서 다루는 데이터의 집합 관계는 앞서 보았던 관계형 DB의 집합 관계와 차이가 있다.

  • RDBMS에서 DB 인스턴스라고 부르는 것은 MongoDB에서도 똑같이 부름
  • RDBMS의 DB 인스턴스 안에는 테이블들이 있고, MongoDB의 DB 인스턴스 안에는 컬렉션(collection)들이 있음
  • RDBMS의 테이블 안에는 레코드들이 있고, MongoDB 컬렉션 안에는 도큐먼트(document)들이 있음
  • 도큐먼트에는 데이터 트리를 저장하는데, MongoDB에서 데이터를 엑세스할 때 주로 JSON 형식으로 표현한다.
  • MongoDB 또한 '결과적 일관성' 때문에 일시적으로 잘못된 데이터가 얻어질 수 있음을 인지하고 프로그래밍 해야 한다.

MongoDB에 데이터 액세스

생성(create)

db.<COLLNAME>.insert(<OBJECT>)

컬렉션 이름(COLLNAME)을 입력하고, JSON 형식으로 도큐먼트를 입력(OBJECT)하면 된다.

읽기(read)

db.<COLLNAME>.find(<COND>)

찾기 조건문(COND)를 넣으면 된다. {} 혹은 아무것도 안 넣으면 "모두 찾아라"라는 의미이다.
참고로 SQL 구문으로 바꾸면 다음과 같다.

select * from <COLLNAME> where <COND>

업데이트(update)

db.<COLLNAME>.update()

// ex) k가 1인 도큐먼트를 찾고, k의 값을 2로 바꾸라는 구문
db.<COLLNAME>.update({"k": 1}, {$set:{"a":5}} )

삭제(delete)

db.coll.remove({"a":3})

MongoDB 수평 확장

NoSQL 계열 데이터베이스 엔진(or DBMS)이 다 그렇듯, MongoDB에도 수평 확장을 위한 기능이 자체적으로 있다. 수평 확장을 샤딩(sharding) 혹은 파티셔닝(paritioning)이라고도 한다.
DB가 여러 서버 기기로 분산되고 나면, 각 서버 기기는 전체 데이터베이스의 일부 조각(샤드) 역할을 한다.

아래 그림과 같이 MongoDB 샤드 클러스터를 구성할 수 있다.

source: http://hochul.net/blog/%ED%8F%AC%EC%8A%A4%ED%80%98%EC%96%B4%EA%B0%80-mongodb%EB%A5%BC-%EC%84%A0%ED%83%9D%ED%95%9C-%EC%9D%B4%EC%9C%A0-auto-sharding/

Mongos는 App, 즉 서버에서 명령을 받는다. 그리고 적절한 샤드로 명령을 보내 결과를 받는 중계자 역할을 한다.

ConfigDB는 이러한 MongoDB 샤드 클러스터에 관한 정보를 담고 있다. 기존 MongoDB 데이터베이스 서버, 즉 mongod.exe가 그대로 사용된다.

샤드는 샤드 키로 구분되는 도큐먼트를 분배해서 가진다. 마찬가지로 mongod.exe가 그대로 사용된다.
도큐먼트는 샤드 키를 해시 함수를 사용하여 나온 값에 근거하여 어느 샤드에 저장할 지를 결정한다. 예를 들어 샤드 키로 Name을 지정하고 도큐먼트의 Name이 John일 때 MongoDB는 John에 대한 해시 함수를 실행한다. 그리고 이 해시 함수에서 나온 정수 값을 사용하여 John이 담긴 샤드를 찾고, 그 샤드에서 질의 명령을 실행한다.

ConfigDB는 모든 샤드에 관한 설정 정보 등을 가진다. 한마디로 시스템 설정이다.
ConfigDB는 MongoDB 자체의 내부 정보를 담고 있으므로 내용을 변경하는 대신 MongoDB 샤드 관련 명령을 실행해야 한다.

ConfigDB가 죽으면 다른 모든 샤드도 사용할 수 없는 상태가 된다. 따라서 ConfigDB는 별도의 서버 기기에 설치하는 것을 권장한다. 필수적으로 이중화, 즉 replica set 구성을 하도록 되어있다.

MongoDB는 replica set이라는 이중화 기능을 제공한다. replica set에서 MongoDB는 DB 내용을 다른 기기 한 대 이상에 복제본을 만들어서 둔다. 그래서 원본과 복제본 중 하나가 죽더라도 나머지가 계속해서 사용 가능한 상태가 될 수 있게 한다.

어떤 한 샤드가 죽더라도 해당 샤드만 불가능 상태가 될 뿐, 다른 샤드에 저장된 도큐먼트는 정상적으로 다룰 수 있다.

0개의 댓글