Turbo Frame의 busy 속성을 활용한 사용자 경험(UX) 개선

Improving Turbo Frame UX with the busy Attribute

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

핵심 요약

  • 1 Turbo Frame은 새로운 콘텐츠 로딩 시 `busy` 및 `aria-busy="true"` 속성을 자동으로 추가하여 로딩 상태를 알립니다.
  • 2 Tailwind CSS의 `aria-busy:*` 변형 또는 일반 CSS 속성 선택자를 사용하여 이 로딩 상태를 시각적으로 표시할 수 있으며, 별도의 JavaScript는 필요하지 않습니다.
  • 3 로딩 표시기는 `turbo-frame` 내부에 오버레이로 구현하거나(`group-aria-busy`), 프레임 외부에 형제 요소로 배치하여(`peer-aria-busy`) 사용자에게 명확한 피드백을 제공할 수 있습니다.

도입

Rails 애플리케이션에 <turbo-frame>을 통합할 때, 기본 사용자 경험은 다소 미흡할 수 있습니다. 링크를 클릭하면 프레임이 새로운 콘텐츠를 기다리는 동안 조용히 비어버립니다. 사용자는 잠시 동안 빈 상자만 보게 되며, 이는 앱이 여전히 작동하는지, 클릭이 제대로 등록되었는지에 대한 혼란을 야기할 수 있습니다. 이러한 짧은 공백은 사용자 경험(UX)에 부정적인 영향을 미치며, 로딩 표시기가 없으면 사용자는 백그라운드에서 무슨 일이 일어나는지 알 수 없어 답답함을 느낄 수 있습니다.

다행히 Turbo는 이러한 상태를 알리는 내장된 신호를 제공합니다. turbo-frame이 새로운 콘텐츠를 가져올 때마다 자동으로 두 가지 속성을 요소에 추가합니다. 하나는 값이 없는 단순한 busy 속성이고, 다른 하나는 보조 기술에서 사용되는 접근성 속성인 aria-busy="true"입니다. 요청이 완료되면 Turbo는 busy를 제거하고 aria-busyfalse로 되돌립니다. 즉, 프레임은 이미 브라우저와 개발자에게 자신이 ‘바쁜’ 상태임을 알려주고 있는 것입니다. 우리는 이 상태를 스타일링하여 사용자에게 명확한 로딩 표시기를 제공하기만 하면 됩니다. Turbo Frames 문서에서 프레임 속성의 전체 목록을 자세히 확인할 수 있습니다.

aria-busy 상태 스타일링

Turbo는 모든 프레임에서 aria-busy 속성을 최신 상태로 유지하므로, 이 속성을 스타일링에 활용할 수 있습니다. Tailwind CSS는 이미 aria-busy:* 변형을 포함하고 있어, JavaScript 없이도 마크업에서 직접 이 상태에 반응할 수 있습니다. 동일한 개념은 일반 CSS를 사용하여 turbo-frame[aria-busy="true"] { ... }와 같은 속성 선택자로 완벽하게 작동합니다.

일반적으로 두 가지 패턴이 있습니다.

  1. 프레임 내부에 오버레이 표시: group-aria-busy
    • 이 접근 방식은 로딩 표시기를 turbo-frame 자체 내부에 배치합니다. 프레임을 group으로 지정하면, 프레임이 바쁠 때 그 자식 요소를 스타일링할 수 있습니다. Turbo가 aria-busy="true"로 설정하면, 콘텐츠가 어두워지고 스피너 오버레이가 서서히 나타납니다.
    • 예시: ```html

      ```

    • 프레임이 유휴 상태일 때는 오버레이가 숨겨져 있다가, aria-busy="true"로 표시되는 즉시 스피너가 나타나고 콘텐츠가 약간 흐려져 활동을 알립니다.
  2. 프레임 외부에 로더 배치: peer-aria-busy
    • 때로는 로더를 프레임 외부에 배치하고 싶을 수 있습니다. 예를 들어, 프레임의 내부 마크업을 수정하고 싶지 않거나 더 큰 오버레이를 원할 때입니다. 이 경우, 프레임을 컨테이너로 감싸고 프레임을 peer로 지정합니다. 이를 통해 형제 요소들이 peer-aria-busy: 유틸리티를 사용하여 프레임의 aria-busy 상태에 반응할 수 있습니다.
    • 예시: ```html

      ```

    • 여기서 오버레이는 프레임 옆에 위치하지만, 여전히 프레임의 바쁜 상태에 반응합니다. 이 패턴은 프레임 마크업을 깔끔하게 유지하면서도 명확한 시각적 피드백을 제공합니다.

결론

Turbo Frames는 페이지의 특정 부분을 전체 새로고침 없이 쉽게 업데이트할 수 있게 해주지만, 사용자에게 무슨 일이 일어나는지 보이지 않을 때 혼란을 줄 수 있습니다. `busy` 및 `aria-busy` 속성은 이러한 숨겨진 상태를 사용자에게 알리는 경량의 내장된 방법을 제공하며, 별도의 커스텀 JavaScript는 필요하지 않습니다. 미묘한 스피너, 흐림 오버레이, 또는 전체 스켈레톤 로더 등 어떤 방식을 사용하든, 핵심은 사용자에게 정보를 제공하는 것입니다. 짧은 시각적 신호는 조용한 기다림을 더욱 부드럽고 신뢰할 수 있는 경험으로 바꿉니다. 이 글의 예시에서는 편의를 위해 Tailwind의 `aria-busy` 변형을 사용했지만, 동일한 개념은 CSS를 작성할 수 있는 모든 곳에서 작동합니다. Turbo가 신호를 보내고, 개발자가 어떻게 보일지 결정합니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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