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
클래스는 도메인 로직을 처리하도록 유연하게 설계할 수 있습니다. 또한, 컨트롤러 개념이 없어 백엔드와 프론트엔드의 컨트롤러 혼동이 없으며, 모나드, 대수적 데이터 타입 등 복잡한 개념을 강요하지 않아 개발자가 비즈니스 로직에 집중할 수 있도록 돕습니다.