grep

Backend

mongoDB Story 2: mongoDB 특징과 구성요소

NHN

2021년 6월 11일

원문에서 보기 ↗

1.png

지난 글에서는 mongoDB를 이해하기 위한 첫걸음으로 mongoDB의 정의와 NoSQL에 대해 살펴보았으며, 이번 글에서는 활용 측면에서의 mongoDB 특징과 구성요소에 대해 알아보도록 하겠습니다.

2-1. 특징

mongoDB는 데이터를 관리하는 방식에서 관계형 데이터베이스와 큰 차이가 있으며 그중 가장 대표적인 특징은 다음과 같습니다.

  1. 도큐먼트 데이터베이스
    • 도큐먼트는 HTML과 같은 특정 형식의 태그 구조를 의미하며, mongoDB는 JSON(JavaScript Object Notation) 형식으로 데이터를 관리하므로 NoSQL 데이터베이스 중 도큐먼트 데이터베이스로 분류됩니다. 또한 도큐먼트는 mongoDB가 데이터를 저장하는 최소 단위이기도 합니다.
    • 도큐먼트는 필드와 값의 쌍으로 구성되며, 관계를 갖는 데이터를 중첩 도큐먼트와 배열을 사용하여 1개의 도큐먼트로 표현할 수 있습니다.
    • 데이터 입출력 시에는 JSON 형식의 도큐먼트를 사용하나 데이터베이스 저장 시에는 이진 포맷으로 인코딩한 BSON(Binary JSON) 형식의 도큐먼트로 변환되어 저장됩니다.
  2. 유연한 스키마
    • 스키마의 선언 없이 필드의 추가와 삭제가 자유로운 Schema-less 구조입니다.
    • 관계형 데이터베이스는 테이블 내 모든 로우(Row)의 칼럼 집합이 동일하고 같은 칼럼은 동일한 데이터 타입을 갖는 정형 스키마이나, mongoDB는 컬렉션 내 모든 도큐먼트들의 필드 집합이 동일하지 않고 같은 필드라도 데이터 타입이 다를 수 있는 비정형 스키마입니다.
  3. 비 관계형 데이터베이스
    • mongoDB는 관계형 데이터베이스의 관계(Relationship) 개념이 없는 비 관계형 데이터베이스입니다.
    • mongoDB는 조인(Join)을 지원하지 않으며, 대신 임베디드 방식의 도큐먼트 구조를 사용하거나 레퍼런스 방식의 도큐먼트 구조를 사용한 후 애플리케이션에서 조인해야 합니다.
  4. 비 트랜잭션
    • mongoDB는 트랜잭션을 지원하지 않고 각각의 도큐먼트 단위로 처리됩니다.
    • 트랜잭션을 지원하지 않으므로 Commit 또는 Rollback 개념이 없으며 모두 Auto Commit으로 처리됩니다.

2-2. JSON 및 BSON

mongoDB는 데이터를 관리하기 위한 형식으로 데이터 입출력 시에는 JSON 형식을 사용하고 데이터 저장 시에는 BSON 형식을 사용합니다. 다음은 JSON과 BSON 형식에 대한 자세한 내용입니다.

항목JSON(JavaScript Object Notation)BSON(Binary JSON)
내용필드와 값의 쌍으로 이루어진 데이터 오브젝트를 전달하기 위해 텍스트를 사용하는 개방형 표준 포맷으로 Javascript에서 객체 생성 시 사용하는 표현식임JSON 데이터를 이진 형식으로 인코딩한 포맷임
포맷1.png2.png
장점- 인간이 쉽게 이해할 수 있는 텍스트 형식임- 컴퓨터가 쉽게 이해할 수 있는 이진 포맷으로 검색 속도가 빠름 - 날짜 및 이진 데이터 타입을 지원함
단점- 데이터 검색 전 파싱이 필요하며 이로 인해 검색 속도가 느림 - 날짜 및 이진 데이터 타입을 지원하지 않음- BSON으로 변환하고 JSON으로 복원하기 위한 인코딩 및 디코딩이 필요함

사실 BSON으로 인코딩(encoding)하거나 디코딩(decoding)하는 것은 mongoDB가 자동으로 처리하므로 사용자가 몰라도 문제가 없습니다. 다만 데이터베이스를 정확히 이해하고 사용하면 데이터 처리에 따른 성능 판단 및 문제 해결에 도움이 되므로 개념을 이해하시기를 권장합니다. 3.png

