다중 데이터베이스를 관리하는 핵심은 config/database.yml
파일에서 각 데이터베이스 연결을 명확하게 정의하는 것입니다. 예를 들어, 전자상거래 애플리케이션의 경우 주문 및 거래 데이터를 위한 ‘primary’ 데이터베이스와 감사 및 보고서 생성을 위한 ‘primary_replica’ 읽기 복제본을 설정할 수 있습니다. 또한, 블로그 콘텐츠 관리를 위한 별도의 ‘content’ 데이터베이스와 그 읽기 복제본인 ‘content_replica’를 구성하여 애플리케이션의 다양한 영역에 맞는 데이터베이스를 분리하여 운영할 수 있습니다. 각 데이터베이스 연결은 adapter
, encoding
, pool
, username
, password
등 공통 설정을 공유하며, 복제본의 경우 replica: true
옵션을 추가합니다.
모델 연결은 ApplicationRecord
와 같은 추상 클래스를 통해 이루어집니다. ApplicationRecord
를 상속받는 모델(예: Order
, Transaction
)은 connects_to database: { writing: :primary, reading: :primary_replica }
설정을 통해 주 데이터베이스와 해당 읽기 복제본에 연결됩니다. 이와 유사하게, 블로그 관련 모델(예: Article
, Comment
)은 ContentRecord
와 같은 별도의 추상 클래스를 상속받아 content
데이터베이스와 content_replica
에 연결되도록 설정할 수 있습니다. 이 방식은 코드의 가독성을 높이고 데이터베이스 접근 로직을 명확하게 분리하는 데 기여합니다.
읽기 복제본의 활용은 애플리케이션 성능 향상에 지대한 영향을 미칩니다. 복잡하고 시간이 오래 걸리는 읽기 쿼리(예: 감사 보고서 생성)를 주 데이터베이스가 아닌 읽기 복제본에서 처리함으로써, 고객의 주문 처리와 같은 중요한 쓰기 작업에 대한 주 데이터베이스의 부하를 줄여 전반적인 사용자 경험을 개선할 수 있습니다. Rails는 GET
요청과 같은 읽기 작업은 자동으로 읽기 복제본으로 라우팅하고, POST
, PUT
, PATCH
, DELETE
와 같은 쓰기 작업은 주 데이터베이스로 라우팅하여 개발자가 명시적으로 연결을 관리할 필요 없이 효율적인 트래픽 분산을 지원합니다. 또한, 최근 쓰기 작업이 발생한 사용자의 경우 일정 시간 동안 주 데이터베이스에서 읽기 작업을 수행하도록 하여 오래된 데이터를 읽는 것을 방지하는 스마트한 자동 전환 기능도 제공합니다. 이 기능은 config/environments/production.rb
에서 database_selector
및 database_resolver
미들웨어를 설정함으로써 활성화할 수 있습니다.
마이그레이션 관리 또한 다중 데이터베이스 환경에서 중요한 부분입니다. Rails는 각 데이터베이스별로 마이그레이션 파일을 분리하여 관리할 수 있도록 지원합니다. 기본적으로 db/migrate
디렉토리는 주 데이터베이스의 마이그레이션을 포함하며, rails generate migration CreateArticles --database content
와 같이 --database
옵션을 사용하여 특정 데이터베이스(예: content
)에 대한 마이그레이션을 생성하면 해당 데이터베이스 이름의 디렉토리(예: db/content
)에 마이그레이션 파일이 생성됩니다. 이렇게 분리된 마이그레이션은 rails db:migrate:content
와 같이 특정 데이터베이스에 대해서만 실행할 수 있어, 마이그레이션 충돌을 방지하고 구조를 깔끔하게 유지하는 데 도움을 줍니다.