1. Rails 프론트엔드의 진화
- Rails 6 시대의 어려움: Webpacker, Rails.js, jQuery 등을 사용하며 프론트엔드 개발이 복잡하고 유지보수가 어려워, 많은 개발자가 React와 같은 외부 프레임워크를 병행 사용했습니다.
- Rails 7/8 시대의 르네상스: Webpacker 대신 Import Maps 및 ESBuild, Turbolinks/Rails.js 대신 Turbo Streams (재브랜딩된 js.b) 및 Turbo Drive, jQuery 대신 Stimulus가 도입되며 Rails 개발자에게 더 친숙하고 효율적인 프론트엔드 환경이 조성되었습니다.
- 현재의 Rails 프론트엔드: 5년 전보다 훨씬 쉬워졌으며, Stimulus와 Hotwire를 활용하면 React 프론트엔드 기능의 80-90%를 Rails 내에서 구현할 수 있습니다.
2. 신규 Rails 앱 시작 시 고려사항
- CSS 프레임워크 선택: 레거시 프로젝트에서는 Bootstrap이 사용되지만, 신규 프로젝트에는 Tailwind CSS가 표준으로 강력히 권장됩니다.
- JavaScript 번들러 선택: 단순한 Stimulus 컨트롤러나 경량 라이브러리 사용 시에는 기본 Import Maps가 적합하며, CSS를 포함한 많은 JavaScript 라이브러리를 가져올 경우 ESBuild가 더 효율적입니다.
3. 레이아웃 디자인: 반응형 접근
- 인기 앱들의 레이아웃 패턴: LinkedIn, Twitter 등은 데스크톱에서 고정된 내비게이션 바, 사이드바, 스크롤 가능한 메인 콘텐츠를 사용합니다.
- 모바일 우선 접근: 모바일 기기에서의 사용자 경험을 최우선으로 고려해야 합니다. 모바일 웹 앱에서는 햄버거 메뉴보다 하단 푸터 내비게이션을 사용하는 것이 더 나은 패턴입니다.
- 반응형 레이아웃의 시작: 앱을 반응형으로 만들려면 반응형 레이아웃 디자인부터 시작해야 하며, 데스크톱과 모바일 환경에 맞는 레이아웃 패턴(예: 데스크톱의 사이드바, 모바일의 푸터 내비게이션)을 Tailwind CSS를 활용하여 구현하는 예시가 제시됩니다.
4. 핵심 UI 요소 구현
- 페이지 컴포넌트: 반복되는 페이지 구조(제목, 부제목, 액션 영역, 메인 콘텐츠)를
ViewComponent
로 추상화하여 HTML 중복을 줄이고 일관된 디자인을 유지합니다. - 플래시 메시지: Rails 7에서는 외부 라이브러리 없이 Stimulus와
ViewComponent
만으로 자동 제거 및 클릭하여 닫기가 가능한 플래시 메시지를 구현할 수 있습니다. - 활성 링크 강조:
active_link_to
젬 대신 몇 줄의 코드로 헬퍼 메서드를 만들어 현재 페이지 링크를 강조하고, 이에 대한 테스트 작성을 권장합니다.
5. 버튼 추상화 전략
- Tailwind 기본 권장 사항 비판: CSS 클래스를 복사-붙여넣기하는 방식은 비효율적이며,
ViewComponent
로 버튼을 만들면 복잡해질 수 있습니다. - Bootstrap API 재활용: Bootstrap의 버튼 API(예:
button-primary
,button-secondary
)를 Tailwind CSS에 커스텀 구현하여 재사용성과 유지보수성을 높이는 방법을 제안합니다. @apply
지시어 활용: Tailwind의@apply
지시어 사용은 권장되지 않지만, 모든 권장 사항을 맹목적으로 따르기보다 프로젝트에 적합한 판단을 내릴 것을 강조합니다.
6. Stimulus 활용 팁
- 작은 컨트롤러 지향: 페이지 전체를 관리하는 거대한 컨트롤러 대신, 재사용 가능한 작은 Stimulus 컨트롤러(예: 탭, 폼 미리보기, 클립보드 복사)를 만들 것을 권장합니다.
- 기존 라이브러리 활용: Guom Briay의 Stimulus 컴포넌트나 Julian Rubish의 Better Stimulus 가이드 등 기존 리소스를 활용하여 개발 효율성을 높입니다.
7. 네이티브 HTML 컴포넌트의 재발견
- 모든 경우에 JavaScript가 필요한 것은 아닙니다.
<details>
태그로 드롭다운을,<progress>
태그로 진행률 표시줄을 구현하는 등 네이티브 HTML 컴포넌트만으로도 충분한 경우가 많습니다.
8. Hotwire(Turbo Drive, Frames, Streams) 활용 전략
- Turbo Drive: 특별한 경우(예: 외부 웹사이트 리다이렉션)를 제외하고는 비활성화하지 않는 것이 좋습니다. 최신 Turbo 버전의 프리페치(prefetch) 기능이 의도치 않은 부작용을 일으킬 수 있으므로 주의해야 합니다.
- Turbo Frames & Streams: 페이지를 먼저 전체 페이지 리로드 방식으로 구축한 다음 반응성을 추가하며, Turbo Frames와 Streams는 서로 독립적으로 존재할 수 있음을 인지해야 합니다.
9. 피해야 할 ‘대죄’ 및 기타 팁
- 다크 모드: 라이트 모드와 다크 모드를 모두 구현하는 대신, 하나의 테마만 구축하여 CSS 복잡성과 유지보수 비용을 줄이는 것을 권장합니다.
- 아이콘 활용: 텍스트 대신 아이콘으로 기능을 표현하고, 404 페이지와 같은 에러 페이지도 사용자 경험을 고려하여 멋지게 디자인해야 합니다.
- 메타 태그 및 타이틀 태그: 각 페이지에 고유한 타이틀 태그와 Open Graph 메타 태그를 활용하여 검색 엔진 최적화 및 소셜 미디어 공유를 개선합니다.
- 스캐폴드 제너레이터 오버라이드: Rails 7의 기본 카드 목록 대신 테이블 형태의 스캐폴드를 선호하며, 기본 스캐폴드 제너레이터를 오버라이드하여 프로젝트에 맞게 변경할 수 있습니다.
- View Component 라이브러리: UK 정부의 View Component 라이브러리 등 기존 라이브러리를 활용하여 Rails 뷰 프로토타이핑 속도를 높일 수 있습니다.