Turbo Frame 모달 구현

Turbo Frame Modals. The Definitive Guide | by Andy Cohen | Medium

작성자
jeff
발행일
2025년 05월 26일

핵심 요약

  • 1 Turbo Frame 모달은 링크에 특정 `turbo-frame`을 지정하고 컨트롤러 액션에 모달 레이아웃을 적용하여 구현됩니다.
  • 2 폼 제출 성공 시에는 `turbo:frame-missing` 이벤트 리스너를 활용해 모달 프레임을 벗어나 전체 페이지를 업데이트합니다.
  • 3 이 방식은 Hotwire의 Turbo를 통해 최소한의 JavaScript로 동적 모달 기능을 효율적으로 제공합니다.

도입

웹 애플리케이션에서 사용자 경험을 향상시키기 위한 동적인 요소 중 하나는 모달(Modal) 창입니다. 이 문서는 Ruby on Rails 프레임워크와 함께 사용되는 Hotwire 스택의 핵심 구성 요소인 Turbo를 활용하여 모달을 구현하는 방법에 대해 설명합니다. 특히, Turbo Frame을 이용하여 모달 창을 생성하고 관리하며, 폼 제출 성공 시 모달 프레임을 벗어나 전체 페이지를 업데이트하는 효율적인 메커니즘을 중점적으로 다룹니다. 이는 전통적인 JavaScript 기반의 모달 구현 방식보다 서버 사이드 렌더링의 장점을 살리면서도 부드러운 사용자 인터페이스를 제공합니다.

Turbo Frame 모달을 구현하기 위한 핵심 요구사항은 두 가지입니다. 첫째, 모달로 렌더링하려는 액션에 대한 링크는 data: { turbo_frame: 'modal' } 속성을 사용하여 ‘modal’이라는 특정 turbo-frame을 대상으로 지정해야 합니다. 예를 들어, 새로운 작업을 생성하는 링크는 <%= link_to 'New Task', new_task_path, class: 'btn', data: { turbo_frame: 'modal' } %>와 같이 작성됩니다. 이 속성은 링크 클릭 시 해당 turbo-frame 내부에서만 콘텐츠가 로드되도록 Turbo에게 지시합니다.

둘째, 모달로 사용될 컨트롤러 액션은 render layout: 'modal'을 통해 ‘modal’ 레이아웃을 명시적으로 지정해야 합니다. TasksControllernew 액션이 좋은 예시입니다. def new; @task = Task.new; render layout: 'modal'; end와 같이 정의하여, 새로운 작업 생성 폼이 모달 레이아웃 내에서 렌더링되도록 합니다. 폼 제출 후 유효성 검사에 실패할 경우, render :new, status: :unprocessable_content, layout: 'modal'과 같이 다시 모달 레이아웃으로 에러를 렌더링하여 사용자에게 피드백을 제공합니다.

모달 내에서 폼 제출이 성공했을 때, 모달 프레임을 벗어나 전체 페이지를 업데이트하는 메커니즘은 프론트엔드의 이벤트 리스너를 통해 처리됩니다. turbo-rails는 기본적으로 turbo-frame 요청 시 레이아웃을 비어있는 자체 레이아웃으로 오버라이드합니다. 따라서 폼 제출 성공 후 리다이렉트가 발생하면, 애플리케이션 레이아웃에 포함된 빈 turbo-frame이 “누락”된 상태가 됩니다. 이때 document.addEventListener('turbo:frame-missing', (event) => { ... }); 이벤트 리스너가 작동합니다. 이 리스너는 event.target.id가 ‘modal’인 경우 event.preventDefault()를 호출하여 기본 동작을 막고, event.detail.visit(event.detail.response.url, { action: 'replace' })를 사용하여 전체 페이지를 방문하도록 지시합니다. action: 'replace' 옵션은 현재 페이지로 리다이렉트될 때 Turbo “새로고침”으로 처리하여 모핑(morphing) 및 스크롤 위치 보존을 가능하게 합니다. 이 방식은 서버에서 성공적인 리다이렉션을 처리하고, 클라이언트에서는 이벤트를 감지하여 전체 페이지 전환을 유도하는 우아한 해결책을 제공합니다.

결론

결론적으로, Turbo Frame을 활용한 모달 구현은 Hotwire의 철학을 잘 보여주는 예시입니다. 최소한의 JavaScript 코드로 복잡한 동적 인터페이스를 구현하며, 서버 사이드 렌더링의 강점을 유지합니다. 링크의 `data-turbo-frame` 속성과 컨트롤러의 특정 레이아웃 지정, 그리고 `turbo:frame-missing` 이벤트 리스너의 조합을 통해 모달의 생성부터 성공적인 폼 제출 후의 페이지 전환까지 매끄러운 사용자 경험을 제공합니다. 이는 Ruby on Rails 개발자들이 현대적인 웹 애플리케이션을 효율적으로 구축할 수 있도록 돕는 강력한 패턴입니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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