Turbo Streams와 View Transitions를 활용한 동적 리스트 애니메이션 구현

Turbo Streams - List Animations Using the View Transitions API

작성자
발행일
2025년 06월 10일

핵심 요약

  • 1 Turbo Streams를 사용하여 동적으로 콘텐츠를 추가할 때 View Transitions를 결합하여 부드러운 애니메이션 효과를 구현하는 방법을 제시합니다.
  • 2 핵심은 `turbo:before-stream-render` 이벤트를 활용하여 렌더링 메서드를 오버라이드하고 `document.startViewTransition()`을 수동으로 호출하는 것입니다.
  • 3 `view-transition-name` 속성을 고유하게 사용하여 새로 추가되는 각 요소에 개별적이고 시각적으로 매끄러운 전환 효과를 적용하는 것이 중요합니다.

도입

이 문서는 웹 기술의 여러 측면을 탐구하는 과정에서 Turbo Streams와 View Transitions의 결합 가능성을 모색합니다. 특히, 클라이언트 프로젝트에서 '더 보기' 버튼을 통한 무한 로딩 기능을 구현하면서 `turbo-stream action="append"` 액션으로 추가되는 항목들에 부드러운 애니메이션을 적용해야 하는 요구사항에서 출발했습니다. 기존 CSS 애니메이션 방식 대신 View Transitions를 활용하여 보다 우아하고 효율적인 솔루션을 찾고자 했습니다.

이 구현의 핵심은 Turbo Streams의 렌더링 파이프라인을 커스터마이징하여 View Transitions를 통합하는 것입니다.

시작점

  • 기본 구성: id가 “tickets”인 목록과 “Load More” 버튼을 포함하는 <form>으로 시작합니다.
  • 서버 응답: 폼은 / 경로로 요청을 보내며, 이는 Ruby on Rails 컨트롤러의 동작을 모방하여 새로운 티켓 항목을 append하는 <turbo-stream> 응답을 반환합니다.
  • CSS 정의: styles.css에는 new-ticket이라는 view-transition-name이 정의되어 있어, 새로운 요소가 오른쪽에서 슬라이드 인(slide-in)되는 애니메이션을 담당합니다.

도전 과제 및 해결 방안

  • turbo:before-stream-render 이벤트: Turbo Streams는 이 이벤트를 발생시켜 렌더링 메서드를 커스터마이징할 기회를 제공합니다.
  • 렌더링 메서드 오버라이드: 이벤트 리스너 내에서 기존 렌더링 로직을 오버라이드하고, 새로운 콘텐츠가 DOM에 추가되기 전에 document.startViewTransition()을 수동으로 호출하여 전환을 시작해야 합니다. 이는 브라우저의 기본 탐색이 아닌, DOM 직접 조작 시 View Transitions를 활성화하는 핵심 단계입니다.
  • view-transition-name 고유성: view-transition-name은 페이지 내 모든 요소에 대해 고유해야 합니다. 이를 통해 브라우저는 특정 요소의 이전 및 새 상태를 정확히 매핑하여 부드러운 전환 효과를 적용할 수 있습니다. 각 새로 추가되는 티켓 항목에 동적으로 고유한 이름을 부여하여 개별적인 애니메이션을 가능하게 합니다.

이 접근 방식은 Turbo Streams의 동적 콘텐츠 업데이트에 View Transitions의 시각적 부드러움을 결합하여 사용자 경험을 효과적으로 향상시킵니다.

결론

이 문서는 Turbo Streams를 통해 동적으로 콘텐츠가 추가될 때 View Transitions를 활용하여 사용자에게 시각적으로 매끄러운 경험을 제공하는 방법을 성공적으로 시연했습니다. `turbo:before-stream-render` 이벤트를 통해 렌더링 로직을 제어하고 `document.startViewTransition()`을 수동으로 호출하는 것이 핵심적인 구현 전략이었습니다. 특히, `view-transition-name`의 고유성을 유지하는 것이 중요하며, 이를 통해 개별 요소의 전환을 정교하게 제어할 수 있습니다. 이 기술은 무한 로딩과 같은 동적 UI 패턴에서 사용자 인터랙션의 질을 한 단계 높일 수 있는 강력한 도구로 활용될 수 있습니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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