MongoDB를 활용한 실용적인 Ruby 프로젝트

[29M04] Practical Ruby Projects with MongoDB

작성자
RubyKaigi
발행일
2025년 10월 05일

핵심 요약

  • 1 관계형 데이터베이스의 객체-관계 불일치 문제를 지적하고, MongoDB가 객체 중심의 데이터 모델링을 통해 이를 해결하는 방안을 제시합니다.
  • 2 MongoDB의 스키마리스, 문서 지향, 확장성 등의 특징과 임베디드 문서, 캡트 컬렉션, 맵리듀스 같은 핵심 기능을 실제 프로젝트 예시로 설명합니다.
  • 3 회계 장부, 로깅 시스템(Bunion/Paper Mill), 블로그, 리포팅 애플리케이션 등 다양한 Ruby 프로젝트에서 MongoDB를 효과적으로 활용하는 방법을 시연합니다.

도입

본 발표는 Ruby 개발자를 대상으로, 관계형 데이터베이스(SQL)가 현대 객체 지향 프로그래밍 언어, 특히 Ruby와 가지는 본질적인 불일치 문제를 제기하며 시작됩니다. SQL이 약 40년 전 데이터 쿼리를 위해 설계된 반면, 현대 개발자들은 객체를 다루므로 데이터 저장 방식과 객체 모델 간의 간극이 발생한다는 점을 강조합니다. 이러한 객체-관계 불일치(Impedance Mismatch)로 인해 ORM(Object-Relational Mapper)과 같은 복잡한 도구가 필요해지며, 이는 비효율적이고 개발 흐름을 방해한다고 주장하며 MongoDB가 이러한 문제를 해결할 수 있는 대안임을 제시합니다.

발표자는 관계형 데이터베이스의 한계를 명확히 하기 위해 ‘스토킹’이라는 독특한 예시를 들어 설명합니다. 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로 변환하여 리포팅에 활용하는 아키텍처를 제시합니다.

결론

발표자는 MongoDB가 관계형 데이터베이스의 오래된 패러다임에서 벗어나 현대 객체 지향 개발에 더 적합한 영속성 계층을 제공한다고 결론지었습니다. 스키마리스 및 문서 지향 모델링은 개발 속도를 높이고 복잡성을 줄여주며, 임베디드 문서와 캡트 컬렉션, 맵리듀스 등의 기능은 다양한 애플리케이션 시나리오에 강력한 솔루션을 제공합니다. 금융 거래와 같이 엄격한 다중 문서 트랜잭션이 필요한 경우를 제외하고는, MongoDB가 많은 Ruby 프로젝트에서 효율적인 데이터 영속성 솔루션이 될 수 있음을 강조합니다. Ruby 개발자들에게는 Ruby 드라이버부터 시작하여 MongoDB를 직접 경험해 볼 것을 권장하며, MongoMapper나 MongoID와 같은 ODM(Object Document Mapper)을 활용하여 Rails 애플리케이션에 쉽게 통합할 수 있음을 언급합니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!