개발놀이터

왜 MongoDB인가? 본문

CS 지식/데이터베이스

왜 MongoDB인가?

마늘냄새폴폴 2025. 3. 20. 20:49

NoSQL 중에서 가장 인기있는 데이터베이스를 꼽아보라고 한다면 당연 MongoDB이지않을까 싶습니다. 저도 NoSQL에 대해서 공부하기 전에도 MongoDB는 알고 있었을 정도니까 말 다한것이죠. 

 

오늘 포스팅에선 NoSQL 그 중에서 MongoDB가 어느 부분이 특별해서 이렇게 많은 개발자들에게 사랑받고 있는지 정리해봤습니다. 

 

MongoDB의 구성 요소

MongoDB의 구성요소는 RDBMS의 그것과 굉장히 닮아있습니다. 하나씩 살펴보겠습니다. 

 

  • Collection : Collection은 RDBMS에서 테이블에 해당하는 개념으로 문서들의 집합체입니다. Collection은 스키마가 따로 존재하지 않아서 다양한 구조의 문서를 저장할 수 있습니다. 
  • Document : MongoDB의 데이터 저장 단위로 RDBMS로 치면 Row에 해당합니다. JSON과 유사한 BSON으로 데이터가 저장됩니다. 
    {
        “_id” : ObjectId(“1234”),
        “name” : “John Doe”
    }
  • Field : RDBMS의 컬럼에 해당하는 개념으로 위의 예제에선 "_id", "name"이 해당됩니다. 
  • Index : 쿼리 성능을 향상시키기 위해 특정 필드에 인덱스를 설정할 수 있습니다. 
  • Shard : 샤딩을 통해 데이터를 여러 서버에 분산 저장해서 성능을 향상시킬 수 있습니다. 
  • Replica Set : 데이터의 고가용성과 장애 복구를 위해 동일한 데이터를 여러 서버에 복제해서 관리합니다. Primary 노드와 여러개의 Secondary 노드로 구성됩니다. 이는 RDBMS에서 Replication에 해당하는 개념입니다. 

 

MongoDB의 주요 개념

  • 쿼리 언어 : SQL대신 JSON기반의 문서 지향 쿼리 언어를 사용합니다. db.users.find({ age: { $gte: 25 } }) 쿼리 언어는 이런시긍로 생겼습니다. 
  • 집계 쿼리 : NoSQL에서는 보기 힘든 집계 쿼리를 지원합니다. 이런 점은 NoSQL보단 RDBMS와 흡사한 성격을 보여주죠. 
    db.sales.aggregate([
        { $match: { status: "complete" } },
        { $group: { _id: "$category", total: { $sum: "$amount" } } }
    ])
  • 트랜잭션 : 이것또한 NoSQL이라기보단 RDBMS과 비슷한 개념입니다. 원자성을 보장해주죠. 하지만 4.0 이전에는 문서 하나에 대해서만 원자성을 보장했습니다. 4.0 이후 버전에서는 멀티 문서에 대한 트랜잭션도 보장해주죠. 이 때문에 생기는 이점이 많은데 이후에 다시 언급하도록 하겠습니다. 

 

MongoDB를 사용할 때 주의사항

스키마리스? No!

MongoDB는 스키마리스이지만 무작정 아무 데이터를 저장하면 관리가 어려워집니다. 인덱스를 지원하는만큼 어느정도의 스키마는 필요합니다. 또한, 문서의 크기가 너무 크면 성능 저하가 직격탄으로 오기 때문에 중첩 문서와 참조를 적절히 사용해야합니다. 

 

여기서 중첩 문서란 반정규화의 개념이고 참조란 정규화의 개념입니다. 반정규화, 정규화의 특징을 그대로 따릅니다. 중첩문서를 진행하면 읽기 성능이 대폭 증가하고 참조를 진행하면 쓰기 성능이 대폭 증가합니다. 

 

MongoDB가 인덱스를 단순히 지원하는 것이 아니라 복합 인덱스도 지원하기 때문에 RDBMS처럼 어느정도 일관된 스키마를 가지고 있는 것이 성능에 큰 영향을 줍니다. 때문에 MongoDB를 스키마리스라고 말한다면 반은 맞고 반은 틀린말!

 

트랜잭션

MongoDB는 기본적으로 문서 단위의 트랜잭션을 지원합니다. 하지만 4.0 이후부터는 멀티 문서 트랜잭션을 지원하는데 RDBMS만큼 강력한 ACID는 보장하지 않습니다. 만약 강한 ACID를 원한다면 적절한 설계가 이루어져야합니다. 

 

기본적으로 ACID를 지원하지 않던 데이터베이스여서 그런진 몰라도 RDBMS에 비해 트랜잭션을 많이 사용하면 성능 저하가 확실하기 때문에 트랜잭션을 적재적소에 사용해야합니다. 

 

멀티 문서 트랜잭션을 지원함으로써 가능해진 것이 바로 분산 트랜잭션입니다. 기본적으로 샤딩을 지원하는 NoSQL의 특성상 확장성에 매우 용이한데 이렇게 물리적으로 떨어져있는 독립적인 데이터들을 다룰 때에는 분산 트랜잭션이 필수적입니다. 멀티 문서 트랜잭션을 지원하면서부터 분산 트랜잭션에 용이해 MSA에서도 자주 활용되는 데이터베이스가 되었습니다. 

 

오토 샤딩

MongoDB는 Redis Cluster, HBase처럼 오토샤딩은 지원하지 않습니다. 기본값이 샤딩을 하지 않는 것이기 때문인데요. 이에 대해 MongoDB 공식 문서를 보면 웬만큼 규모가 큰 경우가 아니라면 (Scale Up, Scale Out 까지 다 해본 경우가 아니라면) 샤딩을 지양하고 있습니다. 

 

