Rails에서 Stimulus와 Tailwind를 이용한 라이트/다크 모드 구현

Rails Dark Mode with Tailwind CSS and Stimulus | Unagi

작성자
jeff
발행일
2025년 08월 19일

핵심 요약

  • 1 Rails 애플리케이션에 Stimulus와 Tailwind CSS를 활용하여 라이트/다크 모드를 효과적으로 구현하는 방법을 제시합니다.
  • 2 사용자 시스템 설정 존중, 로컬 스토리지 테마 유지, 초기 로드 시 깜빡임 방지 등 견고한 구현 전략을 상세히 설명합니다.
  • 3 Tailwind의 유틸리티 클래스와 Stimulus 컨트롤러의 조합으로 개발 편의성과 사용자 경험을 동시에 향상시키는 솔루션을 제공합니다.

도입

많은 Rails 애플리케이션이 복잡한 CSS 관리나 미흡한 사용자 경험으로 인해 적절한 다크 모드 지원이 부족한 실정입니다. 개발자의 80% 이상이 다크 인터페이스를 선호하며, 다크 모드는 저조도 환경에서 눈의 피로를 최대 60%까지 줄이고 OLED 기기에서 배터리 절약 및 접근성 향상에 기여합니다. 본 문서는 Tailwind CSS와 Stimulus를 결합하여 Rails 애플리케이션에 우아하고 유지보수 가능한 다크 모드 기능을 구현하는 단계별 접근 방식을 제시하며, Tailwind의 내장 다크 모드 유틸리티와 Stimulus의 반응형 컨트롤러를 활용한 상태 관리 및 영속성 유지 방법을 중점적으로 다룹니다.

1. Tailwind CSS 다크 모드 설정

tailwind.config.js 파일에서 darkMode: ['class', '[data-theme="dark"]] 설정을 통해 부모 요소에 dark 클래스 또는 data-theme 속성이 존재할 때 다크 스타일을 적용하도록 구성합니다. 이는 다크 모드 활성화 시점을 완벽하게 제어할 수 있게 하여 유연성을 제공합니다.

2. Stimulus 컨트롤러 생성

theme_switcher_controller.js 파일을 생성하여 테마 전환 및 영구 저장을 담당합니다. 이 컨트롤러는 다음 세 가지 주요 기능을 수행합니다: * 최초 방문 시 사용자의 시스템 환경 설정을 존중합니다. * 향후 방문을 위해 로컬 스토리지에 사용자 선택을 기억합니다. * 사용자가 수동으로 테마를 토글할 때 DOM을 즉시 업데이트합니다. application.html.erb<html> 태그에 data-controller="theme-switcher"data-theme="dark"를 연결하여 컨트롤러를 활성화합니다.

3. 테마 깜빡임 방지

JavaScript 로드 전에 잘못된 테마 콘텐츠가 잠깐 보이는 현상(FOUC)을 방지하기 위해 _theme_check.html.erb에 작은 인라인 스크립트를 추가합니다. 이 스크립트는 Stimulus 컨트롤러의 테마 감지 로직을 복제하되, 문서 헤드에서 동기적으로 실행되어 느린 연결에서도 사용자가 잘못된 테마를 경험하지 않도록 보장합니다.

4. 모든 요소 연결

메인 레이아웃인 application.html.erb에 테마 방지 스크립트를 포함하고, <body> 태그에 초기 테마 클래스(bg-white dark:bg-gray-900 text-gray-900 dark:text-white)를 적용합니다. 또한, data-theme-switcher-target="toggler"data-action="click->theme-switcher#toggle" 속성을 가진 토글 버튼을 추가하여 테마 전환 기능을 제공합니다.

5. 테마 인식 스타일 작성

모든 컴포넌트에 dark: 접두사를 사용하여 Tailwind의 다크 모드 유틸리티를 적용함으로써, 컴포넌트가 현재 테마에 따라 자동으로 스타일을 조정하도록 합니다. 이는 깔끔하고 유지보수 가능한 스타일링을 가능하게 합니다.

6. 견고성 향상

  • 부드러운 전환 추가: body 요소에 transition 속성을 추가하여 테마 전환 시 배경색 및 텍스트 색상에 부드러운 애니메이션 효과를 부여합니다. preload 클래스를 사용하여 페이지 로딩 중에는 애니메이션을 비활성화합니다.
  • Turbo 내비게이션 처리: Turbo 이벤트를 활용하여 preload 클래스를 적절한 시점에 추가하거나 제거함으로써, Turbo 내비게이션 중 테마 전환 애니메이션이 잘못 트리거되는 것을 방지합니다. DOMContentLoaded, turbo:visit, turbo:load 이벤트 리스너를 사용합니다.

결론

Tailwind의 유틸리티 우선 접근 방식과 Stimulus의 경량 컨트롤러를 결합한 이 다크 모드 구현은 개발자 친화적이면서도 사용자 친화적인 솔루션을 제공합니다. 사용자는 적절한 영속성과 시각적 결함 없는 즉각적인 테마 전환을 경험할 수 있으며, 개발자는 복잡한 CSS 변수 관리 없이 깔끔하고 유지보수 가능한 코드베이스를 확보할 수 있습니다. 이러한 통합은 Rails 애플리케이션의 사용자 경험과 개발 효율성을 동시에 향상시키는 효과적인 방법입니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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