Brut - Ruby를 위한 새로운 웹 프레임워크
(naildrivin5.com)- Ruby 생태계를 위한 “낮은 추상화, 낮은 의식주의(low-ceremony)” 기반의 심플하고 강력한 웹 프레임워크로, 컨트롤러, REST 리소스 개념 없이 페이지·폼·단일 액션 중심 구조를 제공
- 서버 렌더링 HTML, 직접 JS/CSS 작성, OpenTelemetry 연동, Sequel·OptionParser 등 현대 Ruby 도구 내장, 설치와 개발이 수분 내로 가능
- 클래스 기반 구조, 실제 타입 기반 세션·폼·파라미터 관리, 동적 메소드·해쉬 사용 최소화로 명확한 코드·자동 문서화를 지향
- 최신 웹 플랫폼 활용: 서버·클라이언트 검증 통합, BrutJS(Web Components), esbuild로 CSS 번들·해시, 보안 정책과 DB 설계 기본기 강화
- YAML 최소화, Ruby/Hash 기반 설정과 명확한 네이밍·역할 분리, 불필요한 추상화나 패턴 강요 없이 Ruby와 브라우저 기술을 즐겁게 활용하는 것이 목표
Brut 프레임워크 주요 특징
완전히 새로운 구조 – 컨트롤러 없이 페이지 중심
- 컨트롤러, REST 리소스, 라우트 액션 대신 클래스 기반 페이지, 폼, 단일 액션 핸들러로 구성
- HTML은 서버에서 직접 생성, JS/CSS는 원하는 대로 작성 가능
- 예시: 시간 표시 페이지는
TimePage < AppPage
로 바로 정의
현대적인 웹 플랫폼 적극 활용
- 서버·클라이언트 검증 통합된 폼 UX
- BrutJS(웹 컴포넌트 라이브러리)로 HTML 점진적 확장 지원
- esbuild로 CSS 번들·해시 적용, PostCSS나 SASS 없이 간결하게 처리
개발 생산성·기본기 내장
- OpenTelemetry 기반 인스트루먼트, Sequel 기반 데이터 액세스, OptionParser 기반 명령행 자동화
- 기본 보안정책, DB 컬럼/외래키 기본값/인덱스, 항상 timezone-aware한 시간, 간편한 로케일(Localization)
- RSpec 테스트, Faker/FactoryBot으로 데이터 생성, Phlex로 HTML 생성
YAML 배제, 명확한 설정 구조
- I18n은 Ruby Hash 기반, 동적 설정은 dotenv로 관리 (YAML 거의 사용하지 않음)
- docker-compose만 예외적으로 YAML 사용
불필요한 추상화나 패턴 강요 없음
- 네이밍·구조 명확(예:
WidgetsPage
는/widgets
로 접근) - 데이터 계층(DB::Widget)과 도메인 계층(Widget) 완전히 분리 가능
- 컨트롤러 개념 없음, 원하는 방식대로 비즈니스 로직 구현 가능
- 복잡한 함수형 패턴, 모나드, Proc 등 강요 X
개발 경험·유연성
- RSpec 등 현대 Ruby 생태계 도구 기본 내장
- Phlex(HTML), Faker/FactoryBot, Sequel, OpenTelemetry 등 주요 라이브러리 적극 활용
- 반복적 보일러플레이트/설정/의사결정에서 벗어나, Ruby와 브라우저 기술의 “재미”에 집중
왜 Brut인가?
- Rails 등 기존 프레임워크의 반복적 셋업, 끊임없는 설계·구조 논쟁, 불필요한 유연성 대신 코드 자체의 즐거움을 추구
- 빠르게 구축, 개발과 배포를 즐길 수 있는 Ruby 기반 웹앱 프레임워크로서 생산성과 명확함에 집중
시작 및 향후 로드맵
- Brut 공식 Docker 이미지, 명령어 기반 빠른 앱 생성·실행 지원
- ADRs.cloud 등 실전 예시 앱 제공
- 1.0 버전 및 공식 로드맵 지속 업데이트 예정
Hacker News 의견
-
forms와 pages에 집중하는 방식이 마음에 듦, 나 역시 내 앱에서 이런 접근법을 사용함, 모든 상호작용은 Forms와 Links가 주도함, JavaScript로 하는 모든 향상도 사실상 기존에 존재하는(숨겨진 것까지 포함하여) form을 클릭하는 수준임, HTML을 항상 직접 확인해서 어떤 경로(route)가 실제로 상호작용을 처리하는지 명확하게 알 수 있음, controllers는 과도하게 사용된다고 봄, 실제로는 forms와 models(백엔드), 그리고 views(Pages)만 있어도 충분함, 많은 validation이나 controller에서 반복되는 절차들도 framework가 더 세련되게 처리할 수 있음
- 폼을 클릭 이벤트로 시뮬레이션하는 이유가 궁금함, submit() 을 직접 호출하는 것과 무슨 차이가 있는지 궁금함
-
monad, algebraic data types, currying, 혹은 모든 것을 Proc로 처리하는 등 복잡한 개념들을 꼭 이해할 필요는 없다는 설명이 마음에 듦, 비즈니스 로직에서 functor를 사용하고 싶다면 얼마든지 선택할 수 있음, 이런 유연함이 마음에 들어서 소수의 숙련된 동료와 함께하는 사이드 프로젝트에 사용해보고 싶은 느낌임
-
이 프레임워크는 Sinatra의 간결함과 Rails의 풍부함 사이의 훌륭한 중간지점이 될 것 같음, 나는 간단한 앱엔 Sinatra를, 필요에 따라 Rails를 사용해왔지만 복잡하지 않은 앱에는 Rails가 오히려 부담스러웠음, 새롭게 시도해보고 싶은 기대감이 있음
-
참고할 만한 선택지로 Roda도 있음, 소규모 프로젝트에서 최적이었고 확장성도 좋았음, plugin 시스템 덕분에 기능 확장이 쉬웠고 routing tree도 다루기 쉬웠음
-
내게는 hanami가 최고의 중간지점이었지만, 앞으로 bruts의 발전을 예의주시할 예정임
-
-
David의 책 Sustainable Rails를 정말 좋아하고, 내가 Rails 관련해서 항상 추천하는 서적임, 이번 프레임워크의 접근방식이 인상 깊음, 이런 작은 대안적 프레임워크 중 하나가 Sorbet를 완벽히 도입해서 form validation 등에 활용한다면 정말 흥미로울 것 같음, 물론 gradual typing 접근과는 상반될 수 있긴 하겠지만 실험적으로라도 재미있을 것 같음
-
David는 아주 재능 있는 개발자일 뿐 아니라 강연도 훌륭하게 함, 책의 주제와 맞닿은 영상 강연도 추천함: https://www.youtube.com/watch?v=CRboMkFdZfg
-
Sorbet도 좋지만 구조 강제 및 데이터 검증(data validation)에는 개인적으로 dry-rb 생태계가 더 선호됨
-
-
이 프레임워크가 특이한 라이선스를 사용하는 건 알겠음, 그런데 이게 혹시 소스코드를 볼 수 없다는 의미인지 궁금함
-
github에서 소스를 확인할 수 있음: https://github.com/thirdtank/brut
-
라이선스가 조금 이상하게 느껴지는 점에는 공감함
-
-
이 프로젝트를 보니 예전 Camping 프레임워크가 떠오름, 다만 동적 부모 클래스 생성자가 없는 점이 다름
-
브루트(Brut)의 공식 사이트(https://brutrb.com/overview.html)도 흥미로운 내용이 많았음
-
샘플 사이트에서 로그인을 시도했지만 github 인증 이후 바로 오류를 만남
- 작성자임, 현재는 남용 방지를 위해 샘플 사이트에서 로그인 자체를 막아둠, 오늘 갑자기 공개 결정을 해서 누구나 로그인을 허용할 준비가 아직 안 됨, 로컬에서 실행하거나 https://brutrb.com/adrs.html에서 페이지 탐색 및 링크 클릭이 가능함
-
Ruby는 아직 사용하지 않지만 프로젝트에 관심이 생겨서 별표(Star)를 눌렀음, 이 프로젝트가 Ruby를 실제로 써보는 계기가 될지도 모름
-
특히 Phlex 선택이 마음에 들었음, 개인적으로 이 프레임워크가 Datastar js 라이브러리 및 그 라이브러리의 SSE(서버 전송 이벤트) 활용과도 잘 맞을지 궁금함, 고마움