Rails 유효성 검사 라이브러리를 활용한 유연한 데이터 유효성 검증

RailsConf 2025 Off the Rails: Validating non-model classes with…ActiveModel? by Andy Andrea

작성자
Ruby Central
발행일
2025년 07월 24일

핵심 요약

  • 1 Active Record 모델에 의존하지 않고 Rails 유효성 검사 라이브러리를 임의의 Ruby 객체(특히 해시)에 적용하는 방법을 설명합니다.
  • 2 기존 Rails 유효성 검사기의 기능을 활용하면서, 해시와 같은 비모델 객체에서 발생하는 메서드 부재 문제 해결 과정을 제시합니다.
  • 3 ActiveModel::Validations 모듈과 래퍼 클래스, method_missing 활용을 통해 유연하고 재사용 가능한 유효성 검사 솔루션을 구현하는 실용적인 접근법을 다룹니다.

도입

발표자는 10년 이상 Rails 개발 경험을 바탕으로, Active Record 모델 없이 해시 기반의 이벤트 데이터를 다루는 이벤트 소스드 애플리케이션에서 유효성 검사의 필요성을 강조합니다. 모든 이벤트 타입마다 새 클래스를 만드는 비효율성을 피하고, Rails 내장 유효성 검사기의 강력함을 활용하고자 했습니다. 목표는 몽키 패치나 타입 변환 없이, 독립적 상태를 가지며 데이터 형태에 구애받지 않고 해시 등 임의 객체에 Rails 유효성 검사기를 적용할 수 있는 유연한 클래스를 개발하는 것입니다.

핵심 문제점과 해결 과정: PresenceValidator를 해시에 적용했을 때, 해시에 errors, read_attribute_for_validation, model_name 등 Active Record 관련 메서드 부재로 오류가 발생했습니다. 이를 극복하기 위해, 필요한 메서드를 정의하는 익명 래퍼 클래스를 만들고, Rails의 ActiveModel::NamingActiveModel::Translation 모듈을 활용하여 문제를 해결했습니다.

유효성 검사 옵션 및 조건부 로직 지원: allow_nil 같은 옵션과 if/unless 조건부 유효성 검사를 지원하기 위해, 유효성 검사기의 상위 메서드를 호출하도록 변경하고, 래퍼 클래스에 ActiveModel::Validations 모듈을 포함시켜 Rails 유효성 검사 기능을 온전히 활용할 수 있도록 했습니다. 유효성 검사 클래스는 Active Record 모델과 유사하게 클래스 및 인스턴스 메서드를 래퍼에 위임하도록 설계되었습니다.

동적 속성 접근 및 데이터 변경 처리: if other_attribute와 같이 종속적인 유효성 검사는 해시 키를 메서드처럼 호출해야 하는 문제를 야기했습니다. 초기 SimpleDelegator 방식은 원본 해시 변경 시 동기화 문제를 발생시켰고, 이를 해결하기 위해 method_missing을 사용하여 래퍼가 해시의 키를 동적으로 메서드처럼 호출하도록 구현하여 데이터 변경에 유연하게 대응했습니다.

확장성 및 추가 고려 사항: 발표자는 키 부재 시 처리, 다른 클래스 유효성 검사 지원, validate 메서드 이름 충돌 해결, 사용자 정의 유효성 검사기 지원, 특정 유효성 검사기(ConfirmationValidator) 처리, 그리고 shoulda-matchers 통합 등 개발된 유효성 검사 클래스의 범용성과 견고성을 높이는 다양한 추가 개선 사항을 제시했습니다.

결론

본 발표에서 제시된 Rails 유효성 검사 클래스는 Active Record에 얽매이지 않고 해시 등 임의의 Ruby 객체에 강력한 Rails 유효성 검사 기능을 적용할 수 있는 실용적이고 영리한 해결책입니다. 이는 특히 이벤트 소스드 아키텍처와 같이 전통적인 ORM 모델이 없는 환경에서 데이터 무결성을 보장하고 개발 효율성을 높이는 데 크게 기여할 것입니다. 기존 Rails 기능을 재활용하여 새로운 유효성 검사 프레임워크 구축 대신, 효율적인 대안을 제시했습니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!