Rails Hotwire를 활용한 동적 웹 애플리케이션 개발

Unleash the Power of Hotwire(Part 1)

작성자
발행일
2024년 05월 20일

핵심 요약

  • 1 Hotwire는 최소한의 JavaScript로 서버 렌더링 HTML과 Turbo 기술을 활용하여 Rails에서 빠르고 상호작용적인 웹 애플리케이션을 구축하게 합니다.
  • 2 Turbo Drive, Turbo Frames, Turbo Streams는 페이지 전체 새로고침 없이 특정 영역만 업데이트하여 SPA와 유사한 사용자 경험을 제공하며, Stimulus는 경량 JavaScript로 상호작용성을 추가합니다.
  • 3 실제 Rails 애플리케이션에서 Turbo Frames로 양식 로딩을 인라인으로 처리하고 Turbo Streams로 실시간 CRUD(생성, 삭제) 업데이트를 구현하여, 끊김 없는 사용자 경험을 제공하는 방법을 상세히 설명합니다.

도입

개발자들은 기능적이면서도 매력적인 웹 애플리케이션을 만들고자 합니다. Rails의 Hotwire는 이러한 목표를 달성하기 위한 강력한 도구로, 동적이고 반응성이 뛰어난 애플리케이션을 구축하여 사용자 상호작용의 새로운 지평을 엽니다. Hotwire는 최소한의 JavaScript로 현대적인 웹 애플리케이션을 개발할 수 있도록 돕는 도구 집합으로, 서버 렌더링 HTML, Turbo Frames, Turbo Streams, 그리고 Stimulus를 활용하여 복잡한 프런트엔드 프레임워크 없이도 빠르고 상호작용적인 경험을 제공합니다. 본문에서는 Hotwire의 주요 구성 요소를 살펴보고, 실제 Rails 애플리케이션에서 Hotwire를 시작하는 방법과 Turbo Drive, Turbo Frames, Turbo Streams를 활용한 CRUD 작업 개선 과정을 상세히 다룹니다.

Hotwire는 Rails 애플리케이션의 사용자 경험을 혁신하는 여러 핵심 구성 요소로 이루어져 있습니다.

Hotwire의 주요 구성 요소

  • Turbo Drive: Rails 애플리케이션의 탐색 속도를 향상시키며, 복잡한 클라이언트 측 관리 없이 단일 페이지 애플리케이션(SPA)과 유사한 속도를 제공합니다. 링크 클릭 및 양식 제출을 가로채어 AJAX를 통해 새 콘텐츠를 가져오고, URL을 업데이트하며 head 요소를 보존한 채 body 콘텐츠만 교체하여 전체 페이지 새로고침 없이 빠르고 원활한 전환을 가능하게 합니다.

  • Turbo Frames: 웹 페이지를 뉴스 피드, 채팅 창, 장바구니 등 개별 섹션으로 나누는 컨테이너 역할을 합니다. 특정 섹션 내의 콘텐츠가 변경될 때 전체 페이지를 다시 로드하는 대신 해당 섹션만 업데이트하여 성능과 사용자 경험을 크게 향상시킵니다.

  • Turbo Streams: Turbo Frames에서 한 단계 더 나아가 실시간 데이터 업데이트를 가능하게 합니다. 웹소켓(WebSockets) 기술을 활용하여 서버와 브라우저 간 양방향 통신 채널을 통해 새로운 메시지가 즉시 나타나는 라이브 채팅 애플리케이션과 같은 기능을 구현할 수 있습니다.

  • Stimulus: 콘텐츠 업데이트를 담당하는 Turbo Frames 및 Streams와 달리, Stimulus는 웹 페이지에 상호작용성을 추가하는 데 중점을 둡니다. 이는 경량 JavaScript 프레임워크로, 특정 HTML 요소에 사용자 정의 동작을 정의할 수 있게 하여 애니메이션 트리거 버튼, 사용자 입력 유효성 검사 양식 등을 만들 수 있습니다.

