Rails Turbo Stream을 활용한 실시간 페이지 제목 카운터 업데이트

Update page title counter with custom turbo streams in Rails

작성자
HackerNews
발행일
2025년 11월 06일

핵심 요약

  • 1 Rails에서 커스텀 Turbo Stream 액션을 생성하여 실시간 페이지 제목 카운터를 효율적으로 구현하는 방법을 설명합니다.
  • 2 헬퍼 메서드, JavaScript 함수 작성 및 Turbo에 등록하는 과정을 통해 페이지 제목을 동적으로 업데이트하는 메커니즘을 상세히 다룹니다.
  • 3 Turbo Stream 브로드캐스트를 활용하여 다른 사용자나 백그라운드 작업에 의한 변경사항도 모든 연결된 클라이언트에 실시간으로 반영합니다.

도입

최근 SaaS 애플리케이션 개발에서 사용자 경험을 향상시키기 위한 기능 중 하나로, 브라우저 탭에 고정된 앱의 페이지 제목에 새 레코드 수를 실시간으로 표시하는 기능이 주목받고 있습니다. 본 글은 Rails 환경에서 이러한 실시간 페이지 제목 카운터를 기존 Turbo Stream 액션의 한계를 넘어, 커스텀 Turbo Stream 액션을 활용하여 깔끔하고 효율적으로 구현하는 방법을 소개합니다. 특히 `set_title_counter`와 같은 커스텀 액션을 정의하고, 이를 통해 페이지 제목을 동적으로 업데이트하는 과정에 중점을 둡니다.

커스텀 Turbo Stream 액션 생성

페이지 제목 카운터를 구현하기 위해 Rails의 내장 Turbo Stream 액션(append, prepend, replace, remove)으로는 불가능한 set_title_counter라는 커스텀 액션이 필요합니다. 이 액션은 다음과 같은 단계를 거쳐 구현됩니다.

  • 헬퍼 메서드 정의: app/helpers/turbo_stream_actions_helper.rb 파일에 set_title_counter 헬퍼 메서드를 정의합니다. 이 메서드는 turbo_stream_action_tag를 호출하여 action, count, divider 속성을 가진 <turbo-stream> HTML 태그를 생성합니다. Turbo::Streams::TagBuilder.prepend(TurboStreamActionsHelper)를 통해 이 헬퍼는 뷰의 turbo_stream 객체에서 사용 가능해집니다.

  • Turbo Stream 태그 구조: turbo_stream.set_title_counter @count 호출 시 <turbo-stream action="set_title_counter" count="5"><template></template></turbo-stream>와 같은 HTML 태그가 생성됩니다. action 속성은 Turbo가 호출할 JavaScript 함수를 지정하며, count는 JavaScript 액션이 읽을 사용자 정의 데이터입니다. 비어있는 <template> 태그는 Turbo Stream 형식의 필수 요소입니다.

JavaScript 액션 구현 및 등록

생성된 <turbo-stream> 태그를 처리할 JavaScript 함수를 작성하고 Turbo에 등록합니다.

  • JavaScript 함수 작성: app/javascript/turbo_stream_actions/set_title_counter.js 파일에 JavaScript 함수를 정의합니다. 이 함수는 this.getAttribute("count")this.getAttribute("divider")를 통해 Turbo Stream 태그의 속성값을 읽습니다. 현재 페이지 제목에서 기존 카운터를 제거하고, 새 카운터와 구분자를 포함하여 document.title을 업데이트합니다. 이 로직은 카운터가 중복되어 쌓이는 것을 방지합니다.

  • Turbo에 등록: app/javascript/turbo_stream_actions/index.js에서 작성된 JavaScript 함수를 임포트하고 Turbo.StreamActions.set_title_counter = set_title_counter를 통해 Turbo에 등록합니다. 마지막으로 app/javascript/application.js에서 turbo_stream_actions를 임포트하고, importmap 설정을 업데이트하여 새로운 디렉토리를 인식시킵니다.

Turbo Stream 브로드캐스트 연동

사용자 간의 실시간 업데이트를 위해 Turbo Stream 브로드캐스트와 연동합니다.

  • 모델 콜백: Message 모델에 after_commit :set_title_counter 콜백을 추가합니다. 이 콜백은 메시지가 생성되거나 삭제될 때마다 실행됩니다.

  • 브로드캐스트 액션: set_title_counter 프라이빗 메서드 내에서 broadcast_action_to :messages, action: :set_title_counter, attributes: { count: Message.count }를 호출하여 커스텀 제목 카운터 업데이트를 messages 채널로 브로드캐스트합니다. attributes 해시는 JavaScript 액션이 읽을 HTML 태그의 속성으로 변환됩니다.

  • 뷰 구독: 뷰 파일에 <%= turbo_stream_from :messages %>를 추가하여 messages 채널의 브로드캐스트를 구독합니다. 이로써 모든 연결된 클라이언트는 다른 사용자에 의해 메시지가 생성되거나 삭제될 때 페이지 제목 카운터가 실시간으로 업데이트되는 것을 경험하게 됩니다.

결론

본 글에서 제시된 커스텀 Turbo Stream 액션 구현 방식은 Rails의 Turbo Streams와 완벽하게 통합되며, 사용자 직접 상호작용뿐만 아니라 실시간 브로드캐스트 환경에서도 원활하게 작동합니다. 이 접근 방식은 단순한 페이지 제목 업데이트를 넘어, JavaScript의 유연성을 활용하여 애니메이션, 알림 등 다양한 브라우저 API와 연동하여 기능을 확장할 수 있는 잠재력을 제공합니다. 개발자는 이러한 커스텀 액션을 통해 Rails 애플리케이션의 사용자 경험을 한층 더 풍부하게 만들 수 있습니다.

댓글 0

로그인이 필요합니다

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

로그인 하러 가기

아직 댓글이 없습니다

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