[MongoDB] MongoDB 이해하기

HAHAHELLO·2024년 12월 5일
0

데이터베이스

목록 보기
1/4

MongoDB가 무엇인지 알아보기 전에 NoSQL이 무엇인지 부터 시작해보자.

NoSQL

NoSQL은 관계형 데이터베이스에서 볼 수 있는 기존의 구조에서 벗어나 데이터를 저장하고 쿼리하는 데이터베이스 설계 접근 방식이다.
데이터 양이 폭발적으로 증가하고 동시에 형태가 다양하고 빠르게 변화하면서 기존 관계형 데이터베이스(RDBMS)가 충족하기 어려운 부분을 해소하기 위해 NoSQL이 등장했다.
NoSQL에는 Redis, Cassandra, MongoDB, HBase 등이 있다.

MongoDB

MongoDB는 NoSQL 데이터베이스로, 데이터를 테이블 형식이 아닌 도큐먼트(Document) 단위로 저장하는 'Document-Oriented 데이터베이스'이다.
여기서 도큐먼트는 JSON 형식의 데이터를 의미하며 테이블 형식에 비해 뛰어난 유연성을 갖는다.
또한, RDBMS 와는 다르게 비정형 또는 반정형 데이터를 처리하는데 최적화된 데이터 베이스이다

MongoDB 특징

1. 스키마

스키마란 데이터 구조를 정의하는 청사진을 의미하며, 어떤 데이터가 어디에 저장되고 어떤 형식과 관계를 정의하는지에 대한 개념을 뜻한다.
MongoDB는 데이터베이스에 여러 개의 테이블 대신 collection에 JSON 형태의 데이터를 저장하며, 이를 바이너리 포맷으로 변환한 BSON(Binary JSON) 형태로 처리한다.

여기서 BSON이란 JSON의 확장판으로, JSON에서 지원하지 않는 데이터 유형을 추가적으로 지원하며 성능을 향상시킬 수 있도록 설계되어 있다. 예를 들어, JSON은 텍스트 형식으로 제한적인 데이터 유형만 지원한다면 BSON은 문자열, 숫자, 날짜, 배열, 객체 외에도 바이너리 데이터, ObjectId, 정규 표현식 등 다양한 데이터 유형을 지원한다.

이를 통해 유연한 스키마를 확보할 수 있고, 필요하다면 스키마 벨리데이션(Schema Validation) 기능을 통해 데이터의 구조를 강제하고 일정한 형식의 데이터를 유지할 수 있다.

2. 복제와 고가용성

MongoDB는 Raft 알고리즘을 사용해 서버 간에 데이터를 자동으로 복제하고, 서버 장애가 발생하면 빠르게 다른 서버가 리더 역할을 대신하도록 한다.
또한, Read ConcernWrite Concern을 설정함으로써 데이터를 얼마나 안전하게 쓰고(Write Concern), 얼마나 최신 데이터를 읽을지(Read Concern) 설정하여 데이터의 일관성을 보장한다.
데이터를 어디서 읽을지 설정하는 Read Preference를 통해 트래픽을 분산시켜 성능을 최적화할 수 있다. 이를 통해 데이터베이스의 내구성과 가용성을 높이고, 서비스가 끊김 없이 잘 운영될 수 있도록 지원한다.

3. Join과 Lookup

관계형 데이터베이스(RDBMS)는 조인(join) 기능을 통해 여러 테이블의 데이터를 결합할 수 있어 복잡한 관계 데이터를 쉽게 조회할 수 있는 반면, MongoDB는 기본적으로 조인을 지원하지 않는다. 따라서 데이터 중첩과 중복 저장을 통해 조인 필요성을 줄이는 설계가 권장된다.
필요할 경우 $lookup 집계 단계를 통해 다른 컬렉션의 데이터를 참조할 수 있지만, RDBMS 조인보다 성능이 떨어질 수 있으므로 많은 데이터를 결합하거나 자주 실행되는 경우에는 주의가 필요하다.

수평적 확장(샤딩)과 다양한 인덱싱 기능 지원이라는 특징도 있는데 거기까지는 아직 이해가 잘 안되서... 필요하면 다음기회에 확장판으로 정리해야 할 것 같다.

사용 예제

로그 데이터

