발표자는 관계형 데이터베이스의 한계를 명확히 하기 위해 ‘스토킹’이라는 독특한 예시를 들어 설명합니다. Ruby 객체에서는 사적인 속성으로 처리될 수 있는 ‘stalkings’가 관계형 데이터베이스에서는 별도의 테이블로 공개되어야 하는 비효율성을 지적합니다. 이상적인 영속성 계층은 객체를 기본 상태로 유지하고, 애플리케이션 개발에 방해되지 않으며, 웹 애플리케이션 구축에 필요한 기능을 제공해야 한다고 강조합니다.
MongoDB의 주요 특징 및 강점
-
스키마리스(Schemaless): 컬렉션에 어떤 문서든 저장 가능하여 빠른 반복 개발에 유리하며, 마이그레이션 없이 객체 속성 추가가 용이합니다. 기존 스키마 데이터베이스에서 어렵거나 불가능했던 모델링을 가능하게 합니다.
-
문서 지향(Document-oriented): 데이터를 이진 JSON(BSON) 문서 형태로 저장하며, 행(row) 개념 대신 문서(document)를 이해합니다. 임베디드 문서(Embedded Documents)는 JSON 객체를 다른 JSON 객체 안에 중첩하여 저장하는 강력한 기능으로, 관계형 모델링 사고방식에서 벗어나 유연한 데이터 모델링을 가능하게 합니다.
-
풍부한 쿼리 문법: JSON과 유사한 쿼리 문법을 제공하여 익숙하고 강력한 데이터 조작이 가능합니다. 임베디드 문서에 대한 직접 쿼리(예:
user.last_name)를 통해 조인 없이 데이터를 검색할 수 있습니다. -
빅데이터 처리: 자동 샤딩(Autosharding) 기능을 통해 대규모 데이터베이스를 여러 노드로 분할하고 관리하는 과정을 자동화하여, 관계형 데이터베이스의 조인 문제로 인한 샤딩의 어려움을 해소합니다.
-
빠른 쓰기 성능: 더블클릭(Doubleclick) 출신 개발자들이 속도에 중점을 두어 설계했으며,
upsert(존재하면 업데이트, 없으면 삽입) 기능을 통해 단일 작업으로 효율적인 데이터 저장을 지원합니다. -
집계(Aggregation): 맵리듀스(Map-Reduce) 기능을 통해 Google GFS 스타일의 집계 분석을 JavaScript 함수로 수행할 수 있습니다.
-
빠른 읽기 성능: 관계형 데이터베이스와 유사하게 인덱스(Indexes)를 통해 빠른 읽기 성능을 달성합니다.
ensure_index명령은 이미 존재하는 인덱스를 다시 생성하지 않아 안전하게 사용 가능합니다.
MongoDB의 약점 및 비지원 기능
-
조인(Joins) 없음: 관계형 데이터베이스의 조인 기능은 지원하지 않으며, 필요시 애플리케이션 레벨에서 여러 쿼리를 수행해야 합니다.
-
다중 문서 트랜잭션(Multi-document Transactions) 없음: 속도를 최우선으로 하므로 다중 문서에 걸친 원자성(atomicity)을 보장하지 않습니다. 하지만 임베디드 문서를 통한 모델링으로 많은 경우 트랜잭션의 필요성을 줄일 수 있습니다.
-
외래 키 제약 조건(Foreign Key Constraints) 없음: 데이터 무결성은 애플리케이션 레벨에서 관리하는 것을 권장합니다.
실제 프로젝트 예시
-
회계 장부 애플리케이션: 관계형 데이터베이스에서 여러 테이블과 트랜잭션이 필요한 복잡한 장부 엔트리(credit/debit)를 MongoDB에서는 단일 문서 내에 임베디드 문서로 저장하여 모델을 단순화하고 트랜잭션 필요성을 없앱니다.
-
로깅 시스템 (Bunion & Paper Mill): 고정된 크기를 가지는 캡트 컬렉션(Capped Collections)을 활용하여 요청 데이터를 빠르게 저장하고, 스키마리스 특성으로 임의의 사용자 정보를 임베디드 문서로 추가합니다. Sinatra 기반의 Paper Mill 프론트엔드를 통해 저장된 로그를 검색하고 분석(맵리듀스 기반 컨트롤러 액션 통계)하는 데 사용됩니다.
-
블로그 애플리케이션: 저자, 태그, 댓글 등 간단한 블로그 모델을 MongoDB의 임베디드 문서(댓글)와 문자열 배열(태그)로 매우 단순하게 구현합니다. 관계형 데이터베이스의 복잡한 조인 테이블 없이 효율적인 모델링이 가능합니다.
-
리포팅 애플리케이션: 맵리듀스 지원과 스키마리스 특성 덕분에 대규모 데이터 집계 및 다양한 형태로의 데이터 평면화가 필요한 리포팅 애플리케이션에 MongoDB가 적합함을 보여줍니다. MySQL의 데이터를 MongoDB로 변환하여 리포팅에 활용하는 아키텍처를 제시합니다.