Node.js & MongoDB

NoSQL과 몽고DB 이해

몽고DB 이해

몽고DB는 데이터 객체들이 컬렉션 내부에서 독립된 문서로 저장되는, 문서 모델을 기반으로 하는 NoSQL 데이터베이스다.

컬렉션 이해

몽고DB는 컬렉션(Collection)을 사용해 데이터를 하나로 묶는다. 컬렉션이란 그저 용도가 같거나 유사한 문서들을 그룹으로 묶은 것을 말한다. 컬렉션은 기존 SQL 데이터베이스의 테이블처럼 동작한다.

문서 이해

문서(document)란 몽고DB 데이터베이스 내에 있는 한 가지 데이터 실체를 나타내는 표현이다. 컬렉션은 한 개 이상의 연관된 실체들로 이뤄져 있다. 몽고DB에서 문서들은 내부 하위 문서들을 포함하고 있어서 애플리케이션에 훨씬 더 가까운 고유 데이터 모델을 제공한다.

문서를 나타내는 몽고DB 데이터베이스의 레코드들은 BSON으로 저장되는데, 여기서 BSON은 이진 JSON(binary JSON)을 말한다. 몽고DB 필드/값 쌍은 자바스크립트의 프로퍼티/값 쌍과 일치한다. 문서구조에는 문자열, 정수, 배열, 객체 등으로 이뤄진 필드와 프로퍼티가 들어있다.

필드명에는 null 문자, 점(.), 또는 달러 기호($)를 쓸 수 없다. 또한, _id 필드는 객체 ID에만 쓰도록 예약되어 있다.

몽고DB 내 문서의 최대 크기는 16MB이다.

몽고DB 데이터 형식

BSON 데이터 포맷은 자바스크립트 객체들을 바이너리 형태로 저장할 때 사용되는 여러 종류의 형식들을 제공한다.

몽고DB는 형식(type)으로 질의할 때 사용할 1에서 255 사이의 정수형 ID 숫자를 각 데이터 형식에 할당한다. 다음은 몽고DB가 지원하는 데이터 형식의 목록과 이들을 식별할 때 몽고DB가 사용하는 숫자들을 보여준다.

형식 숫자
실수형(Double) 1
문자열(String) 2
객체 3
배열 4
바이너리 데이터 5
객체 ID 7
불린(Boolean) 8
날짜(Date) 9
널(Null) 10
정규표현식 11
자바스크립트 13
심볼(Symbol) 14
자바스크립트(with scope) 15
32비트 정수형 16
타임스탬프 17
64비트 정수형 18
Min 키 255
Max 키 127

몽고DB에서 서로 다른 데이터 형식으로 작업할 때 주의해야 할 또 다른 점은 비교되는 순서다. 다른 BSON 형식의 값을 비교할 때, 몽고DB는 다음의 제일 낮은 순서부터 제일 높은 순서대로 순서를 비교한다.

  1. Min 키
  2. 숫자(32비트 정수형, 64비트 정수형, 실수형)
  3. 심볼, 문자열
  4. 객체
  5. 배열
  6. 바이너리 데이터
  7. 객체 ID
  8. 불린
  9. 날짜, 타임스탬프
  10. 정규표현식
  11. Max 키

데이터 모델 계획

문서 참조를 이용한 데이터 정규화

데이터 정규화는 불필요한 반복과 의존성을 최소화하기 위해 문서와 컬렉션을 체계화하는 과정이다. 하위 객체이면서, 해당 객체의 문서에서 분리돼 또 다른 컬렉션의 독립된 문서로 저장돼야 하는 객체 프로퍼티를 식별함으로써 데이터를 정규화한다. 일반적으로 하위 객체와 일대다 또는 다대다 관계를 맺고 있는 객체들을 대상으로 이러한 작업을 수행한다.

데이터 정규화의 장점은 한 컬렉션 내부에 객체들이 중복적으로 여러 개 있는 것이 아니라, 자기 자신의 컬렉션 내부에 각 객체가 하나만 존재할 것이기 때문에 데이터베이스 크기는 작아질 것이다. 또한, 하위 객체의 정보를 자주 변경한다면, 해당 객체를 갖고 있는 컬렉션의 모든 기록을 변경할 필요 없이 하나의 인스턴스만 변경하면 된다.

내장된 문서로 데이터를 비정규화

데이터 비정규화는 문서에 바로 삽입돼야 하는 하위 객체를 주된 객체 한 개에서 식별해 내는 과정이다. 일반적으로 이러한 작업은 대부분 일대일 관계이거나 상대적으로 크기가 작고 자주 갱신되지 않는 객체들에 대해 수행된다.

제한 컬렉션 사용

제한 컬렉션이란 크기가 고정된 컬렉션을 말한다. 제한 컬렉션은 삽입, 검색, 삭제가 자주 발생하는 객체에 대해 사용하기 좋다.

원자적 쓰기 연산 이해

문서 크기 증가 고려

인덱싱, 샤딩과 복제

  • 인덱싱 : 인덱싱(색인 달기)으로 정렬하기 쉬운 색인을 생성하면 자주 발생하는 질의들의 성능을 높일 수 있다. 컬렉션의 id 프로퍼티가 자동적으로 색인 처리된다.
  • 샤딩 : 샤딩은 클러스터 내 여러개의 몽고DB 서버에 분산될 수 있는 큰 데이터의 컬렉션을 분산하는 과정이다. 각 몽고DB 서버는 샤드(Shard)로 간주된다.
  • 복제 : 복제는 클러스터 내 여러 개의 몽고DB 인스턴스에 데이터를 복제하는 과정이다.

큰 컬렉션 vs. 많은 컬렉션

많은 수의 컬렉션이 있다고 해서 크게 성능 저하를 발생시키는 것은 아니지만, 동일한 컬렉션 안에 많은 항목이 있다면, 성능에 영향을 준다. 크기가 큰 컬렉션을 소모하기 쉬운 크기로 쪼갤 수 있는 방법을 고려해야 한다.

데이터 수명 주기 결정

데이터 사용성과 성능 고려