폼 오브젝트의 특징
발표에서는 폼 오브젝트를 다음 네 가지 특징을 가진 Ruby 객체로 정의합니다.
-
데이터베이스에 묶이지 않는 POJO (Plain Old Ruby Object):
ActiveRecord::Base나ApplicationRecord를 상속하지 않습니다. -
모델과 동일한 인터페이스:
ActiveModel::Model등을 포함하여 컨트롤러에서 모델처럼new,save, 유효성 검사 등을 수행할 수 있습니다. -
고유한 라이프사이클 처리: 자체적인 유효성 검사(validation) 및 콜백(callback)을 가질 수 있습니다.
-
뷰 상태 유지: 뷰의 상태를 보존할 수 있습니다. 이러한 특징들은 다른 레이어(애플리케이션 모델, 뷰 모델, 인터랙터, 서비스 오브젝트 등)와 폼 오브젝트를 차별화합니다.
폼 오브젝트의 사용 시점
폼 오브젝트는 Rails Way의 두 가지 핵심 제약이 더 이상 유효하지 않을 때 필요합니다.
- Rails Way의 제약:
- 한 번에 정확히 하나의 모델만 조작합니다.
- 라이프사이클 처리(유효성 검사, 콜백) 패턴이 하나로 통일됩니다.
- 폼 오브젝트가 필요한 3가지 패턴:
- 모델을 조작하지 않을 때 (0개): 예: 데이터베이스에 저장되지 않는 단순 이메일 전송 폼.
- 2개 이상의 모델을 조작할 때: 예: 회사, 사장, 직원을 한 화면에서 동시에 등록하는 경우.
- 모델의 라이프사이클 처리 패턴이 1가지 이상일 때: 예: 사용자 생성 시에는 스크린 네임 유효성 검사를 하지만, 편집 시에는 불필요하여 검사하지 않는 경우. 이 세 가지 상황은 사용자의 요구사항이 Rails Way의 가정을 벗어날 때 발생하며, 이때 폼 오브젝트가 문제 해결의 핵심 도구가 됩니다.