Docs Menu

문서 유효성 검사

이 가이드 에서는 Mongoid 모델에서 유효성 검사 규칙을 정의하는 방법을 학습 수 있습니다. 모델에 유효성 검사 구현 후에는 Mongoid가 유효성 검사 규칙을 위반하는 쓰기 (write) 작업을 실행 하지 못하도록 합니다. 문서 유효성 검사 사용하여 컬렉션에 있는 문서 필드의 데이터 유형과 값 범위를 제한합니다.

Mongoid에는 Active Record의 ActiveModel::Validations 가 포함되어 있어 관련 유효성 검사기 및 고유성 유효성 검사기를 포함한 유효성 검사 기능을 제공합니다. 자세한 학습 은액티브 레코드 유효성 검사 Rails 가이드 및 ActiveModel::Validations Rails API 설명서를 참조하세요.

참고

Mongoid와 MongoDB 유효성 검사 비교

Mongoid의 유효성 검사는 애플리케이션 의 컨텍스트에만 적용되며 MongoDB 에서 스키마 유효성 검사 규칙을 생성하는 것과는 다릅니다. 즉, 애플리케이션 외부에서 수행되는 쓰기 (write) 작업에는 유효성 검사 규칙이 적용 않습니다. MongoDB 스키마 유효성 검사 에 대해 자세히 학습 서버 매뉴얼에서 스키마 유효성 검사 참조하세요.

Mongoid는 모델 클래스를 정의할 때 사용할 수 있는 Active Record 유효성 검사 검사 헬퍼를 지원합니다. 이러한 헬퍼를 사용하여 필드 있는지 확인하거나, 필드 값을 지정된 값과 비교하거나, 필드 에 고유한 값이 있는지 확인하는 등 애플리케이션 에서 일반적인 유효성 검사 규칙을 설정하다 수 있습니다.

validates 매크로를 사용하여 유효성 검사 규칙을 만든 다음 유효성 검사 헬퍼와 규칙에 필요한 사양을 포함합니다.

각 유효성 검사 헬퍼는 하나 이상의 필드 이름을 허용하므로 여러 필드에 대해 동일한 규칙을 정의할 수 있습니다.

다음 코드는 presence 유효성 검사 헬퍼를 사용하여 Person 인스턴스에 name 필드 값이 포함되도록 요구하는 방법을 보여 줍니다.

class Person
include Mongoid::Document
field :name, type: String
validates :name, presence: true
end

가이드 의 일반적인 유효성 검사 섹션에서 다른 유용한 유효성 검사 헬퍼에 대해 학습 수 있습니다.

이 섹션에서는 다음과 같은 일반적인 유효성 검사 규칙에 대해 학습 유효성 검사 헬퍼를 사용하는 예제를 볼 수 있습니다.

comparison 헬퍼를 사용하여 지정된 필드 값을 기반으로 문서 유효성을 검사할 수 있습니다.

comparison 헬퍼는 다음 옵션을 지원합니다.

  • greater_than: 값은 제공된 값보다 커야 합니다.

  • greater_than_or_equal_to: 값은 제공된 값보다 크거나 같아야 합니다.

  • equal_to: 값은 제공된 값과 같아야 합니다.

  • less_than: 값은 제공된 값보다 작아야 합니다.

  • less_than_or_equal_to: 값은 제공된 값보다 작거나 같아야 합니다.

  • other_than: 값은 제공된 값과 달라야 합니다.

이 예시 Order 모델에 대해 다음과 같은 비교 유효성 검사 규칙을 정의합니다.

  • delivery_date: 다음 값 이후(보다 큰)여야 합니다. order_date

  • quantity: 다음보다 작아야 합니다. 5

class Order
include Mongoid::Document
field :order_date, type: DateTime
field :delivery_date, type: DateTime
field :quantity, type: Integer
validates :delivery_date, comparison: { greater_than: :order_date }
validates :quantity, comparison: { less_than: 5 }
end

format 헬퍼를 사용하여 필드 값이 정규 표현식 과 일치하는지 여부에 따라 문서 유효성을 검사할 수 있습니다. with 옵션을 사용하여 정규 표현식 지정합니다.

이 예시 User 모델에 대한 형식 유효성 검사 규칙을 정의하여 username 필드 에 문자만 포함되도록 합니다.

class User
include Mongoid::Document
field :username, type: String
validates :username, format: { with: /\A[a-zA-Z]+\z/ }
end

대체 헬퍼 메서드

Mongoid::Document 모듈은 특정 유효성 검사를 위한 매크로 메서드를 제공합니다. validates 매크로 성명서 에서 format 유효성 검사 헬퍼를 사용하는 대신 다음 코드에 표시된 대로 validates_format_of 메서드를 사용할 수 있습니다.

validates_format_of :username, with: /\A[a-zA-Z]+\z/

inclusionexclusion 헬퍼를 사용하여 필드 값이 지정된 값 목록에 있는지 여부에 따라 문서 유효성을 검사할 수 있습니다. in 옵션을 사용하여 값 목록을 지정합니다.

이 예시 shipping 필드 값이 허용되는 값 중 하나인지 확인하기 위해 Order 모델에 포함 유효성 유효성 검사 규칙을 정의합니다.

class Order
include Mongoid::Document
field :shipping, type: String
validates :shipping, inclusion: { in: %w(standard priority overnight) }
end

presenceabsence 헬퍼를 사용하여 필드 값이 있는지 여부(비어 있음)에 따라 문서 유효성을 검사할 수 있습니다.

