Turbo Frame 외부 UI 업데이트: Rails 백엔드 기반 솔루션

How to elegantly update other UI when a Turbo Frame is updated | Radan Skorić's website

작성자
Ruby Weekly
발행일
2025년 10월 01일

핵심 요약

  • 1 Turbo Frame 외부 UI(extraframe content)를 백엔드에서 효율적으로 업데이트하는 기법을 소개합니다.
  • 2 `turbo_aware_content_for` 헬퍼를 활용하여 일반 요청과 Turbo Frame 요청 시 사이드바 렌더링을 분기 처리합니다.
  • 3 Turbo Stream의 `morph` 기능을 통해 외부 UI를 부드럽게 교체하고 스크롤 위치를 유지하여 사용자 경험을 향상시킵니다.

도입

Turbo Frames는 UI의 특정 부분을 서버와의 상호작용을 통해 업데이트하는 데 매우 효과적입니다. 그러나 때로는 프레임 외부에 위치하지만 논리적으로 프레임 내용과 관련된 메뉴, 카운터, 제목 등 'extraframe content'도 함께 업데이트해야 하는 경우가 발생합니다. 이 글은 이러한 요구사항을 JavaScript 없이 순수 백엔드인 Rails에서 처리하는 간단하면서도 강력한 기법을 제시합니다.

문제점

기존 Turbo Frame은 내부 콘텐츠만 업데이트하므로, 사이드바 하이라이트와 같은 외부 UI 요소는 자동으로 변경되지 않습니다. 이를 해결하기 위해 프론트엔드 솔루션(예: Stimulus)을 사용할 수 있지만, 이 글에서는 모든 로직을 백엔드에서 처리하는 방법을 제안합니다.

해결책의 핵심 아이디어

전체 페이지 로드 시에는 사이드바 콘텐츠를 일반적인 위치에 렌더링하고, Turbo Frame 요청 시에는 프레임 내에서 렌더링된 Turbo Stream을 사용하여 사이드바를 업데이트하는 방식입니다.

구현 세부사항

  1. 레이아웃 (application.html.erb): 사이드바를 위한 렌더링 슬롯을 정의합니다. ```html
    <%= yield %>

    ```

  2. 챕터 페이지 뷰 (chapters/show.html.erb): turbo_frame_tag 내부에 사이드바와 챕터 내용을 모두 렌더링합니다. ```erb <%= turbo_frame_tag :chapter_content do %> <%= render ‘sidebar’, chapters: @chapters, chapter: @chapter %>
    ...

    <% end %> ```

  3. 사이드바 부분 뷰 (_sidebar.html.erb): turbo_aware_content_for 헬퍼를 사용하여 현재 챕터가 강조되도록 렌더링합니다. ```erb <%= turbo_aware_content_for :sidebar do %>

    <% end %> ```

  4. turbo_aware_content_for 헬퍼: turbo_frame_request?일 경우, turbo_stream.replace(name, method: :morph, &block)를 사용하여 name에 해당하는 HTML 요소를 새로운 내용으로 교체합니다. morph 옵션은 부드러운 업데이트와 스크롤 위치 유지를 가능하게 합니다. 일반 요청일 경우, content_for(name, &block)를 사용하여 사이드바 슬롯에 콘텐츠를 삽입합니다.

중요 기술적 고려사항

  • 사이드바는 Turbo Frame 내에서 렌더링되어야 Turbo Stream이 정상적으로 작동합니다.

  • 헬퍼는 id가 일치하는 최상위 요소(예: <nav id="sidebar">)가 존재한다고 가정합니다.

이 접근 방식의 장점

이 기법은 외부 UI 변경 시 서버 사이드 렌더링 로직만 수정하면 되므로, 확장성이 뛰어납니다. 예를 들어, 사이드바에 부제목 목록을 추가하는 경우, 프론트엔드 솔루션에서는 복잡한 변경이 필요하지만, 이 방식에서는 사이드바 부분 뷰만 업데이트하면 모든 것이 자동으로 작동합니다. 또한, 전체 페이지 Turbo Morph와 달리, 페이지 간 이동 시에도 스크롤 위치를 보존하며, 콘텐츠는 교체하고 사이드바는 morph하는 ‘정보에 기반한’ 업데이트를 제공하여 성능과 사용자 경험을 최적화합니다.

결론

이 백엔드 중심의 접근 방식은 Turbo Frames의 한계를 극복하고, 프레임 외부의 UI 요소까지 일관되고 효율적으로 관리할 수 있는 강력한 솔루션을 제공합니다. `turbo_aware_content_for` 헬퍼와 Turbo Stream의 `morph` 기능을 결합함으로써, 개발자는 복잡한 JavaScript 없이도 풍부한 사용자 경험을 구현할 수 있으며, UI 변경 및 확장이 용이하다는 이점을 얻습니다. 이는 Hotwire 기반 애플리케이션 개발에서 백엔드의 역할을 더욱 강화하는 실용적인 기법입니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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