Docs Menu

지속성 구성

이 가이드 에서는 Mongoid가 데이터베이스 및 컬렉션에 데이터를 유지하는 방법에 대해 학습 수 있습니다. 지속성 구성은 Mongoid가 MongoDB 에 데이터를 저장하는 방법을 제어하는 설정을 나타냅니다. 여기에는 모델 클래스에 대한 문서가 저장되는 클라이언트, 데이터베이스 및 컬렉션 과 읽기 및 쓰기 (write) 기본 설정과 같은 기타 구성 옵션이 포함됩니다. 이 가이드 모델 클래스의 지속성 구성에 액세스 하고 업데이트 사용할 수 있는 메서드와 예제를 제공합니다.

참고

' 클라이언트 ' 텀 mongoid.yml 파일 의 clients 아래에 정의된 호스팅하다 구성을 나타냅니다. 대부분의 애플리케이션은 default이라는 단일 클라이언트 사용합니다.

기본값 으로 Mongoid는 이름이 대표 클래스 이름의 복수형인 컬렉션 에 문서를 저장합니다. 다음 예시 에서 Restaurant 클래스의 경우 해당 컬렉션 이름은 restaurants입니다. Person 클래스의 경우 해당 컬렉션 이름은 people입니다.

class Restaurant
include Mongoid::Document
end
class Person
include Mongoid::Document
end

그러나 복수형화의 기본값 규칙이 항상 작동하는 것은 아닙니다. 예시 들어 모델 이름이 Rey이라고 가정해 보겠습니다. 스페인어에서 이 단어의 복수형은 reyes이지만 기본값 컬렉션 이름은 reys입니다.

ActiveSupport::Inflector::Inflections.plural 를 호출하여 모델 클래스에 대한 새 복수화 규칙을 만들 수 있습니다. 인스턴스 메서드를 사용하고 클래스 이름의 단수형과 복수형을 전달합니다. 다음 예시 reyesrey의 복수형으로 지정합니다.

ActiveSupport::Inflector.inflections do |inflect|
inflect.plural("rey", "reyes")
end

결과적으로 Mongoid는 Rey 모델 클래스 문서를 reyes 컬렉션 에 저장합니다.

참고

BSON 문서 구조

Mongoid가 데이터베이스 에 문서 저장하면 Ruby 객체 다음과 같은 구조의 BSON 문서 로 직렬화합니다.

{
"_id" : ObjectId("4d3ed089fb60ab534684b7e9"),
"title" : "Sir",
"name" : {
"_id" : ObjectId("4d3ed089fb60ab534684b7ff"),
"first_name" : "Durran"
},
"addresses" : [
{
"_id" : ObjectId("4d3ed089fb60ab534684b7e0"),
"city" : "Berlin",
"country" : "Deutschland"
}
]
}

모든 모델 클래스에는 Mongoid가 모델을 유지하는 위치에 대한 정보를 조회 데 사용할 수 있는 다음 메서드가 포함되어 있습니다.

  • client_name: 클라이언트 이름을 조회합니다.

  • database_name: 데이터베이스 이름을 조회합니다.

  • collection_name: 컬렉션 이름을 조회합니다.

다음 예시 Band 클래스의 문서가 유지되는 클라이언트, 데이터베이스 및 컬렉션 의 이름을 조회 하고 출력하는 방법을 보여줍니다.

puts Band.client_name
puts Band.database_name
puts Band.collection_name
default
my_bands
bands

Mongoid는 지속성 구성을 사용자 지정할 수 있는 모델 수준 및 런타임 옵션을 모두 제공합니다. 다음 섹션에서는 이러한 옵션에 대해 설명합니다.

모델 클래스 이름의 복수형이 아닌 다른 이름을 사용하여 컬렉션 에 모델 문서를 저장 한다고 가정해 보겠습니다. store_in 매크로를 사용하여 Mongoid가 모델의 문서를 저장하는 컬렉션, 데이터베이스 또는 클라이언트 변경할 수 있습니다. 다음 예시 store_in 매크로를 사용하여 analytics라는 클라이언트 내의 other 데이터베이스 에 있는 citizens 컬렉션 에 Person 클래스의 문서를 저장 하는 방법을 보여 줍니다.

class Person
include Mongoid::Document
store_in collection: "citizens", database: "other", client: "analytics"
end

store_in 매크로는 Lambda 함수를 사용할 수도 있습니다. 이는 상수 문자열을 사용할 수 없는 값으로 지속성 컨텍스트를 정의하려는 경우에 유용합니다.

여러 사용자가 애플리케이션 에 대한 공통 액세스 주식 하는 멀티 테넌트 애플리케이션 에서 이 패턴 사용할 수 있습니다. Lambda를 사용하면 현재 스레드에 로컬인 정보를 기반으로 지속성 컨텍스트를 정의하여 사용자가 서로의 데이터에 액세스 할 수 없도록 할 수 있습니다.

다음 예시 스레드 로컬 변수에 의해 결정되는 데이터베이스 에 문서를 저장합니다.

class Band
include Mongoid::Document
store_in database: ->{ Thread.current[:database] }
end

모델 클래스 또는 인스턴스 에서 with 메서드를 사용하여 런타임 중에 작업 그룹 에 대한 모델의 지속성 구성을 변경할 수 있습니다.

모델 클래스 또는 인스턴스 에서 with 메서드를 호출하고 지속성 컨텍스트를 정의하는 옵션을 전달합니다. 두 가지 방법으로 with 메서드를 호출할 수 있습니다.

  • with(context, options): context 은(는) Mongoid::PersistenceContext 의 인스턴스 이고 options 는 사용자 지정 가능한 옵션 설정하다 를 나타내는 해시입니다.

  • with(options): options 은(는) 사용자 지정 가능한 옵션 설정하다 나타내는 해시입니다.

