Active Model Everywhere 개념
Rails 애플리케이션에서 데이터베이스 테이블에 직접 연결되지 않는 객체(예: 서비스 객체, PORO - Plain Old Ruby Object)에 Active Model 모듈을 포함하여 사용하는 접근 방식입니다. 이를 통해 시스템 내의 모든 객체가 일관된 API를 유지하며 상호작용할 수 있도록 합니다. 컨트롤러와 같은 상위 계층에서는 데이터베이스 기반 모델이든 아니든 동일한 형태의 객체처럼 다룰 수 있어 코드의 명확성과 일관성이 향상됩니다.
Active Model 활용의 이점
Active Model을 비-ActiveRecord 객체에 적용함으로써 다음과 같은 여러 이점을 얻을 수 있습니다.
-
일관된 API 제공: ActiveRecord 모델과 유사한 인터페이스를 구축하여 개발자들이 새로운 객체 유형에 대해 별도의 학습 없이 익숙한 방식으로 작업할 수 있게 합니다. 이는 애플리케이션 전반의 통일성을 높입니다.
- 강력하고 검증된 기능 활용: Rails의 핵심 기능인
attributes,validations,callbacks,dirty_checking,serializers등을 재구현할 필요 없이 바로 사용할 수 있습니다.- Attributes: 객체 초기화 및 속성 접근을 표준화하여 코드를 간결하게 만듭니다.
- Validations: 데이터 유효성 검사를 위한
presence: true,uniqueness등 ActiveRecord 모델에서 사용하는 모든 유효성 검사기를 비-ActiveRecord 객체에도 적용할 수 있습니다.
- 테스트 용이성: FactoryBot과 같은 기존 Rails 테스트 젬과의 통합이 자연스러워져, 가짜 데이터 설정 및 객체 테스트 코드 작성이 훨씬 간편해집니다.
실제 적용 사례: DefaultThemes 클래스
팟캐스트 진행자는 특정 레코드에 기본 연관 관계를 추가하는 DefaultThemes라는 클래스를 예시로 들었습니다.
-
이 클래스는 데이터베이스 테이블에 직접 매핑되지 않습니다.
-
하지만
save메서드와 Active Model의attributes,validations를 활용하여 Rails 컨트롤러에서 일반적인 ActiveRecord 모델처럼 다룰 수 있도록 구현되었습니다. -
DefaultThemes.save는 내부적으로 다른 ActiveRecord 모델을 호출하여 join 테이블을 통해 연관 관계를 생성하고 데이터베이스에 저장합니다. -
이러한 접근 방식은 데이터 지속성(persistence)의 내부 구현 방식을 추상화하여, 외부에서는 이 객체가 마치
RESTful리소스처럼 동작하는 것처럼 보이게 합니다. 이는 “데이터베이스에 저장되는 방식이 무엇이든 상관없이, 이 객체와 상호작용하는 방식은 일관된다”는 철학을 반영합니다.
Rails의 모듈성 이해
Rails는 흔히 모놀리식 프레임워크로 인식되지만, 실제로는 Active Support, Active Model, ActiveRecord 등 여러 독립적인 모듈의 집합체입니다.
-
개발자는 필요에 따라 이러한 모듈들을 개별적으로 선택하여 Rails 애플리케이션 외부나 비-표준 Rails 객체에 활용할 수 있습니다.
-
이는 Rails의 특정 부분을 활용하여 “Ruby + Active Support”, “Ruby + Active Model”과 같은 형태로 애플리케이션을 유연하게 구성할 수 있음을 의미합니다.
-
각 모듈의 역할을 이해하는 것은 Rails의 “마법” 뒤에 숨겨진 구조를 파악하고, 프레임워크를 더욱 효과적으로 활용하는 데 중요합니다.