지속성 구성
이 페이지의 내용
개요
이 가이드 에서는 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 를 호출하여 모델 클래스에 대한 새 복수화 규칙을 만들 수 있습니다. 인스턴스 메서드를 사용하고 클래스 이름의 단수형과 복수형을 전달합니다. 다음 예시 reyes
을 rey
의 복수형으로 지정합니다.
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_client
및 collection
클래스 메서드를 사용하여 모델 또는 문서 인스턴스 의 클라이언트 또는 컬렉션 에 액세스 할 수 있습니다.
Band.mongo_client band.mongo_client Band.collection band.collection
이러한 메서드를 사용할 때 런타임 지속성 옵션 섹션의 예제와 마찬가지로 메서드를 호출하여 런타임 지속성 옵션을 설정하다 수도 with
있습니다.
mongo_client.with
다음 코드 예시 Band
모델 클래스에서 사용하는 클라이언트 에 액세스합니다. 그런 다음 클라이언트 의 with
메서드를 사용하여 music
데이터베이스 에 쓰기 (write) w
쓰기 (write) 옵션을 0
로 설정하여 쓰기 (write) 확인이 필요하지 않습니다.
Band.mongo_client.with(write: { w: 0 }, database: "music") do |client| client[:artists].find(...) end
collection.with
with
메서드를 사용하여 컬렉션 의 :read
및 :write
옵션을 재정의할 수 있습니다. 다음 예시 with
메서드를 사용하여 w
쓰기 (write) 옵션을 0
(으)로 설정하다 방법을 보여 줍니다.
Band.collection.with(write: { w: 0 }) do |collection| collection[:artists].find(...) end
API 문서
이 가이드 에 언급된 메서드에 대한 자세한 내용은 다음 API 문서를 참조하세요.