본 발표는 Rails 유효성 검사기를 Active Record 모델이 아닌 모든 종류의 입력(예: 해시, 커스텀 객체)에 적용할 수 있는 유연한 검사기 클래스를 개발하는 것을 목표로 합니다. 이는 몽키 패치나 타입 강제 변환 없이 독립적인 인스턴스 상태를 유지하며, 데이터 구조에 구애받지 않는 솔루션을 지향합니다.
Rails 유효성 검사기 통합 방법론
Wrapper
클래스 활용: 해시와 같은 비Active Record 객체에 Rails 유효성 검사기를 적용하기 위해Wrapper
라는 익명 클래스를 도입했습니다.Wrapper
는errors
,read_attribute_for_validation
메서드를 정의하고,ActiveModel::Naming
,ActiveModel::Translation
모듈을 포함하여 Rails 유효성 검사기가 필요로 하는 기본 인터페이스를 제공합니다.ActiveModel::Validations
모듈 통합:Wrapper
클래스에ActiveModel::Validations
모듈을 포함시켜,allow_nil
과 같은 옵션 및if
/unless
조건부 유효성 검사 기능을 Rails의 콜백 시스템을 통해 완벽하게 지원합니다.- 동적 데이터 접근 및 변경 대응:
if attribute_name
과 같이 해시의 키를 메서드처럼 호출하는 조건부 검사 시 발생하는NoMethodError
를 해결하기 위해method_missing
을 활용했습니다. 이를 통해 호출된 메서드 이름이 해시의 키인 경우 해당 값을 반환하도록 구현, 원본 해시의 동적인 변경을 정확히 반영하고 유연한 데이터 접근을 가능하게 합니다.
확장성과 추가 기능
- 다양한 입력 타입 지원: 해시뿐만 아니라 Active Record 모델, 외부 Gem의 클래스 등 어떠한 객체도 유효성 검사 대상으로 사용할 수 있도록 확장 가능합니다.
- 커스텀 유효성 검사기 호환성:
ActiveModel::Validations
모듈 통합으로 사용자가 정의한 커스텀 유효성 검사기도 별도 수정 없이 작동합니다. - 특정 유효성 검사기 및 테스트 도구 지원:
ConfirmationValidator
와 같은 특수 검사기나Shoulda Matchers
같은 테스트 도구와의 통합 방안도 제시되어, 실용적인 활용성을 높였습니다.