Joel은 Ruby 프로그래밍 언어에 대한 깊은 애정을 표현하며, Ruby가 아이디어를 표현하고 추상화를 생성하는 데 있어 매우 유연하고 독보적인 언어라고 설명합니다. 그는 추상화가 개념을 찾고 좋은 이름과 인터페이스를 부여한 뒤 종속성을 줄이는 과정이며, 이는 코드의 일관성을 높이고 변경을 용이하게 한다고 강조합니다. 특히 ‘잘못된 추상화는 없다’는 과감한 주장을 펼치며, 추상화를 통해 코드를 줄이는 것이 장기적으로 코드 변경을 더 쉽게 만든다고 역설합니다. 이러한 철학은 ‘Flex’라는 새로운 Ruby 라이브러리 개발의 기반이 됩니다.
강연은 프론트엔드 개발로 전환되며, Tailwind CSS에 대한 Joel의 견해를 공유합니다. 그는 Tailwind의 유틸리티 클래스 기반 접근 방식이 특정 상황에서는 유용하지만, ‘의미론적 클래스 이름’을 통해 재사용 가능한 개념을 명명하는 Ruby의 방식과 상충될 수 있음을 지적합니다. 이어서 Joel은 ‘Flex’를 소개합니다. Flex는 Ruby에서 객체 지향 컴포넌트를 설계하기 위한 라이브러리로, 단순한 템플릿 언어나 HTML 생성을 위한 DSL이 아닙니다. Flex의 핵심은 HTML의 의미론(요소, 속성, 중첩)을 Ruby 구문(메서드, 키워드 인수, 블록)에 직접 매핑한다는 점입니다. 이러한 접근 방식은 Ruby의 강력한 기능을 활용하여 뷰를 더욱 구조적이고 안전하게 만듭니다.
Flex의 주요 특징은 다음과 같습니다. 기본적으로 XSS(Cross-Site Scripting) 공격을 구조적으로 방지하며, 컴포넌트가 전달받은 데이터에만 의존하도록 설계되어 테스트와 재사용이 용이합니다. Capybara, RSpec 등 다양한 테스트 헬퍼를 지원하며, Rails 자체 외에는 다른 의존성이 없습니다. 또한, 응답 스트리밍을 지원하여 Time to First Byte(TTFB)를 단축하고, 특정 DOM ID를 대상으로 뷰를 렌더링하여 Hotwire(Turbo Frames)와 같은 부분 업데이트에 최적화되어 있습니다. 컴포넌트 키트를 통해 프로젝트 간 재사용 및 커뮤니티 공유가 가능하며, 매우 빠른 렌더링 속도(초당 약 1기가바이트)를 자랑합니다. Flex는 Rails의 모든 헬퍼와 ViewComponent, Action View, Stimulus, Turbo, Tailwind 등 기존 Rails 생태계와도 잘 통합됩니다. 무엇보다 ‘그냥 Ruby’이기 때문에 기존 Ruby 개발 기술과 도구(Ruby LSP, Solargraph 등)를 그대로 활용할 수 있습니다.
Joel은 실제 데모를 통해 Flex의 사용법을 시연합니다. Heading 렌더링, Nav 컴포넌트의 중첩 및 세부 구현 캡슐화, Tabs 컴포넌트에서 ‘deferred rendering’을 통한 링크와 콘텐츠의 분리 렌더링, 그리고 Table 컴포넌트에서 column
메서드를 사용하여 동적으로 테이블을 구성하는 예시를 보여줍니다. 이러한 예시들은 Flex가 코드의 중복을 줄이고, 뷰 로직을 응집력 있게 구성하며, 유연한 인터페이스를 제공함을 명확히 보여줍니다. 또한, Ruby의 일반적인 리팩토링 기법을 뷰 코드에 그대로 적용할 수 있어 대규모 뷰도 쉽게 관리할 수 있음을 강조합니다.