Superglue 2.0 Alpha 및 Super Turbo Streams: React와 Rails를 위한 Turbo Streams 포트

Superglue 2.0 Alpha: React ♥️ Rails Turbo Streams!

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

핵심 요약

  • 1 Superglue 2.0 Alpha가 Super Turbo Streams와 함께 발표되어 React/Rails 애플리케이션에 Turbo Streams의 기능을 도입합니다.
  • 2 Super Turbo Streams는 기존 Rails 뷰 파셜을 재사용하여 JavaScript 작성 없이 JSON 기반의 실시간 부분 페이지 업데이트를 가능하게 합니다.
  • 3 이는 React 애플리케이션에서 복잡한 JavaScript 없이도 웹소켓/SSE를 통한 동적 업데이트를 효율적으로 구현할 수 있는 새로운 접근 방식을 제공합니다.

도입

Turbo Streams는 웹소켓/SSE를 통해 페이지의 특정 부분을 정교하게 업데이트하는 강력한 도구로, 현대 JavaScript 개발자들이 놀랄 만큼 적은 노력으로 실시간 업데이트 기능을 구현할 수 있게 합니다. 기존 Rails 뷰 파셜을 재활용하여 8가지 새로운 기능을 제공하며, 개발자들에게 필수적인 도구로 자리매김했습니다. 이러한 정신을 이어받아, Superglue 팀은 React와 Rails 애플리케이션 구축 방식을 제시했던 Superglue에 이어, Superglue 2.0 Alpha와 함께 Turbo Streams를 Superglue에 맞게 포팅한 Super Turbo Streams를 발표했습니다. 이는 React 환경에서 스트리밍 업데이트의 부재와 JavaScript 피로도를 해소하기 위한 중요한 시도입니다.

React와 Rails 환경에서 강력한 스트리밍 기능은 부족했으며, Turbo와 같은 즉시 사용 가능한 솔루션이 없어 직접 구현하는 것은 번거롭고 오류 발생 가능성이 높았습니다. Super Turbo Streams는 이러한 문제를 해결하기 위해 Turbo Streams의 핵심 개념을 React에 적용했습니다.

Super Turbo Streams의 핵심 원리

Super Turbo Streams의 핵심은 기존 서버 측 템플릿을 재사용하여 실시간 부분 페이지 변경을 수행하는 것입니다. Turbo Streams가 HTML을 전달하는 반면, Super Turbo Streams는 JSON을 전달한다는 차이가 있습니다. 즉, _post.html.erb 대신 _post.json.props와 같은 JSON 파셜을 사용합니다.

구현 예시

Super Turbo Streams를 활용한 구현 과정은 다음과 같습니다.

1. 채널 프롭스 생성

stream_from_props를 사용하여 스트리밍 채널을 생성합니다. 이는 Turbo Streams의 turbo_stream_from에 해당하는 Superglue의 기능입니다. ruby # index.json.props json.streamFromPosts stream_from_props('my_posts') json.favPost(partial: ["post", fragment: "post-#{@post.id}"]) do # ... 기존 내용 ... end json.numOfPosts Post.count

2. 파셜 및 프래그먼트 정의

부분 템플릿을 추출하고 fragment 이름을 부여합니다. 프래그먼트는 JSON을 위한 DOM ID와 유사하게, 프론트엔드에서 식별 가능한 렌더링된 파셜을 의미합니다. ruby # app/views/posts/_post.json.props json.title @post.title json.body @post.body

3. React 컴포넌트 통합

React 컴포넌트에서 useStreamSource 훅을 임포트하고 채널 프롭스를 전달하여 스트림 소스를 연결합니다. ```javascript // app/views/posts/index.jsx import React from ‘react’ import { useStreamSource, useContent } from ‘@thoughtbot/superglue’

export default function PostIndex() { const { streamFromPosts, favPost, numOfPosts } = useContent() useStreamSource(streamFromPosts) // 스트림 소스 연결 return ( <div> <h1>{There are ${numOfPosts}}</h1> <Post {…favPost} /> </div> ) } ```

4. 컨트롤러/잡에서 업데이트 브로드캐스트

컨트롤러나 잡에서 broadcast_save_later_to를 사용하여 업데이트를 브로드캐스트합니다. 이는 Turbo의 broadcast_replace_later_tobroadcast_replace_later_to를 결합한 기능입니다. ruby # 컨트롤러, 잡 등에서 @post.broadcast_save_later_to('my_posts', target: "post-#{@post.id}")

5. 스트리밍 응답 처리

컨트롤러 액션에서 format.json 응답 시 render layout: "stream"을 사용하여 스트림 레이아웃을 렌더링하고, 뷰에서 broadcast_save_props를 통해 업데이트를 브로드캐스트할 수 있습니다. ```ruby # 컨트롤러 액션 예시 def update # … if @post.save respond_to do |format| format.html { redirect_to posts_path, notice: “Successfully updated” } format.json { flash.now[:notice] = “Successfully submitted” render layout: “stream” # 스트림 레이아웃 자동 생성 } end else redirect_to posts_path, alert: “Could not update” end end

update.json.props 뷰

broadcast_save_props(model: @post, target: “post-#{@post.id}”) ```

현재 상태 및 향후 계획

Superglue 2.0 Alpha는 현재 개발 초기 단계이며 API 변경 가능성이 있습니다. 현재 Super Turbo Streams는 prepend, append, save, refresh의 4가지 액션만 지원하지만, 향후 확장될 예정입니다. 또한, 2.0 버전은 프래그먼트 개념을 재정의하여 1.0 버전과 하위 호환성이 없으므로, 주요 릴리스에서 마이그레이션 계획이 제공될 예정입니다.

결론

Super Turbo Streams는 React와 Rails 애플리케이션 개발에 있어 라이브 업데이트 기능을 간소화하고, JavaScript 피로도를 줄이며, Rails의 기존 컨벤션을 유지하면서 React의 이점을 활용할 수 있는 혁신적인 솔루션입니다. JSON 기반의 파셜 재사용과 간결한 API를 통해 개발자는 복잡한 클라이언트 측 로직 없이도 동적인 사용자 경험을 제공할 수 있게 됩니다. 아직 알파 단계이지만, Superglue 팀은 React와 Rails의 조화를 더욱 강화하기 위한 노력을 지속하고 있으며, 이는 Rails 개발자들에게 매우 유용한 도구가 될 것으로 기대됩니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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