하지만 설정을 통해서 오토 샤딩을 설정할 수는 있는데요. Dynamic Sharding처럼 설계할 수 있지만 Balancer라고 부르는 샤드들을 관리하는 객체와 데이터 마이그레이션 전략을 적절히 사용해야합니다. 

 

Balancer는 데이터를 특정 샤드에서 다른 샤드로 이동시킬 수 있는데 Dynamic Sharding처럼 모든 데이터를 즉시 이동시키는 것은 아닙니다. 때문에 샤드가 추가되고 데이터를 마이그레이션하는 것을 고려해야하고 새로운 샤드가 추가되면 기존 데이터는 자동으로 샤드로 이동하지 않으므로 필요하다면 직접 moveChunk 명령어로 이동시켜야합니다. 이렇게 설정하지 않는다면 애플리케이션 레벨에서 새로운 샤드로 트래픽을 유도하는 방법을 고려해볼 수도 있습니다. 

 

MongoDB는 왜 그렇게 유명할까?

이제 MongoDB는 NoSQL의 대표주자가 되었습니다. 왜 그렇게 많이 쓸까요? 한번 알아봤습니다. 

 

  • JSON (BSON) 타입의 문서형 데이터 : JSON 기반의 데이터가 있기 때문에 데이터를 읽을 때 직관적이고 필요한 필드만 저장이 가능해 만약 필드를 추가하고싶다면 해당 문서에만 추가해주면 됩니다. 
  • 스키마리스한 데이터 모델 : 위의 특징 때문에 MongoDB는 스키마리스한 테이블을 가지게 되었습니다. 이는 필드를 새롭게 넣었다가 빼더라도 에러가 발생하지 않아서 빠른 개발이 요구되는 환경에서 선호됩니다. 
  • SQL과 비슷한 쿼리 지원 : MongoDB는 SQL과 비슷한 풍부한 쿼리를 지원하는데 보통의 NoSQL에서도 쿼리 언어가 있기는 하지만 집계 쿼리까지 가능한 것은 NoSQL데이터베이스 중에서는 MongoDB가 유일합니다. 
  • 트랜잭션 지원 : 원래 MongoDB는 하나의 문서에서만 원자성을 보장했지만 4.0 이후부턴 멀티 문서에 대해 원자성을 보장해 RDBMS처럼 부분적이지만 ACID를 지원하게 되었습니다. 
  • 수평 확장에 능함 : RDBMS에서 따라가기엔 조금 부족한 NoSQL만의 수평 확장에 능하다는 것이 특징입니다. 기본적으로 샤딩과 레플리케이션을 모두 지원하기 때문에 대규모 분산 시스템에서 적합합니다. MongoDB의 샤딩은 개발자가 어떻게 개발하느냐에 따라서 Range Sharding, Hash Sharding, Geo-Based Sharding 등 다양한 샤딩 기법을 사용할 수 있습니다. 
  • 자동 인덱스, 복합 인덱스 : MongoDB는 기본적으로 PK에 해당하는 _id에 자동으로 인덱스가 설정됩니다. 또한, 다른 필드에 인덱스를 설정하고 싶다면 복합 인덱스를 사용하면 됩니다. 
  • 개발자 친화적인 생태계 : RDBMS의 ORM처럼 MongoDB도 ODM (Object Document Mapping) 이라고 불리는 Mongoose, PyMongo등을 지원합니다. 
  • 클라우드 서비스 지원 : AWS, Azure, GCP에서 모두 사용이 가능한 완전 관리형 클라우드 서비스인 Atlas를 지원합니다. 자동 백업, 모니터링, 확정성을 책임져주죠. 

 

이게 뭐.. 대순가?

지원하는게 많긴 한데 처음엔 이게 뭐 대수인가..? 싶긴 했습니다. 왜냐하면 스키마리스라는 특징 말고는 RDBMS에서 다 보던 특징들이기 때문이죠. 근데 이건 RDBMS와 비교해서 그런것이지 다른 NoSQL 데이터베이스들과 비교하면 MongoDB는 팔방미인입니다. 

 

 

이는 MongoDB와 다른 대표적인 NoSQL을 비교한 표입니다. 보면 NoSQL 중에서는 MongoDB가 가장 선녀입니다. 모든 것을 다 지원해주고 있죠. 

 

마치며

요즘 RDBMS도 샤딩을 지원하고 있어서 샤딩이 NoSQL만의 전유물이 아니게 되어버린만큼 MongoDB가 특별히 RDBMS에 비해 뛰어나다! 이런 얘기를 하기엔 어려울 것 같습니다. 

 

하지만 제가 생각하는 MongoDB를 사용하면 좋은 점은 규모가 있는 MSA에서 MongoDB를 올려두고 사용하기 좋을 것 같다는 점입니다. RDBMS는 그 특징이 거대한 상태 덩어리인만큼 아직까지는 쿠버네티스 클러스터에 RDBMS를 올리기 부담스러워하는 개발자분들이 많습니다만, MongoDB를 올려서 쓰는 것에 대해서는 부담스럽지 않게 사용하시곤 합니다. 

 

또한, 빠른 개발이 필요한 상황에서는 MongoDB가 좋은 선택이 될 수 있어 팔방미인 NoSQL로 남아있는 것이 아닐까하는 생각이 듭니다. 

 

오늘 포스팅도 여기서 마쳐보도록 하겠습니다. 오늘도 즐거운 하루 되세요!