Hotwire와 Rails를 활용한 인터랙티브 다단계 폼 구축: 최상의 사용자 경험을 위한 기술적 접근

The Hotwire-Rails summit, or interactive multi-step forms at peak UX—Martian Chronicles, Evil Martians’ team blog

작성자
발행일
2025년 06월 24일

핵심 요약

  • 1 Evil Martians는 Ruby on Rails 및 Hotwire를 사용하여 복잡한 다단계 폼을 성공적으로 구현했습니다.
  • 2 DOM 모핑, 중첩 폼 처리, 뷰 전환 애니메이션 등 고급 Hotwire 기술을 활용하여 SPA에 필적하는 사용자 경험을 제공했습니다.
  • 3 이 프로젝트는 Rails의 HTML-first 접근 방식이 복잡한 인터페이스 구축에도 충분히 강력함을 입증했습니다.

도입

SumIt의 재무 관리 애플리케이션에 고도로 맞춤화되고 인터랙티브한 '맞춤 보고서' 기능 개발 요청이 들어왔을 때, 초기에는 React와 같은 단일 페이지 애플리케이션(SPA) 프레임워크의 도입을 고려했습니다. 그러나 기존의 Ruby on Rails 및 Hotwire 기반의 HTML-first 아키텍처를 최대한 활용하고, 서버 중심의 상태 관리 철학을 유지함으로써 복잡성을 최소화하기 위해 Hotwire를 통한 구현을 최종 결정했습니다. 본 문서는 이러한 도전적인 요구사항을 Hotwire와 Rails의 한계를 뛰어넘어 만족시키기 위한 구체적인 기술적 접근 방식과 팁을 공유합니다.

다단계 폼 모델링

다단계 폼 구현을 위해 별도의 ‘마법사’ 관련 Gem을 사용하지 않고, Rails의 기본 개념에 충실했습니다. 핵심은 단일 폼 객체를 사용하여 전체 UI 마법사 로직을 캡슐화하고, 상태 머신과 유사한 추상화를 통해 흐름을 정의하는 것입니다. 컨트롤러 액션은 Active Record 모델에 대한 일반적인 작업과 유사하게 설계되어, 향후 폼 구조가 변경되더라도 백엔드 코드의 유연성을 확보할 수 있도록 했습니다. 이는 서버와 클라이언트 간의 인터페이스를 단순화하고 유지보수성을 높이는 데 기여했습니다.

DOM 모핑을 통한 부드러운 UI 업데이트

사용자 인터랙션 시 실시간 미리보기를 제공하기 위해 Turbo Streams의 method: "morph"를 활용한 DOM 모핑을 도입했습니다. 이는 전체 HTML을 교체하는 대신 변경된 부분만 효율적으로 업데이트하여 UI 지연을 줄이고 부드러운 사용자 경험을 제공합니다. 특히, data-turbo-morph-permanent-attrs와 같은 커스텀 속성을 도입하여 모핑 과정에서 특정 HTML 속성(예: data-accordion-open-value)의 상태가 유지되도록 처리했으며, 많은 서드파티 Stimulus 컨트롤러가 모핑에 최적화되어 있지 않다는 점을 인지하고 필요한 경우 수정 및 기여(PR 제출)를 통해 개선했습니다. AG Grid와 같은 JavaScript 기반 컴포넌트는 Stimulus values와 변경 콜백을 활용하여 그리드 인스턴스를 재사용하면서 서버로부터 전달된 데이터로 업데이트함으로써 성능을 최적화했습니다.

중첩 폼 처리 전략

웹 표준상 중첩된 <form> 태그가 허용되지 않는 문제를 해결하기 위해, 단일 폼 내에서 여러 ‘미니 폼’의 제출을 처리하는 독창적인 방법을 사용했습니다. Rails의 폼 객체에 new_interval_type과 같은 ‘활성화’ 속성을 두어, 특정 버튼이 클릭될 때만 해당 필드가 서버로 제출되도록 했습니다. 이는 버튼의 namevalue 속성을 활용하는 HTML의 기본 동작을 영리하게 이용한 것입니다. 이 접근 방식은 fetch()를 통한 프로그래밍 방식의 제출이나 별도의 컨트롤러 액션을 만드는 복잡성을 피하고, Rails의 폼 객체 유연성을 극대화하여 코드를 간결하게 유지할 수 있었습니다.

View Transitions를 활용한 시각적 개선

사용자 경험을 더욱 향상시키기 위해 turbo-view-transitions 라이브러리와 브라우저의 View Transition API를 사용하여 마법사 단계 간의 부드러운 슬라이딩 애니메이션을 구현했습니다. 특히, ‘다음’ 또는 ‘이전’ 버튼 클릭에 따라 다른 전환 이름(wizard-back, wizard)을 동적으로 적용하여 방향성 있는 애니메이션을 구현했습니다. 이는 폼 제출 이벤트(handleSubmit)에서 event.submitter 속성을 활용하여 어떤 버튼이 폼을 제출했는지 감지하고, 이에 따라 HTML 요소의 data-turbo-stream-transition 속성을 업데이트하는 방식으로 이루어졌습니다. 이로써 사용자에게 시각적으로 명확하고 매끄러운 전환 경험을 제공할 수 있었습니다.

결론

이 프로젝트를 통해 Ruby on Rails와 Hotwire 기반의 HTML-first 접근 방식이 복잡하고 인터랙티브한 사용자 인터페이스를 구축하는 데 충분히 강력하다는 것을 입증했습니다. 초기에는 기술 스택 선택에 대한 회의적인 시각도 있었으나, Hotwire 및 HTML의 제약 조건 내에서 작업함으로써 클라이언트-서버 통신에 대한 깊은 이해를 바탕으로 모든 빌딩 로직을 단일 HTML 폼 내에 효과적으로 통합할 수 있었습니다. 이러한 설계는 백엔드 코드를 거의 변경하지 않고도 미래에 React나 Inertia와 같은 다른 프레임워크로 전환할 수 있는 유연성을 제공합니다. 궁극적으로 이 경험은 Ruby on Rails가 다양한 UI 개발 옵션을 제공하며, 개발자가 필요에 따라 스택을 유연하게 전환할 수 있는 강력하고 적응력 있는 플랫폼임을 다시 한번 확인시켜 주었습니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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