Hotwire를 활용한 Rails 애플리케이션 개발 예시

Rails 7에서는 Hotwire가 기본적으로 포함되어 있습니다. rails new my_hotwire_app --css=tailwind --database=postgresql 명령어로 새 Rails 앱을 생성하고, rails g scaffold Blog title:string author:string content:textBlog 모델의 스캐폴드를 생성하여 기본적인 CRUD 기능을 구현할 수 있습니다.

  • Turbo Drive 동작 확인: Rails 7에서는 기본적으로 페이지가 Turbo Drive에 의해 구동됩니다. 네트워크 탭에서 XHR 요청을 필터링하면 Turbo Drive가 AJAX 요청을 통해 콘텐츠를 가져오고 전체 페이지 새로고침 없이 body 콘텐츠를 교체하는 것을 확인할 수 있습니다. Turbo.session.drive = false 설정을 통해 Turbo Drive 없이 동작을 비교할 수 있습니다.

  • Turbo Frames를 이용한 생성 (Create) 개선: 기존에는 새 블로그 생성 시 다른 페이지로 리디렉션되었지만, Turbo Frames를 활용하여 app/views/blogs/index.html.erbapp/views/blogs/new.html.erbturbo_frame_tag "create-blog"를 추가함으로써 새 블로그 양식을 인덱스 페이지 내에 로드할 수 있습니다. 이는 페이지 전환 없이 동일한 페이지에서 양식 상호작용을 가능하게 합니다.

  • Turbo Streams를 이용한 생성 (Create) 실시간 업데이트: 새 블로그 생성 후 목록에 즉시 반영되지 않는 문제를 해결하기 위해, app/controllers/blogs_controller.rbcreate 액션에 format.turbo_stream { render turbo_stream: turbo_stream.prepend("blogs", partial: "blog", locals: { blog: @blog }) } 코드를 추가합니다. 이는 성공적인 블로그 생성 시 blogs ID를 가진 대상 프레임에 새로 생성된 블로그를 _blog.html.erb 부분 템플릿으로 즉시 추가하여 실시간 업데이트를 제공합니다.

  • Turbo Frames를 이용한 업데이트 (Update) 개선: 블로그 개별 항목(_blog.html.erb)과 편집 양식(edit.html.erb)을 turbo_frame_tag dom_id(blog)로 감싸면, 편집 버튼 클릭 시 편집 양식이 인덱스 페이지 내의 해당 블로그 항목 프레임에 로드되어 페이지 이동 없이 편집이 가능해집니다.

  • Turbo Streams를 이용한 삭제 (Delete) 실시간 처리: 블로그 삭제 시 app/controllers/blogs_controller.rbdestroy 액션에 format.turbo_stream { render turbo_stream: turbo_stream.remove(@blog) }를 추가하면, 해당 블로그가 목록에서 부드럽게 제거되어 사용자 경험을 향상시킵니다.

결론

Hotwire는 Rails 개발자들이 최소한의 JavaScript로 동적이고 반응성 높은 웹 애플리케이션을 구축할 수 있도록 돕는 혁신적인 도구입니다. Turbo Drive로 빠른 페이지 전환을, Turbo Frames로 특정 영역의 효율적인 업데이트를, 그리고 Turbo Streams로 실시간 데이터 동기화를 구현함으로써, 개발자는 복잡한 프런트엔드 프레임워크 없이도 SPA와 유사한 매끄러운 사용자 경험을 제공할 수 있습니다. 이 글에서 다룬 CRUD 작업의 개선 사례는 Hotwire가 어떻게 Rails 애플리케이션의 성능과 상호작용성을 극대화하는지 명확히 보여줍니다. 다음 편에서는 Hotwire의 상호작용성을 더욱 강화하는 Stimulus 프레임워크에 대해 더 깊이 탐구할 예정입니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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