그런 다음 차단 사용하여 지정된 컨텍스트에서 실행하려는 작업을 정의합니다. 정의한 컨텍스트는 차단 의 코드가 실행되는 동안에만 존재합니다.

기본값 으로 Mongoid는 Band 클래스에 대한 문서를 bands 컬렉션 에 저장합니다. 다음 코드 예시 with 메서드를 사용하여 일시적으로 다른 클라이언트, 데이터베이스 및 컬렉션 사용하여 Band 클래스의 문서에 대한 작업을 수행합니다.

class Band
include Mongoid::Document
field :name, type: String
field :likes, type: Integer
end
# Creates document in 'bands' collection in 'music-non-stop' database within
# default cluster
Band.with(database: "music-non-stop") do |band_class|
band_class.create(name: "Medusa and the Polyps")
end
# Deletes all documents in 'artists' collection within default database
Band.with(collection: "artists") do |band_class|
band_class.delete_all
end
band = Band.new(name: "Japanese Breakfast")
# Perform operations on tertiary cluster
band.with(client: :tertiary) do |band_object|
band_object.save!
band.save!
end

참고

클라이언트 정의

앞의 예시 에서는 mongoid.yml 파일 의 clients 아래에 tertiary 클러스터 정의해야 합니다.

중요

차단 범위

차단 사용하여 with 메서드를 호출해야 합니다. 이는 Mongoid가 메서드에 전달한 옵션을 사용하여 배경 에서 새 클라이언트 생성하기 때문입니다. 차단 클라이언트를 닫고 리소스를 해제할 수 있도록 이 클라이언트 의 범위를 정의합니다.

읽기 또는 쓰기 (write) 작업을 위해 with 메서드 구성 옵션을 전달할 수도 있습니다. 구성은 지정된 작업 유형에만 적용 .

다음 예시 with 메서드를 사용하여 차단 내의 모든 읽기 작업에 세컨더리 노드 를 사용하도록 지정합니다.

Band.with(read: {mode: :secondary}) do
Band.count
# This write operation runs in the
# new persistence context, but is
# not affected by the read preference.
Band.create(name: "Metallica")
end

참고

컨텍스트의 일관성 보장

한 컨텍스트에서 작업을 수행할 때 Mongoid는 다른 컨텍스트에서 동일한 작업을 자동으로 수행하지 않습니다. 예시 들어 Band 모델 문서 artists 컬렉션 에 삽입하면 동일한 문서 bands 컬렉션 에 삽입되지 않습니다.

이 섹션의 이전 예제에서는 차단 범위에서만 지속성 컨텍스트를 변경했습니다. Mongoid를 사용하여 프로그램의 모든 작업에서 사용하는 사용자 지정 지속성 컨텍스트를 전역적으로 정의할 수 있습니다. 이렇게 하면 with 메서드를 반복적으로 호출하지 않고도 런타임에 모든 작업에 대한 지속성 컨텍스트를 변경할 수 있습니다.

다음 메서드를 사용하여 프로그램에서 지속성 컨텍스트를 전역으로 정의할 수 있습니다.

  • Mongoid.override_client: Mongoid가 지정된 클라이언트 에서 모든 작업을 수행합니다.

  • Mongoid.override_database: Mongoid가 지정된 데이터베이스 에서 모든 작업을 수행합니다.

다음 코드 예시 에서 애플리케이션 다양한 데이터베이스에 다양한 국가 및 언어 설정에 대한 정보를 저장합니다. 이 코드는 Mongoid.override_database 메서드를 사용하여 국가 및 언어 설정 설정에 따라 지속성 컨텍스트를 전역으로 설정하다 방법을 보여 줍니다.

class BandsController < ApplicationController
before_action :switch_database
after_action :reset_database
private
def switch_database
I18n.locale = params[:locale] || I18n.default_locale
Mongoid.override_database("my_db_name_#{I18n.locale}")
end
def reset_database
Mongoid.override_database(nil)
end
end

앞의 예시 에서 Mongoid는 국가 및 언어 설정 에 따라 결정된 대체 데이터베이스 에서 이 스레드에 대한 다른 모든 작업을 수행합니다. after_action 매크로는 재정의 옵션을 nil로 설정하므로 지속성 구성을 변경하지 않은 후속 요청은 기본값 구성을 사용합니다.

mongo_clientcollection 클래스 메서드를 사용하여 모델 또는 문서 인스턴스 의 클라이언트 또는 컬렉션 에 액세스 할 수 있습니다.

Band.mongo_client
band.mongo_client
Band.collection
band.collection

이러한 메서드를 사용할 때 런타임 지속성 옵션 섹션의 예제와 마찬가지로 메서드를 호출하여 런타임 지속성 옵션을 설정하다 수도 with 있습니다.

다음 코드 예시 Band 모델 클래스에서 사용하는 클라이언트 에 액세스합니다. 그런 다음 클라이언트 의 with 메서드를 사용하여 music 데이터베이스 에 쓰기 (write) w 쓰기 (write) 옵션을 0 로 설정하여 쓰기 (write) 확인이 필요하지 않습니다.

Band.mongo_client.with(write: { w: 0 }, database: "music") do |client|
client[:artists].find(...)
end

with 메서드를 사용하여 컬렉션 의 :read:write 옵션을 재정의할 수 있습니다. 다음 예시 with 메서드를 사용하여 w 쓰기 (write) 옵션을 0(으)로 설정하다 방법을 보여 줍니다.

Band.collection.with(write: { w: 0 }) do |collection|
collection[:artists].find(...)
end

이 가이드 에 언급된 메서드에 대한 자세한 내용은 다음 API 문서를 참조하세요.