Turbo Stream에서 사용자별 콘텐츠를 조건부로 표시/숨기기

User-Specific Content in Turbo Stream Partials | Rails Designer

작성자
Ruby Weekly
발행일
2025년 08월 21일

핵심 요약

  • 1 Turbo Stream 환경에서 사용자별 콘텐츠를 조건부로 렌더링하는 문제와 기존 Rails 조건부 로직의 한계를 설명합니다.
  • 2 클라이언트 측에서 조건부 렌더링을 구현하기 위해 `turbo-show`라는 커스텀 HTML 요소를 도입하는 방법을 제시합니다.
  • 3 `turbo-show`는 메타 태그의 값과 속성을 비교하여 DOM에서 요소를 동적으로 제거하며, 다양한 시나리오에 유연하게 적용 가능합니다.

도입

Turbo Stream을 활용하는 Rails 애플리케이션에서 사용자별 콘텐츠를 조건부로 제어하는 것은 일반적인 요구사항입니다. 기존 Rails의 서버 측 조건부 로직은 단일 사용자 컨텍스트에서는 작동하지만, Turbo Stream을 통해 여러 사용자에게 업데이트를 브로드캐스트할 때는 수신하는 각 사용자의 컨텍스트를 반영하지 못하는 한계가 있습니다. 이는 특정 사용자에게만 편집/삭제 버튼을 보여주거나 관리자 컨트롤을 표시하는 등의 시나리오에서 복잡성을 야기합니다.

turbo-show 요소 도입

이러한 문제를 해결하기 위해, 조건부 렌더링 로직을 서버 측이 아닌 클라이언트 측으로 이관하는 turbo-show라는 커스텀 HTML 요소를 활용할 수 있습니다. 이 요소는 다음과 같은 방식으로 작동합니다.

  • HTML 구조: turbo-show 요소는 when 속성으로 메타 태그의 이름을 지정하고, is와 같은 연산자 속성으로 비교할 값을 정의합니다. 예를 들어, <turbo-show when="current-user-id" is="<%= message.author.id %>">는 현재 사용자 ID와 메시지 작성자 ID를 비교합니다.
  • 클라이언트 측 로직: TurboShow 클래스는 HTMLElement를 상속받아 구현됩니다.
    • connectedCallback() 메서드에서 removable() 조건을 확인하여 만족하면 요소를 DOM에서 제거합니다.
    • #removable()when 속성 누락, 메타 태그 누락, 조건 불일치 여부를 검사합니다.
    • #operators 객체를 통해 is와 같은 비교 연산자를 정의하며, 필요에 따라 contains, is_not 등으로 확장할 수 있습니다.
    • #metaTag#metaContent 게터를 통해 지정된 메타 태그의 내용에 접근합니다.

Rails 애플리케이션 통합

turbo-show 요소를 Rails 애플리케이션에 적용하려면 다음 단계가 필요합니다.

  1. 메타 태그 추가: 애플리케이션 레이아웃에 current_user.id와 같은 사용자별 정보를 담은 메타 태그를 추가합니다. 예: <meta name="current-user-id" content="<%= current_user.id %>" />
  2. Importmap 설정: config/importmap.rb 파일에 turbo_show 라이브러리 경로를 추가합니다. 예: pin_all_from "app/javascript/library", under: "library"
  3. JavaScript 임포트: app/javascript/application.js 파일에서 커스텀 요소를 임포트합니다. 예: import "library/turbo_show"

이러한 과정을 통해 서버는 모든 사용자에게 동일한 부분 템플릿을 브로드캐스트하고, 각 클라이언트는 자신의 컨텍스트에 따라 적절한 콘텐츠만 표시하게 됩니다.

결론

`turbo-show` 요소를 활용한 클라이언트 측 조건부 렌더링은 Turbo Stream 환경에서 사용자별 콘텐츠를 효과적으로 관리할 수 있는 강력하고 유연한 솔루션을 제공합니다. 이 접근 방식은 코드의 가독성을 높이고, 서버 부하를 줄이며, 역할 기반 권한, 기능 플래그, 구독 등급, A/B 테스트와 같은 다양한 시나리오에 쉽게 적용될 수 있습니다. 실제 엔드포인트에서는 여전히 적절한 인증 및 인가 검사가 필요하지만, UI 렌더링 측면에서는 매우 효율적인 방법을 제시합니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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