Brut: Ruby를 위한 새로운 웹 프레임워크

Brut: A New Web Framework for Ruby

작성자
발행일
2025년 07월 08일

핵심 요약

  • 1 Brut은 컨트롤러, 동사, 리소스 개념 없이 페이지, 폼, 단일 액션 핸들러를 중심으로 하는 Ruby용 웹 프레임워크입니다.
  • 2 낮은 추상화와 간결함을 지향하며, 내장된 계측, 데이터 접근 계층, 개발 자동화를 통해 생산성을 높입니다.
  • 3 설치 및 사용이 용이하고 현대 웹 플랫폼을 활용하며, 불필요한 복잡성을 제거하여 Ruby 웹 개발의 즐거움을 목표로 합니다.

도입

Brut은 Ruby 언어를 위한 혁신적인 웹 프레임워크로, 기존의 일반적인 웹 프레임워크 패러다임과는 차별화된 접근 방식을 제시합니다. 본 프레임워크는 전통적인 컨트롤러, 동사(verbs), 리소스 개념을 배제하고, 대신 개별 페이지, 폼, 그리고 단일 액션 핸들러를 중심으로 애플리케이션을 구축하도록 설계되었습니다. 서버 사이드에서 HTML을 직접 생성하는 방식을 채택하며, 개발자가 필요한 JavaScript와 CSS를 자유롭게 작성할 수 있는 유연성을 제공합니다. Brut은 낮은 추상화 수준과 간결한 구성을 지향하지만, Sinatra와 같은 저수준 프레임워크와는 달리 웹 프레임워크로서의 충분한 기능을 내재하고 있습니다.

Brut은 웹 프레임워크로서 다양한 핵심 기능을 내장하고 있습니다. OpenTelemetry 기반의 계측 기능, Sequel 기반의 강력한 데이터 접근 계층, 그리고 OptionParser 기반의 커맨드라인 애플리케이션을 통한 개발 자동화 기능을 기본으로 제공하여 개발 생산성을 향상시킵니다. 특히, Brut은 설치 및 앱 구축 과정이 매우 간편합니다. Ruby를 별도로 설치할 필요 없이 Docker를 활용하여 몇 분 이내에 새로운 애플리케이션을 생성하고 실행할 수 있으며, 이는 개발 진입 장벽을 크게 낮춥니다. 예를 들어, docker run thirdtank/mkbrut mkbrut my-new-app 명령어를 통해 손쉽게 시작할 수 있습니다.

Brut의 핵심 설계 원칙은 다음과 같습니다:

  • 객체 지향 설계: Brut은 클래스가 객체로 인스턴스화되고 그 위에 메서드가 호출되는 순수한 객체 지향 설계를 따릅니다. 이는 과도한 include 호출로 인한 거대한 함수 덩어리 생성을 지양하며, 세션, 플래시, 폼 파라미터 등 모든 데이터가 실제 클래스와 정의된 데이터 타입으로 처리됩니다. 또한, 동적으로 정의되는 메서드나 method_missing의 의존도를 최소화하고, 대부분의 메서드에 명확한 문서가 제공되어 코드의 가독성과 유지보수성을 높입니다.

  • 현대 웹 플랫폼 활용: 클라이언트-사이드와 서버-사이드 폼 유효성 검사를 통합하여 사용자에게 일관된 경험을 제공합니다. BrutJS는 HTML을 점진적으로 향상시키는 자율적인 커스텀 요소(웹 컴포넌트) 라이브러리를 제공합니다. 또한, esbuild를 통해 일반 CSS를 즉시 패키징, 최소화, 해싱할 수 있어 PostCSS나 SASS와 같은 추가 도구 없이도 효율적인 CSS 관리가 가능합니다.

  • 좋은 개발 관행 기본 설정: Brut은 개발자가 별도로 설정하지 않아도 합리적인 콘텐츠 보안 정책(CSP)을 기본으로 제공합니다. 데이터베이스 컬럼은 기본적으로 null을 허용하지 않으며, 외래 키는 항상 존재하고 인덱싱되며 null을 허용하지 않도록 설정됩니다. 시간 처리는 Brut의 Clock을 통해 항상 시간대 인식(timezone-aware) 방식으로 이루어지며, 지역화(localization) 기능 또한 쉽게 사용할 수 있도록 구현되어 있습니다.

  • 훌륭한 Ruby Gems 활용: 테스트 프레임워크로는 RSpec을 사용하며, Brut은 테스트 코드 작성을 용이하게 하는 커스텀 매처를 포함합니다. 개발 및 테스트 데이터 설정을 위해 Faker와 FactoryBot을 활용합니다. HTML 생성에는 Phlex를 사용하며, HAML은 지원하지 않습니다.

  • YAML 없는 설정: 국제화(I18n)는 i18n gem을 사용하며, 번역은 Ruby Hash에 저장되어 YAML 파일을 사용하지 않습니다. 동적 설정은 환경 변수에 기반하며 dotenv gem으로 개발 및 테스트 환경에서 관리됩니다. (예외적으로 개발 환경의 docker-compose.dx.yml 파일만 YAML을 사용합니다.)

  • 불필요한 추상화 제거: Brut은 개발자가 불필요한 추상화로 인해 혼란을 겪는 상황을 방지합니다. 예를 들어, ‘위젯 리소스의 인덱스 액션인가, 아니면 위젯 목록 리소스의 쇼 액션인가?’와 같은 질문은 Brut에서는 발생하지 않습니다. 페이지 이름과 URL이 직관적으로 연결되어 (WidgetsPage/widgets에서 사용 가능) 코드의 의도를 명확히 합니다. 데이터 접근 로직과 도메인 로직을 분리하여 DB::Widget은 데이터 검색을 담당하고, Widget 클래스는 도메인 로직을 처리하도록 유연하게 설계할 수 있습니다. 또한, 컨트롤러 개념이 없어 백엔드와 프론트엔드의 컨트롤러 혼동이 없으며, 모나드, 대수적 데이터 타입 등 복잡한 개념을 강요하지 않아 개발자가 비즈니스 로직에 집중할 수 있도록 돕습니다.

결론

Brut의 개발자는 기존 Rails 앱의 상용구 코드에 대한 피로감, RSpec 설정의 반복적인 번거로움, 프론트엔드 솔루션의 잦은 변경, 비즈니스 로직의 위치에 대한 논쟁, 그리고 HTTP 메서드 사용에 대한 불필요한 논의 등 현재 웹 개발 환경에서 흔히 발생하는 문제점들에 대한 깊은 불만에서 Brut을 시작했음을 밝힙니다. 그는 웹 앱 개발 과정에서 즐거움을 되찾고, Ruby 언어의 강점과 HTML의 유연성, 그리고 현대 브라우저의 강력한 기능을 최대한 활용하고자 하는 명확한 목표를 가지고 있습니다. 끝없는 유연성, 지속적인 아키텍처 결정, 그리고 중요하지 않은 것에 대한 무의미한 논쟁을 피하고 싶다는 개발 철학이 Brut에 반영되어 있습니다. 개발자는 Brut의 1.0 버전 출시를 목표로 지속적으로 작업할 예정이며, 이 프레임워크를 통해 다른 개발자들도 웹 앱 개발의 즐거움을 경험하기를 희망하고 있습니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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