Theory
mongodb
Transaction vs RDBMS

RDBMS vs MongoDB: 어떤 경우에 RDBMS가 더 나은 선택일까?

이 문서는 "In what cases is MongoDB inferior to an Rdbms? (opens in a new tab)"라는 Reddit 질문과 관련하여, MongoDB보다 관계형 데이터베이스(RDBMS)가 더 나은 선택이 될 수 있는 경우에 대해 여러 웹 문서의 내용을 종합하여 정리한 것입니다.

주요 참고 자료:

TL;DR

"어떤 데이터베이스를 선택해야 할지 잘 모르겠다면, 관계형 데이터베이스(MySQL, PostgreSQL 등)를 선택하세요."

대부분의 경우 이 결정은 옳을 것이며, 나머지 소수의 경우에만 나중에 MongoDB로 마이그레이션하는 것을 고려해볼 수 있습니다. (출처: inconceptlabs.com)


RDBMS가 MongoDB보다 뛰어난 핵심 영역

MongoDB는 특정 시나리오에서 매우 강력한 성능과 유연성을 제공하지만, 다음과 같은 경우에는 전통적인 RDBMS가 더 나은 선택이 될 수 있습니다.

1. 데이터 무결성과 엄격한 ACID 트랜잭션이 필요할 때

RDBMS의 가장 큰 장점은 데이터의 무결성을 보장하는 것입니다. 외래 키(Foreign Key), 제약 조건 등을 통해 데이터 간의 관계가 항상 일관성 있게 유지됩니다.

  • ACID 트랜잭션: RDBMS는 여러 개의 작업을 하나의 논리적 단위로 묶는 다중 작업 트랜잭션을 완벽하게 지원합니다. 예를 들어, 은행 송금처럼 'A 계좌에서 출금'과 'B 계좌로 입금'이 모두 성공해야만 전체 트랜잭션을 완료(Commit)하고, 하나라도 실패하면 모두 원래 상태로 되돌립니다(Rollback).
  • MongoDB의 트랜잭션: MongoDB도 버전 4.0부터 다중 문서 ACID 트랜잭션을 지원하지만, RDBMS만큼 강력하지는 않으며 몇 가지 제약(예: 한 트랜잭션 당 1,000개 문서 제한)이 존재합니다. 따라서 금융, 거래, 재고 관리 등 데이터의 정합성이 최우선인 시스템에는 RDBMS가 더 적합합니다.

2. 데이터가 고도로 구조화되고 관계가 복잡할 때

애플리케이션에서 다루는 데이터가 본질적으로 관계형(Relational)이라면 RDBMS가 자연스러운 선택입니다.

  • 정규화(Normalization): RDBMS에서는 정규화를 통해 데이터 중복을 최소화하고 구조를 명확하게 설계합니다. 이는 데이터 저장 공간을 절약하고, 데이터 일관성을 유지하며, 더 작은 테이블을 스캔하여 쿼리 성능을 향상시키는 데 도움이 됩니다.
  • MongoDB의 JOIN ($lookup): MongoDB는 $lookup 연산자를 통해 컬렉션 간의 JOIN을 흉내 낼 수 있지만, 이는 RDBMS의 JOIN에 비해 성능이 떨어지고 복잡합니다. MongoDB의 설계 철학 자체가 'JOIN을 피하는 것'에 가깝기 때문에, 복잡한 JOIN이 많이 필요한 시스템이라면 RDBMS를 사용하는 것이 좋습니다.

3. 강력한 SQL과 그 생태계가 필요할 때

SQL은 지난 수십 년간 데이터를 다루는 표준 언어로 자리 잡았으며, 매우 강력하고 유연합니다.

  • 복잡한 쿼리: CTE(Common Table Expressions), 윈도우 함수(Window Functions) 등 고급 SQL 기능을 사용하면 복잡한 데이터 분석 및 리포팅 쿼리를 효율적으로 작성할 수 있습니다.
  • 도구 생태계: Tableau, Power BI와 같은 대부분의 BI(Business Intelligence) 도구 및 데이터 분석 도구들은 SQL 기반의 RDBMS에 대한 지원이 훨씬 강력합니다. MongoDB용 SQL 브릿지가 존재하지만 기능이 제한적이고 설정이 복잡할 수 있습니다.

MongoDB 사용 시 고려해야 할 문제점

스키마 설계의 복잡성

MongoDB의 '유연한 스키마'는 장점이자 단점입니다. RDBMS는 명확한 정규화 원칙이 있어 주니어 개발자도 비교적 쉽게 안정적인 스키마를 설계할 수 있습니다.

반면, MongoDB에서는 모든 데이터에 대해 **임베딩(Embedding)**할지, **참조(Referencing)**할지를 개발자가 직접 판단해야 합니다. 이 결정은 애플리케이션의 쿼리 패턴에 따라 성능에 지대한 영향을 미치며, 잘못된 설계는 나중에 큰 수정 비용을 초래할 수 있습니다.

데이터 무결성 문제

MongoDB는 외래 키(Foreign Key)와 같은 관계형 제약조건이 없기 때문에, 데이터 무결성을 애플리케이션 레벨에서 직접 코드로 구현해야 하는 경우가 많습니다. 이는 개발자의 부담을 가중시키고, 실수로 인한 '논리적 데이터 손상'의 위험을 높입니다.

특정 시나리오에서의 성능 저하

  • Join 성능: 위에서 언급했듯이, $lookup을 사용한 Join은 RDBMS에 비해 50~130배까지 느려질 수 있다는 벤치마크 결과도 있습니다.
  • Pagination 성능: 대용량 데이터에서 skip() 함수를 사용한 페이지네이션은 뒤쪽 페이지로 갈수록 이전 데이터를 모두 스캔해야 하므로 성능이 급격히 저하됩니다. 이를 해결하려면 skip 대신 다른 방식(Keyst/Cursor-based pagination)을 구현해야 합니다.

결론: 언제 MongoDB를 사용해야 하는가?

MongoDB는 다음과 같은 경우에 훌륭한 선택이 될 수 있습니다.

  1. 빠른 프로토타이핑: 초기 개발 단계에서 스키마 걱정 없이 빠르게 제품을 만들고 싶을 때.
  2. 비정형/반정형 데이터 저장: 로그 데이터, JSON 문서, 콘텐츠 관리 등 스키마가 일정하지 않은 데이터를 다룰 때.
  3. 높은 쓰기 처리량 및 확장성: 수평적 확장(Sharding)을 통해 대규모의 쓰기 및 읽기 트래픽을 처리해야 할 때.

하지만, 애플리케이션의 핵심 데이터가 관계형이고, 데이터의 일관성과 무결성이 중요하며, 복잡한 쿼리가 필요하다면 RDBMS가 훨씬 안정적이고 예측 가능한 선택입니다.