Turbo와 함께 테이블 작동시키기

Making Tables Work with Turbo | Guillermo Aguirre

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

핵심 요약

  • 1 Turbo를 사용하여 동적 테이블을 구현할 때, `turbo_frame_tag`가 잘못된 HTML 구조를 생성하여 행 추가 및 인플레이스 편집 기능이 오작동할 수 있습니다.
  • 2 테이블의 `<tbody>` 또는 개별 `<tr>` 요소에 `id`를 직접 할당하여 `turbo_frame_tag` 사용을 피함으로써 렌더링 문제를 해결할 수 있습니다.
  • 3 인플레이스 편집 시 폼 요소가 `<tr>` 내부에 올바르게 렌더링되지 않는 문제를 해결하기 위해 HTML5 원격 폼 기능과 `form` 속성을 활용해야 합니다.

도입

Hotwire가 Rails의 기본 프런트엔드 도구로 자리 잡으면서, 개발자들은 빠른 프로토타이핑과 효율적인 개발 워크플로우를 경험하고 있습니다. 그러나 동적 테이블과 같이 특정 기능을 구현할 때는 예상치 못한 문제에 직면할 수 있습니다. 본 아티클은 Turbo를 활용하여 행 추가, 인플레이스 편집, 삭제 등 동적 테이블 기능을 구현할 때 발생할 수 있는 일반적인 문제점과 그 해결 방안을 제시합니다.

본문에서는 Turbo를 이용한 동적 테이블 구현 시 발생하는 주요 문제점과 그 해결책을 단계별로 설명합니다.

1. 새로운 행 추가 시 렌더링 문제

  • 문제점: turbo_stream.prependturbo_frame_tag<tbody>에 함께 사용할 경우, Turbo가 <turbo-frame> 태그로 콘텐츠를 감싸면서 테이블 구조가 깨져 새로운 행이 테이블 외부에 렌더링됩니다.
  • 해결책: <tbody> 태그에 id="articles_table"와 같이 직접 ID를 부여하고, turbo_frame_tag를 제거합니다. ArticlesController에서는 turbo_stream.prepend(:articles_table, ...)를 사용하여 이 ID를 직접 타겟팅합니다.

2. 인플레이스(In-place) 편집 시 렌더링 및 폼 제출 문제

  • 문제점:
    • 초기 렌더링: 개별 <tr>turbo_frame_tag를 사용할 경우, 편집 폼이 <tr> 외부에 렌더링되어 HTML 구조가 유효하지 않게 됩니다.
    • 폼 제출: form_with 내 폼 요소들이 <tr> 내부에 올바르게 포함되지 않아 폼 제출이 작동하지 않습니다.
  • 해결책:
    • 행 ID: 각 <tr> 태그에 dom_id(article) 헬퍼를 사용하여 고유 ID를 부여합니다. ArticlesControllereditupdate 액션에서 turbo_stream.replace(article, ...)로 이 ID를 타겟팅합니다.
    • 폼 구조: HTML5 원격 폼 기능을 활용합니다. form_with에 고유 id를 부여하고, 모든 입력 필드 및 제출 버튼에 form: form_id 속성을 명시적으로 연결하여 폼 요소들이 논리적으로 연결되도록 합니다.

이러한 접근 방식을 통해 동적 테이블에서 Turbo의 잠재력을 최대한 활용하면서도 발생할 수 있는 일반적인 문제들을 효과적으로 해결할 수 있습니다.

결론

Hotwire의 Turbo는 Rails 애플리케이션에서 동적이고 반응적인 사용자 경험을 구현하는 강력한 도구이지만, 테이블과 같은 복잡한 HTML 구조와 결합될 때는 특정 "버그"에 직면할 수 있습니다. 본 아티클에서 제시된 `turbo_frame_tag` 대신 직접 ID를 사용하고, HTML5 원격 폼 기능을 활용하는 해결책들은 이러한 문제들을 극복하고 견고한 동적 테이블을 구축하는 데 필수적입니다. 이 지식은 개발자들이 Turbo와 테이블을 효과적으로 통합하여 개발 시간을 절약하고 원활한 사용자 경험을 제공하는 데 기여할 것입니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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