폼 오브젝트 입문

入門 FormObject / Shu Oogawara - Kaigi on Rails 2025

작성자
Kaigi on Rails
발행일
2025년 11월 25일

핵심 요약

  • 1 폼 오브젝트는 데이터베이스에 묶이지 않으며, 모델과 유사한 인터페이스로 고유한 라이프사이클 처리와 뷰 상태 유지가 가능한 Ruby 객체입니다.
  • 2 Rails Way의 '단일 모델 조작' 및 '단일 라이프사이클 패턴' 제약이 깨질 때 (0개 또는 2개 이상의 모델 조작, 여러 라이프사이클 패턴) 폼 오브젝트를 사용해야 합니다.
  • 3 현대 웹 애플리케이션의 복잡한 사용자 요구사항(원탭 복합 작업)으로 인해 폼 오브젝트의 활용이 필수적이며, Ruby 개발자라면 반드시 이해하고 다루어야 합니다.

도입

발표자는 폼 오브젝트의 모호한 사용과 설명의 어려움을 지적하며, 이 발표의 목표를 폼 오브젝트를 명확히 이해하고 올바르게 활용하는 데 두었습니다. 기존 자료들이 다양한 사용 사례를 제시하지만, 공통된 개념적 이해가 부족하여 개발자들이 '어렴풋이' 사용하게 되는 현실을 배경으로, 초보자부터 숙련자까지 모두가 폼 오브젝트를 제대로 이해할 수 있도록 돕고자 합니다.

폼 오브젝트의 특징

발표에서는 폼 오브젝트를 다음 네 가지 특징을 가진 Ruby 객체로 정의합니다.

  • 데이터베이스에 묶이지 않는 POJO (Plain Old Ruby Object): ActiveRecord::BaseApplicationRecord를 상속하지 않습니다.

  • 모델과 동일한 인터페이스: ActiveModel::Model 등을 포함하여 컨트롤러에서 모델처럼 new, save, 유효성 검사 등을 수행할 수 있습니다.

  • 고유한 라이프사이클 처리: 자체적인 유효성 검사(validation) 및 콜백(callback)을 가질 수 있습니다.

  • 뷰 상태 유지: 뷰의 상태를 보존할 수 있습니다. 이러한 특징들은 다른 레이어(애플리케이션 모델, 뷰 모델, 인터랙터, 서비스 오브젝트 등)와 폼 오브젝트를 차별화합니다.

폼 오브젝트의 사용 시점

폼 오브젝트는 Rails Way의 두 가지 핵심 제약이 더 이상 유효하지 않을 때 필요합니다.

  • Rails Way의 제약:
    1. 한 번에 정확히 하나의 모델만 조작합니다.
    2. 라이프사이클 처리(유효성 검사, 콜백) 패턴이 하나로 통일됩니다.
  • 폼 오브젝트가 필요한 3가지 패턴:
    1. 모델을 조작하지 않을 때 (0개): 예: 데이터베이스에 저장되지 않는 단순 이메일 전송 폼.
    2. 2개 이상의 모델을 조작할 때: 예: 회사, 사장, 직원을 한 화면에서 동시에 등록하는 경우.
    3. 모델의 라이프사이클 처리 패턴이 1가지 이상일 때: 예: 사용자 생성 시에는 스크린 네임 유효성 검사를 하지만, 편집 시에는 불필요하여 검사하지 않는 경우. 이 세 가지 상황은 사용자의 요구사항이 Rails Way의 가정을 벗어날 때 발생하며, 이때 폼 오브젝트가 문제 해결의 핵심 도구가 됩니다.

결론

현대 웹 애플리케이션 사용자들은 복잡한 작업을 '원탭'으로 처리하기를 원하며, 이는 하나의 액션으로 여러 모델을 조작하거나 모델의 라이프사이클을 유연하게 제어해야 하는 상황을 초래합니다. 스캐폴드로 해결되지 않는 복잡한 요구사항이 증가함에 따라 폼 오브젝트의 필요성은 더욱 커지고 있습니다. 폼 오브젝트는 초보자에게는 어렵지만, Rails로 작업하는 개발자라면 반드시 이해하고 능숙하게 다루어야 할 필수적인 개념입니다. 과거 논의가 활발했으나 현재는 '성숙한' 주제로 여겨지는 만큼, '어렴풋이' 사용하기보다는 선배 개발자들의 지혜를 바탕으로 올바르게 활용하는 자세가 중요합니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

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