Rails CLI 확장 및 MongoDB 지원 통합

Jamis Buck - Repurposing the Rails CLI - Rails World 2024 - YouTube

3줄 요약

  • 본 발표는 Ruby on Rails CLI를 확장하여 MongoDB 및 Mongoid 사용자를 위한 통합된 경험을 제공하는 방법을 다룹니다.
  • Rails의 SQL 중심적인 특성으로 인해 발생하는 MongoDB 사용의 어려움을, Thor 기반의 CLI 확장 및 Rails 템플릿, 그리고 전략적인 Monkey Patching을 통해 해결합니다.
  • 이를 통해 `rails new` 명령어로 Mongoid 기반 애플리케이션을 손쉽게 생성하고, `db:console`과 같은 명령어를 MongoDB 환경에 맞게 자동화할 수 있습니다.

본 발표는 Ruby on Rails(이하 Rails)의 Command Line Interface(이하 CLI)를 확장하여 비관계형 데이터베이스인 MongoDB와 그 ORM(Object Relational Mapper)인 Mongoid 사용자들이 보다 원활하게 Rails 애플리케이션을 개발할 수 있도록 지원하는 방안을 제시합니다. 발표자는 Rails의 핵심 기여자이자 MongoDB 개발자로서, Rails가 가진 고유한 의견(SQL 데이터베이스 선호)과 MongoDB 사용자의 편의성이라는 두 가지 원칙 사이의 균형점을 모색하며, Rails CLI의 내부 구조를 활용한 사용자 경험 개선 사례를 공유합니다.

Rails는 관계형 데이터베이스를 선호하는 의견 지향적 프레임워크로, Active Record 기반의 기능들이 SQL 데이터베이스에 종속됩니다. 이로 인해 MongoDB 사용자는 rails new 명령어로 직접 MongoDB를 선택할 수 없으며, Active Record를 건너뛰고 Mongoid 젬 설치, 번들링, 설정 파일 생성 등 여러 수동적인 단계를 거쳐야 하는 불편함이 있었습니다.

이 문제를 해결하기 위해 발표자는 Rails CLI의 기반인 Thor 라이브러리와 Rails 템플릿 기능을 탐구했습니다. 초기 셸 스크립트 시도는 유연성 부족으로 한계를 보였고, 궁극적으로 Rails CLI 자체를 확장하는 방안을 채택했습니다. 이는 Rails의 application generator 클래스를 Monkey Patching하여 기본 template 경로를 Mongoid 설정 템플릿으로 지정하고, skip-active-record 옵션을 기본값으로 설정하는 방식으로 이루어졌습니다. 또한, encryption과 같은 사용자 정의 옵션을 추가하여 복잡한 암호화 관련 설정을 단일 명령어로 자동화했습니다.

나아가, rails db:console과 같은 기존 Rails 명령어가 MongoDB 환경에서 작동하지 않는 문제를 해결하기 위해, Rails CLI의 명령어 검색 메커니즘을 Monkey Patching하여 mongoid 네임스페이스를 우선 탐색하도록 변경했습니다. 이를 통해 rails_mdb db:console 실행 시 MongoDB 셸이 자동으로 실행되도록 구현했습니다. 마지막으로, 사용자의 기존 rails 명령어 습관을 고려하여, 생성된 bin/rails_mdb 실행 파일을 bin/rails로 심볼릭 링크함으로써, 기존 rails 명령어를 사용해도 Mongoid에 최적화된 기능이 작동하도록 사용자 경험을 극대화했습니다. 이 모든 과정은 철저한 테스트와 의존성 관리를 통해 안전하게 구현되었습니다.

본 프로젝트는 Rails CLI의 심층적인 구조와 Thor의 유연성을 활용하여, Rails의 특정 설계 철학에도 불구하고 MongoDB 사용자들에게 최적화된 개발 환경을 제공할 수 있음을 성공적으로 보여주었습니다. 이는 기존 프레임워크의 핵심을 존중하면서도, 특정 사용자층의 요구사항을 창의적으로 해결하는 모범 사례입니다. 현재 GitHub에서 `mongodb/mongoid-rails-mdb` 프로젝트로 활발히 개발 중이며, Rails 7.2 버전과의 호환성 확보 후 정식 버전 출시를 목표로 합니다. 이 사례는 개발자들이 익숙한 도구의 내부를 탐색하고 유연하게 확장함으로써 새로운 가치를 창출할 수 있음을 강조합니다.