2-3. 객체(Object)

mongoDB의 객체는 관계형 데이터베이스와 많은 공통점을 가지고 있으며 일부 명칭은 다르나 비슷한 역할을 수행합니다. 다음은 mongoDB의 객체와 관계형 데이터베이스의 객체를 비교한 내용입니다.

mongoDBmongoDB관계형 DB관계형 DB
데이터베이스 (Database)5.png데이터베이스 (Database)4.png
컬렉션 (Collection)6.png테이블 (Table)7.png
도큐먼트 (Document)8.png로우 (Row)9.png
필드 (Field)10.png칼럼 (Column)11.png
인덱스 (Index)12.png인덱스 (Index)13.png

2-4. 데이터 조작어(DML)

mongoDB의 데이터 조작어(DML - Data Manipulation Language)는 SQL 문법을 사용하지 않고 자바스크립트 기반의 명령어와 JSON 도큐먼트를 인자로 사용하지만, 관계형 데이터베이스의 데이터 조작어와 형태만 다를 뿐 비슷한 역할을 수행합니다. 다음은 mongoDB와 관계형 데이터베이스의 대표적인 데이터 조작어를 비교한 내용입니다.

항목mongoDB관계형 DB
입력db.member.insert( { no : "C001", age : 45, status : "A" } )insert into member(no, age, status) values('C001', 45, 'A')
수정db.member.update( { age : { $gt : 25 } }, { $set : { status : "C" } }, { multi : true } )update member set status = 'C' where age > 25
삭제db.member.remove( { no : "C001" } )delete from member where no = 'C001'
조회db.member.find( { no : "C001" } )select * from member where no = 'C001'

2-5. 스키마(Schema)

mongoDB는 별도의 스키마 선언 없이 도큐먼트의 필드를 자유롭게 추가 및 삭제할 수 있는 유연한 구조로, 이는 관계형 데이터베이스와 구분되는 가장 큰 특징입니다. 다음은 mongoDB와 관계형 데이터베이스의 스키마를 비교한 내용입니다.

항목mongoDB관계형 DB
스키마 생성14.png15.png
데이터 입력16.png17.png
스키마 조회18.png19.png
장점스키마 선언 없이 도큐먼트에 필드의 추가 및 삭제가 자유로움스키마를 메타 데이터로 관리하므로 스키마를 쉽게 조회할 수 있음
단점스키마에 대한 메타 데이터가 없으므로 스키마를 확인하기 위해서는 전체 도큐먼트를 조사해야 함스키마 선언 후 생성된 정형화 구조에 맞춰서만 데이터를 입력할 수 있음

이 외에도 데이터 관리정책에 의해 DBA가 스키마를 관리하는 관계형 데이터베이스와 달리 mongoDB는 유연한 스키마를 제공하여 DBA 단계의 스킵에 따른 개발 시간이 단축될 수 있습니다. 그러나 데이터 관리 주체가 불명확해져 스키마가 중구난방 생성되거나 부주의하게 삭제될 수 있는 등 관리의 어려움이 발생할 수 있어 개발팀 내 적절한 관리 규칙이 필요합니다. 20.png

2-6. 데이터 모델

mongoDB에서의 데이터 모델링은 업무 성격에 맞는 도큐먼트 구조의 설계가 중요하며 크게 임베디드 방식과 레퍼런스 방식으로 나뉩니다. 다음은 임베디드 방식과 레퍼런스 방식에 대한 간략한 설명이며 자세한 내용은 mongoDB Story 3에서 살펴보도록 하겠습니다.

항목임베디드(Embedded) 방식레퍼런스(Reference) 방식
구조21.png22.png
설명관계를 갖는 데이터를 단일 도큐먼트에 저장하는 반정 규화 모델관계를 갖는 도큐먼트의 참조키를 저장하는 정규화 모델로 조인은 애플리케이션에서 처리해야 함

2-7. Reference

지금까지 mongoDB의 특징과 구성요소에 대해 알아보았으며 다음 글에서는 mongoDB의 데이터 모델링에 대해 자세히 살펴보도록 하겠습니다. 긴 글 읽어주셔서 감사합니다.

※ 이미지 출처