Hotwire 앱에서 자체 업데이트 컴포넌트 구현: ViewComponent 활용

Hotwire components that refresh themselves | Boring Rails: Skip the bullshit and ship fast

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

핵심 요약

  • 1 Hotwire 앱에서 `turbo_streams`와 파셜을 이용한 UI 업데이트는 `dom_id` 관리의 어려움과 코드 유지보수 문제를 야기합니다.
  • 2 ViewComponent를 활용하여 UI 로직과 `dom_id`, ActionCable 채널을 컴포넌트 내부에 캡슐화함으로써 이러한 문제를 해결할 수 있습니다.
  • 3 이 패턴은 컴포넌트가 스스로 업데이트를 관리하게 하여 코드의 응집도를 높이고 리팩토링을 용이하게 합니다.

도입

Hotwire 기반 Ruby on Rails 앱에서 동적 UI 업데이트는 필수적이지만, `turbo_streams`와 파셜 사용 시 `dom_id` 관리 및 데이터 전달의 복잡성으로 유지보수 문제가 발생합니다. 본 글은 이러한 한계를 극복하고 UI 작업을 효율화하는 '자체 업데이트 컴포넌트' 패턴을 소개하며, ViewComponent를 활용한 구현 방안을 제시합니다.

기존 turbo_streams 방식의 주요 문제는 ‘식별자의 분산 관리’입니다. 백그라운드 작업에서 broadcast_replace_to 사용 시 target(dom_id)과 partial 간의 동기화가 필수적이며, 컴포넌트 ID 변경 시 코드 전반의 업데이트가 필요해 유지보수 부담이 큽니다.

ViewComponent는 이 문제에 대한 효과적인 해결책입니다. ViewComponent는 뷰 로직뿐 아니라 dom_id, ActionCable 브로드캐스트 채널 등 관련 구현 세부 사항을 하나의 Ruby 클래스 내에 캡슐화하여, 컴포넌트가 렌더링을 넘어 자체 콘텐츠를 능동적으로 새로 고치는 ‘자체 업데이트’ 기능을 구현합니다.

예시로, UI::UserCard 컴포넌트는 자신의 idbroadcast_channel을 정의하고 broadcast_refresh! 메서드를 통해 스스로를 업데이트하는 로직을 내장합니다. 이로써 컨트롤러나 백그라운드 작업에서 UI::UserCard.new(user: @user).broadcast_refresh!와 같이 간결한 호출만으로 해당 컴포넌트를 효율적으로 업데이트할 수 있습니다. 핵심 식별자와 로직이 컴포넌트 내부에 중앙 집중화됩니다.

또한, 컴포넌트의 상태(예: sending_email?)를 활용하여 필요한 경우에만 스트림을 활성화/비활성화하는 동적 제어가 가능하여, 불필요한 스트림 연결을 줄이고 UI의 ‘진행 중’ 상태를 명확히 시각화합니다.

결론

ViewComponent를 활용한 UI 요소의 비즈니스 로직 캡슐화는 Hotwire 애플리케이션 개발에 큰 이점을 제공합니다. 이 접근 방식은 로직의 응집성을 높이고, UI 업데이트 방법을 명확히 하며, 향후 리팩토링을 용이하게 합니다. 컴포넌트의 `id`와 업데이트 채널이 한 곳에 정의되므로 유지보수성이 크게 향상됩니다. 엄격한 '관심사의 분리'보다 '행동의 지역성'을 중시하여 관련 동작을 함께 묶는 것이 실제 코드베이스에서 더욱 효율적이고 관리하기 쉬운 개발 환경을 조성할 수 있음을 보여줍니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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