데이터 속성과 JavaScript로 Rails에서 낙관적 UI 간소화하기

Building optimistic UI in Rails powered by Turbo | Rails Designer

작성자
발행일
2026년 01월 22일

핵심 요약

  • 1 낙관적 UI 구현을 위해 커스텀 요소 대신 데이터 속성과 순수 JavaScript 클래스를 활용하여 마크업 오버헤드를 제거하고 간결성을 높였습니다.
  • 2 Turbo의 `turbo:submit-start` 이벤트를 감지하여 폼 제출 즉시 템플릿을 복제하고 폼 데이터로 채워 UI에 삽입, 사용자에게 즉각적인 피드백을 제공합니다.
  • 3 JavaScript 클래스는 정적 메서드만으로 구성되어 상태 관리 없이 DOM 조작에 집중하며, 명명된 매개변수 스타일로 가독성을 향상시켰습니다.

도입

이전 글에서 커스텀 요소를 활용한 낙관적 UI 구축 방식을 소개했으나, `optimistic-form`과 같은 래퍼 요소가 주는 추가적인 마크업 오버헤드에 대한 고민이 있었습니다. 본 글은 이러한 '의례'를 제거하고, Rails의 데이터 속성과 간결한 JavaScript를 활용하여 동일한 즉각적인 사용자 피드백을 제공하는 더욱 단순하고 효율적인 접근 방식을 제시합니다. 목표는 최소한의 마크업으로 낙관적 UI를 구현하여 개발 편의성을 높이는 것입니다.

기존 커스텀 요소 방식의 한계

이전의 커스텀 요소 접근 방식은 <optimistic-form> 래퍼 안에 폼과 템플릿이 포함되어 커스텀 요소의 정의, 등록, 생명주기 관리가 필요했습니다. 이는 기능적으로 훌륭했지만, 개발자에게 추가적인 마크업 및 JavaScript 오버헤드를 요구했습니다.

데이터 속성 기반의 새로운 접근

새로운 방식은 일반적인 Rails form_with 헬퍼에 다음과 같은 데이터 속성을 추가하여 구현됩니다:

  • data-optimistic: true: 폼이 낙관적 UI를 사용함을 나타냅니다.

  • data-optimistic-target: "messages": 생성된 요소가 삽입될 대상 DOM 요소의 ID를 지정합니다.

  • data-optimistic-template: "message-template": 복제할 템플릿 요소의 ID를 지정합니다.

  • data-optimistic-position: "prepend" (또는 append): 요소를 대상에 삽입할 위치를 지정합니다.

템플릿은 <template id="message-template"> 형태로 폼과 분리되어 존재하며, 렌더링될 메시지 구조를 포함합니다. 이 템플릿 내의 data-field="message[content]"와 같은 속성은 폼 데이터로 동적으로 채워질 필드를 표시합니다.

JavaScript 구현 상세

핵심은 OptimisticForm이라는 정적(static) JavaScript 클래스입니다. 이 클래스는 다음과 같은 Turbo 이벤트를 수신합니다:

  • turbo:submit-start: 폼 제출이 시작될 때 발동합니다.
    • data-optimistic="true" 속성을 가진 폼인지 확인합니다.
    • FormData를 사용하여 폼 데이터를 추출합니다.
    • 지정된 템플릿을 복제하고, 폼 데이터로 템플릿 내 data-field 요소를 채웁니다.
    • data-optimistic-target에 지정된 대상에 data-optimistic-position에 따라 요소를 삽입합니다.
  • turbo:submit-end: 폼 제출이 완료될 때 발동합니다.
    • 폼을 초기화(form.reset())하여 사용자에게 즉각적인 피드백과 다음 입력을 위한 준비를 제공합니다.

코드 가독성 및 정적 메서드 활용

JavaScript 메서드에서는 객체 비구조화 할당을 활용한 명명된 매개변수 스타일(`this.

build({ form, with: formData }))을 사용하여 코드의 가독성을 크게 높였습니다. 또한, OptimisticForm` 클래스의 모든 메서드가 정적으로 구현된 것은 상태 관리가 필요 없고, 단순히 DOM 조작을 수행하는 이 특정 사용 사례에서 인스턴스 생성이 불필요한 복잡성을 추가하기 때문입니다. 클래스는 관련 함수들의 네임스페이스 역할을 하여 코드를 간결하게 유지합니다.

결론

이 새로운 낙관적 UI 구현 방식은 Rails 개발자에게 친숙한 데이터 속성을 활용하여 커스텀 요소의 '추가적인 의례' 없이도 강력한 기능을 제공합니다. 폼에 `data-optimistic="true"`를 추가하고 템플릿 및 타겟을 지정하는 것만으로 사용자에게 서버 응답을 기다리지 않는 즉각적인 피드백을 제공할 수 있습니다. 이는 애플리케이션의 반응성을 크게 향상시키고 사용자 경험을 개선합니다. 간결한 JavaScript 클래스와 명시적인 데이터 속성 활용은 코드의 유지보수성과 이해도를 높이는 효율적인 패턴으로 평가됩니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

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