MongoDB는 유연한 데이터 모델을 제공하므로 로그 데이터를 저장하고 처리하는 데 유리하다. 로그는 종종 구조가 일정하지 않고 시간에 따라 다양한 형태로 생성된다. MongoDB는 이러한 비정형 데이터를 처리하는 데 강점을 지닌다.

소셜 미디어 데이터

소셜 미디어와 같은 플랫폼에서 발생하는 사용자 데이터, 댓글, 게시물 등의 저장에 적하하다. 각 사용자가 올리는 게시물은 다양한 데이터 구조를 가질 수 있으며, MongoDB의 스키마 유연성 덕분에 이런 데이터를 처리하기 용이하다.

제품 카탈로그 및 인벤토리 관리

제품 정보, 가격, 재고 상태 등을 저장하는 데 적합하다. 데이터가 자주 변경되고, 특정 제품에 대한 속성이 자주 바뀌거나 추가되는 경우 MongoDB의 유연성이 유리하다.

MongoDB의 장단점

MongoDB의 장단점을 간단히 요약해 보자면 아래와 같다.

장점

  1. 유연한 스키마
    MongoDB는 스키마가 유연하여 데이터를 자유롭게 저장할 수 있다. 데이터 구조가 변경되거나, 예기치 않은 형식의 데이터가 들어와도 손쉽게 처리할 수 있다.

  2. 수형적 확장성
    MongoDB는 샤딩(sharding) 기능을 제공하여 데이터베이스를 여러 서버에 분산 저장할 수 있다. 이를 통해 데이터가 커져도 성능을 유지하며 쉽게 확장할 수 있다.
    이러한 점은 특히, 빅데이터를 처리하거나 고성능이 요구되는 애플리케이션에서 중요한 장점이다.

  3. 빠른 읽기/쓰기 성능
    MongoDB는 높은 성능의 읽기 및 쓰기 작업을 지원하며 대량의 데이터를 빠르게 처리할 수 있다. 특히 데이터 삽입 시 높은 성능을 제공한다.
    또한 인덱싱을 통해 쿼리 성능을 최적화 할 수 있다.

  4. 풍부한 쿼리 언어와 집계 기능
    복잡하고 풍부한 쿼리와 집계 연산을 지원한다.

  5. 자동 복제 및 장애 처리
    MongoDB는 Replica Set을 통해 데이터의 복제와 장애 처리 기능을 자동으로 제공한다. 하나의 서버에 장애가 발생하면, 다른 서버가 자동으로 리더 역할을 수행하여 데이터의 가용성을 높인다.

단점

  1. 관계형 데이터 모델을 필요로 하는 애플리케이션에 부적합
    예를 들어 데이터 간의 복잡한 관계(조인)가 중요한 경우, RDBMS가 더 적합할 수 있다. MongoDB에서도 조인을 지원하긴 하지만, 관계형 데이터베이스처럼 복잡한 관계를 자연스럽게 처리하는 것에는 어려움이 있다.

  2. 복잡한 트랜잭션 처리
    MongoDB는 전통적인 관계형 데이터베이스처럼 복잡한 트랜잭션을 처리하는 데 한계가 있을 수 있다. 4.0 이상에서는 ACID 트랜잭션을 지원하지만, 여러 문서에 걸친 트랜잭션 처리에는 성능 상의 이슈가 있을 수 있다.

  3. 데이터 일관성 보장 어려움
    데이터의 일관성 유지가 중요한 경우에는 MongoDB의 기본 설정으로는 충분하지 않을 수 있다. 이를 위해서 Write Concern이나 Read Concern을 신중하게 설정해야 하며 일관성 있는 데이터를 보장하려면 추가적인 설계가 필요할 수 있다.

MongoDB 기본 명령어

# 데이터베이스 목록
show databases

# 데이터베이스 선택
use <database_name>

# 컬렌션 목록 확인
show collections

# 데이터 추가
db.<collection_name>.insertOne()
db.<collection_name>.insertMany()

# 데이터 조회
db.<collection_name>.findOne()
db.<collection_name>.find()

# 데이터 수정
db.<collection_name>.updateOne()
db.<collection_name>.updateMany()

# 데이터 삭제
db.<collection_name>.deleteOne()
db.<collection_name>.deleteMany()

참고 - [MongoDB란?] 네카라배가 MongoDB를 사용하는 이유

profile
데이터 엔지니어가 되어 봅시다 🌈

0개의 댓글