JavaScript 없이 Turbo 확인 대화 상자 구현하기: 최신 브라우저 기능 활용

Confirmation dialogs with zero JavaScript

작성자
발행일
2025년 12월 26일

핵심 요약

  • 1 최신 브라우저의 `command`, `commandfor` 속성 및 `<dialog>` 요소를 활용하여 JavaScript 없이 선언적으로 모달 대화 상자를 제어할 수 있습니다.
  • 2 `@starting-style` 및 `allow-discrete` CSS 속성을 사용하여 진입/종료 애니메이션을 구현하여 세련된 사용자 경험을 제공합니다.
  • 3 `Turbo.config.forms.confirm`을 커스터마이징하여 `data-turbo-confirm` 속성과 연동되는 맞춤형 확인 대화 상자를 손쉽게 통합할 수 있습니다.

도입

Turbo의 `data-turbo-confirm` 속성은 간편한 확인 대화 상자를 제공하지만, 기본 `confirm()` 프롬프트는 구식이며 앱 디자인과 어울리지 않습니다. 기존 방식은 Stimulus 컨트롤러, 이벤트 리스너 등 많은 JavaScript를 요구했으나, 최근 Chrome 131, Safari 18.4에 도입된 Invoker Commands와 `@starting-style`을 통해 JavaScript 없이도 아름답고 애니메이션된 확인 대화 상자를 구축할 수 있게 되었습니다. 이는 웹 개발 방식에 새로운 변화를 가져왔습니다.

최신 브라우저 기능을 활용하여 JavaScript 없이 확인 대화 상자를 구축하는 방법은 다음과 같습니다.

1. 선언적 대화 상자 제어

commandcommandfor 속성으로 <dialog> 요소를 제어합니다. 버튼에 commandfor="dialog-id" command="show-modal"을, 취소 버튼에는 command="close"를 사용합니다. showModal()로 열린 대화 상자는 Escape 키로 자동 닫히고, closedby="any" 속성으로 배경 클릭 시 닫히는 “라이트 디스미스”를 활성화합니다. aria-labelledby, aria-describedby, role="alertdialog"를 통해 접근성을 확보합니다.

2. CSS 애니메이션 추가

@starting-style 규칙은 요소의 초기 상태를 정의하여 부드러운 진입 애니메이션을 구현합니다. displayoverlay 속성에 transition-behavior: allow-discrete를 적용하면 불연속적인 속성에도 전환 타이밍이 적용되어 종료 애니메이션이 가능해집니다. 이를 통해 순수 CSS만으로 세련된 대화 상자 전환 효과를 구현할 수 있습니다.

3. Turbo Confirm 시스템 통합

Turbo.config.forms.confirm 함수를 오버라이드하여 data-turbo-confirm 사용 시 사용자 정의 <dialog>를 표시합니다. application.html.erbid="turbo-confirm-dialog"를 가진 <dialog> 템플릿을 추가하고, 확인 버튼은 type="submit"form method="dialog"를 통해 returnValue로 사용자 응답을 감지합니다. 메시지 설정, data-turbo-confirm-button을 통한 버튼 텍스트 커스터마이징, 그리고 대화 상자를 여는 최소한의 JavaScript만 필요합니다. body:has(dialog:modal) { overflow: hidden; } CSS 규칙으로 모달이 열려 있는 동안 페이지 스크롤을 방지합니다.

결론

이러한 최신 브라우저 기능들을 활용하면, 기존에는 복잡한 JavaScript로 구현해야 했던 사용자 정의 확인 대화 상자를 순수 HTML과 CSS만으로 선언적으로 구현할 수 있습니다. 이는 개발 복잡성을 크게 줄이고, 성능을 향상시키며, 웹 표준을 준수하는 방식으로 사용자 경험을 개선합니다. 특히 Turbo와 같은 프레임워크와의 통합을 통해, 기존 시스템의 편리함은 유지하면서도 현대적이고 일관된 UI/UX를 제공할 수 있게 됩니다.

댓글 0

로그인이 필요합니다

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

로그인 하러 가기

아직 댓글이 없습니다

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