본 발표는 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같은 테스트 도구와의 통합 방안도 제시되어, 실용적인 활용성을 높였습니다.