Rails 유효성 검사, Active Record 없이 활용하기

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

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

핵심 요약

  • 1 Active Record 모델이 아닌 일반 해시나 커스텀 객체에 Rails의 강력한 유효성 검사 기능을 적용하는 혁신적인 방법을 제시합니다.
  • 2 `Wrapper` 클래스와 `ActiveModel::Validations` 모듈을 통합하여 Rails의 유효성 검사 콜백 시스템을 활용하고, `if`/`unless` 조건부 검사를 지원합니다.
  • 3 데이터 구조의 형태나 중첩 여부에 관계없이 유연하게 유효성 검사를 수행하며, 기존 Rails 유효성 검사기의 재사용성을 극대화합니다.

도입

발표자는 10년 이상 Rails 개발 경험을 바탕으로, Rails 유효성 검사 라이브러리를 비전통적인 환경에서 활용하는 방안을 탐구합니다. 특히 Active Record 모델을 사용하지 않는 이벤트 기반 아키텍처에서, 해시나 값 객체 형태의 이벤트 데이터에 대해 단일 클래스로 유효성 검사를 수행해야 하는 문제에 직면했습니다. 기존 Rails 유효성 검사기를 재사용함으로써 유지보수 및 문서화 비용을 절감하고, 불필요한 재발명을 피하고자 하는 배경을 설명합니다.

본 발표는 Rails 유효성 검사기를 Active Record 모델이 아닌 모든 종류의 입력(예: 해시, 커스텀 객체)에 적용할 수 있는 유연한 검사기 클래스를 개발하는 것을 목표로 합니다. 이는 몽키 패치나 타입 강제 변환 없이 독립적인 인스턴스 상태를 유지하며, 데이터 구조에 구애받지 않는 솔루션을 지향합니다.

Rails 유효성 검사기 통합 방법론

  • Wrapper 클래스 활용: 해시와 같은 비Active Record 객체에 Rails 유효성 검사기를 적용하기 위해 Wrapper라는 익명 클래스를 도입했습니다. Wrappererrors, 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 같은 테스트 도구와의 통합 방안도 제시되어, 실용적인 활용성을 높였습니다.

결론

본 발표는 Rails의 유효성 검사 기능을 Active Record에 묶이지 않고 독립적인 컨텍스트에서 활용하는 강력한 패턴을 성공적으로 시연했습니다. `Wrapper` 클래스, `ActiveModel::Validations` 모듈, 그리고 `method_missing`을 활용한 접근 방식은 기존 Rails 유효성 검사 로직을 재사용하면서도 유연성과 확장성을 제공합니다. 이는 특히 이벤트 기반 시스템이나 커스텀 데이터 접근 계층을 사용하는 환경에서 불필요한 코드 중복을 줄이고 개발 효율성을 높이는 데 크게 기여할 수 있습니다. 이 솔루션은 Rails의 "convention over configuration" 철학을 유지하면서도 특정 요구사항에 맞춰 프레임워크를 유연하게 활용하는 모범 사례를 제시합니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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