Rails Turbo Drive 환경에서 서드파티 메신저 위젯 영속성 확보하기

An Out of Body Experience with Turbo | Miles Woodroffe

작성자
발행일
2025년 09월 07일

핵심 요약

  • 1 Rails Turbo Drive의 <body> 교체 방식이 서드파티 iframe 기반 위젯의 상태 소실을 야기하는 문제를 분석합니다.
  • 2 data-turbo-permanent 속성이 iframe의 상태를 유지하지 못하는 한계를 확인하고, 비동기 로드 위젯에 적용하는 어려움을 설명합니다.
  • 3 위젯을 <body> 태그 외부로 이동시키는 "Out of Body" 기법과 turbo:before-render 이벤트를 활용한 해결책을 제시합니다.

도입

Rails 프로젝트에 서드파티 메신저 위젯을 추가하는 과정에서 예상치 못한 문제가 발생했습니다. 일반적인 웹사이트에서 널리 사용되는 위젯이기에 간단한 JavaScript 삽입으로 해결될 것이라 예상했으나, 첫 페이지를 벗어나자마자 채팅 버블이 사라지는 현상이 나타났습니다. 이는 최신 Rails 웹사이트의 핵심 기능 중 하나인 Turbo Drive의 동작 방식과 밀접하게 관련되어 있습니다. Turbo Drive는 페이지 전체를 새로 로드하는 대신, AJAX를 통해 <body> 요소만 교체하므로, 초기 로드 시 <body>에 삽입된 위젯 코드가 다음 페이지에서는 소실되는 문제가 발생한 것입니다.

Turbo Drive의 동작 방식과 문제점

Turbo Drive는 링크 클릭 및 폼 제출을 가로채어 전체 HTML을 AJAX로 가져온 후, <head> 내용은 유지하고 <body> 요소만 새로운 콘텐츠로 교체합니다. 이는 페이지 전환 속도를 크게 향상시키지만, <body>에 직접 코드를 삽입하는 서드파티 위젯에는 문제를 야기합니다. 위젯의 JavaScript는 초기 페이지 로드 시 채팅 창을 렌더링하고 관리하는 코드를 document.body에 삽입하지만, Turbo Drive가 페이지 이동 시 <body> 전체를 교체하면서 위젯도 함께 사라지게 됩니다.

data-turbo-permanent 시도와 한계

Rails는 이러한 상황을 위해 data-turbo-permanent 속성을 제공하여 특정 요소가 페이지 로드 간에도 유지되도록 합니다. 문서에 따르면 이는 해결책처럼 보였으나, 실제 적용에는 어려움이 있었습니다. 위젯 마크업이 페이지 렌더링 후 동적으로 로드되므로 직접 data-turbo-permanent를 추가하기 어려웠습니다. 이를 우회하기 위해 MutationObserver를 사용하여 위젯이 비동기적으로 추가되는 즉시 data-turbo-permanent를 가진 컨테이너 div로 이동시켰습니다. 그러나 위젯이 iframe으로 구현되어 있었기 때문에, 요소 자체는 유지되더라도 iframe은 모든 상태와 서드파티 원격 위젯 플랫폼과의 연결을 잃어버리는 문제가 발생했습니다. 결과적으로 채팅 버블의 흔적만 남고 실제 서비스 콘텐츠는 사라지는 현상이 나타났습니다.

‘Out of Body Experience’ 해결책

문제가 Turbo Drive의 <body> 교체와 iframe의 상태 유지 한계에 있음을 파악한 후, 위젯을 <body> 태그 외부로 완전히 이동시키는 아이디어를 시도했습니다. 이전과 동일하게 MutationObserver를 사용하여 위젯이 페이지에 추가되면 즉시 <body> 밖으로 이동시키는 방식을 적용했습니다. 놀랍게도 이 방법은 완벽하게 작동했습니다. 위젯 아이콘은 페이지 전환 간에도 지속되었고, 심지어 채팅 창을 열어둔 상태에서도 그 상태가 유지되었습니다. 비록 기술적으로 ‘합법적인’ HTML 마크업은 아니지만, 이 방법은 매우 효과적이었습니다.

DHH의 제안

Rails World 컨퍼런스에서 DHH는 turbo:before-render 이벤트를 가로채고, Turbo Drive가 <body> 내부의 특정 div만 교체하도록 하는 방안을 제안했습니다. 이 방식은 위젯을 해당 div 외부에 배치하여 교체되지 않도록 하는 것으로, 더 표준적인 해결책입니다. 하지만 이는 더 많은 코드를 필요로 하며, 저자는 비록 비표준일지라도 간단하고 효과적인 ‘Out of Body’ 해결책을 여전히 선호한다고 밝혔습니다.

결론

본 글은 Rails Turbo Drive 환경에서 서드파티 iframe 기반 메신저 위젯이 페이지 전환 시 사라지는 문제를 해결하기 위한 다양한 시도와 최종 해결책을 공유했습니다. data-turbo-permanent의 한계를 명확히 하고, 위젯을 <body> 태그 외부로 이동시키는 'Out of Body' 기법이 실질적인 해결책임을 보여주었습니다. 또한, DHH가 제안한 turbo:before-render를 활용한 표준적인 대안도 함께 제시하여, 개발자들이 유사한 문제에 직면했을 때 선택할 수 있는 여러 방안을 제공합니다. 이 경험이 다른 개발자들에게 유용하게 활용되기를 바라며, 더 나은 해결책에 대한 의견을 환영합니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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