이 예시 Order 모델에 대한 부재 유효성 검사 규칙을 정의하여 delivery_date 필드 값이 nil 또는 빈 문자열이 되도록 합니다.

class Order
include Mongoid::Document
field :delivery_date, type: String
validates :delivery_date, absence: true
end

대체 헬퍼 메서드

Mongoid::Document 모듈은 특정 유효성 검사를 위한 매크로 메서드를 제공합니다. validates 매크로 성명서 에서 presence 유효성 검사 헬퍼를 사용하는 대신 다음 코드에 표시된 대로 validates_presence_of 메서드를 사용할 수 있습니다.

validates_presence_of :delivery_date

필드 값이 컬렉션 의 다른 값과 고유한지 여부에 따라 uniqueness 헬퍼를 사용하여 문서 유효성을 검사할 수 있습니다. scope 옵션을 사용하여 Mongoid가 고유성 검사를 제한하는 데 사용하는 필드 이름을 하나 이상 지정할 수 있습니다.

이 예시 first_name 필드 값이 동일한 last_name 값을 가진 문서 내에서 고유하도록 Person 모델에 대한 고유성 유효성 유효성 검사 규칙을 정의합니다.

class Person
include Mongoid::Document
field :first_name, type: String
field :last_name, type: String
validates :first_name, uniqueness: { scope: :last_name }
end

대체 헬퍼 메서드

Mongoid::Document 모듈은 특정 유효성 검사를 위한 매크로 메서드를 제공합니다. validates 매크로 성명서 에서 uniqueness 유효성 검사 헬퍼를 사용하는 대신 다음 코드에 표시된 대로 validates_uniqueness_of 메서드를 사용할 수 있습니다.

validates_uniqueness_of :first_name

Mongoid는 모델에서 validates_uniqueness_of 메서드를 사용할 때 primary 읽기 설정 (read preference) 사용하는데, 이는 복제본 세트 의 세컨더리 멤버를 쿼리하면 오래된 데이터를 읽을 수 있기 때문입니다.

이 메서드는 Mongoid가 고유성을 확인할 때 추가할 조건을 지정할 수 있는 conditions 옵션을 사용합니다.

validates_uniqueness_of :name, conditions: -> { where(:age.gte => 10) }

validates_associated 헬퍼를 사용하여 모델에 있는 모든 연결의 유효성을 검사할 수 있습니다. 이 유효성 검사 규칙을 포함하면 Mongoid는 인스턴스 를 저장하려고 할 때마다 모든 연관 문서의 유효성을 검사합니다. 연결에 대해 자세히 학습 연결 가이드 참조하세요.

이 예시 포함된 Book 인스턴스에 대한 유효성 검사 검사 규칙을 실행 위해 Author 모델에 대한 연결 유효성 유효성 검사 규칙을 정의합니다.

class Author
include Mongoid::Document
embeds_many :books
validates_associated :books
end

중요

연관 관계의 양쪽 끝에 validates_associated 헬퍼를 사용하면 Mongoid가 무한 루프에서 유효성 검사를 수행하므로 사용하지 마세요.

validates_eachvalidates_with 헬퍼를 사용하여 사용자 지정 유효성 검사기를 만들 수 있습니다. 이러한 헬퍼에 대해 자세히 학습 예제를 보려면 액티브 레코드 문서에서 validates_eachvalidates_with 참조를 참조하세요.

사용자 지정 유효성 검사기에 대해 자세히 학습 액티브 레코드 문서에서 사용자 지정 유효성 검사 수행하기를 참조하세요.

Mongoid는 문서 를 데이터베이스 에 유지하거나 저장할 때 유효성 검사 수행합니다. 다음 메서드는 유효성 검사 규칙을 트리거하다 Mongoid는 유효성 검사 통과한 경우에만 객체 데이터베이스 에 저장합니다.

  • create

  • save

  • update

앞의 메서드의 !접미사가 있는 버전을 사용할 때, 객체 에 대한 유효성 검사 실패하면 Mongoid는 Mongoid::Errors::Validations 예외를 반환합니다.

valid? 메서드를 사용하여 유효성 검사를 수동으로 실행 수 있습니다. 이 메서드는 객체 유효성 검사 통과하면 true 를 반환하고, 그렇지 않으면 false 를 반환합니다.

class Person
include Mongoid::Document
field :name, type: String
field :age, type: Integer
validates :age, comparison: { greater_than_or_equal_to: 0 }
end
# Returns true
Person.new(name: "Berta Odom", age: 4).valid?
# Returns false
Person.new(name: "Cody Peng", age: -5).valid?

Mongoid는 영구 데이터에서 valid? 를 실행 때 Active Record와 다르게 동작합니다. Active Record의 valid? 는 모든 유효성 검사를 실행하지만 Mongoid의 valid? 는 성능을 최적화하기 위해 메모리에 있는 문서에 대해서만 유효성 검사를 실행합니다.

Mongoid 모델에서 사용할 수 있는 필드 유형에 대해 자세히 학습 필드 유형 가이드 참조하세요.

Mongoid의 유효성 검사 메서드 및 매크로에 대해 자세히 학습 API 문서에서 Mongoid::Validatable 모듈 참조를 참조하세요.

Active Record의 유효성 검사 헬퍼 전체 목록을 보려면 Rails API 문서에서 ActiveModel::Validations::HelperMethods 참조를 확인하세요.