Yippee 프레임워크는 “사람들이 Ruby를 배우게 만들 정도로 훌륭한 프레임워크”를 목표로, 각 레이어에 대한 신중한 접근 방식을 취하고 있습니다. 현재 여러 핵심 영역에서 상당한 진전을 이루고 있으며, 주요 개발 컴포넌트들은 다음과 같습니다.
핵심 컴포넌트 현황
-
Phlex: 서버 렌더링 HTML 및 SVG 뷰를 구축하는 혁신적인 방식으로, Yippee의 서버 측 뷰 레이어를 담당합니다.
-
Literal: 런타임 타입 검사를 통해 객체 속성 정의를 위한 인터페이스를 제공하여 버그를 줄입니다.
-
Quickdraw (WIP): 멀티코어 병렬화를 지원하는 초고속 Ruby 테스트 러너로, 수만 개의 테스트를 수 밀리초 만에 실행합니다.
-
Plume (WIP): Ruby로 작성된 SQLite 파서로, 마이그레이션 및 쿼리 빌딩과 관련된 데이터베이스 기능을 구동합니다.
-
Canopy (private): 라우팅 트리 기반 라우터로 컨트롤러 레이어를 담당하며, 이전에는 “Yippee Router”로 불렸습니다.
-
Refract: AST 수준의 Ruby 리라이터로, Phlex 컴파일러를 구축하는 데 사용됩니다.
-
Strict Ivars: 정의되지 않은 인스턴스 변수 참조 시 오류를 발생시켜 Literal과 함께 버그 방지에 기여합니다.
-
Good Cop: 자동 수정에 최적화된 Rubocop 규칙 집합입니다.
Yippee의 핵심 철학 및 목표
-
높은 레버리지: 소수의 인원으로 유지보수 가능하며, 한 사람이 대규모 앱을 구축 및 배포할 수 있을 만큼 작고 단순합니다.
-
극도의 속도: 앱 부팅 40ms, 1만 개 테스트 1초, 프로덕션 배포 1초를 목표로 하며, 개발자 작업 흐름의 속도 최적화를 강조합니다.
-
멀티코어 성능: 개발 및 프로덕션 환경 모두에서 머신의 최대 리소스를 활용하여 최적의 성능을 제공합니다.
-
SQLite 단독 지원: 주 데이터, 캐시, 작업 큐에 SQLite를 사용하며, 앱과 데이터베이스 간의 지연 시간이 없어 N+1 쿼리를 이점으로 활용합니다.
-
수직 확장: 단일 머신으로도 엄청난 성능을 달성할 수 있음을 강조하며, 단순한 확장 모델을 제시합니다.
-
최소한의 타입: Literal을 통해 필요한 만큼의 런타임 타입 검사를 제공하여 개발 생산성을 높입니다.
-
최소 설정: Rails와 달리 생성되는 설정 파일을 최소화하여 업그레이드 및 커스터마이징을 단순화합니다.
-
라우팅 트리: Roda에서 영감을 받은 라우팅 트리 구조로, 유연하고 빠른 라우팅을 가능하게 합니다.
-
완전 통합: 모든 컴포넌트가 긴밀하게 통합되어, 예를 들어 뷰 테스트 시 실제 HTML 렌더링 없이도 검증 가능합니다.
-
풀 스택: 백엔드와 프론트엔드(CSS, TypeScript, Svelte) 모두를 지원하는 통합 개발 경험을 제공합니다.
-
자동 로딩 및 Bootsnap: Zeitwerk 기반의 자동 로딩과 RubyVM 명령어 배포를 통해 빠른 시작 및 배포 시간을 확보합니다.
-
Svelte 또는 Phlex: SPA(Svelte)와 서버 렌더링(Phlex) 모델을 유연하게 조합하여 다양한 애플리케이션 요구사항을 충족합니다.
-
하이브리드 작업 러너: 단일 서버 배포에 최적화된 SQLite 기반의 유연한 작업 큐를 제공합니다.
-
선언적 마이그레이션: 원하는 스키마를 선언하면 프레임워크가 마이그레이션을 자동 생성합니다.
-
매핑된 데이터베이스 이름: 사용자 친화적인 이름이 데이터베이스의 고정 식별자에 매핑되어 이름 변경을 용이하게 합니다.
-
신속한 배포: Yippee 앱 생성부터 프로덕션 배포까지 단 몇 분, 이후 배포는 1초를 목표로 합니다.
-
불변 모델 레이어: 모델을 단순한 불변 객체(Literal::Data)로 분리하여 데이터베이스 레이어와 명확히 구분합니다.
-
조합 가능한 SQL: 모든 SQL 쿼리를 Ruby 해시로 표현하여 Ruby 해시처럼 조합 가능하게 합니다.
-
아름다운 Ruby API: Ruby의 메타 프로그래밍 기능을 최대한 활용하여 간결하고 표현력 있는 코드를 작성합니다.
-
뷰 레이어에서의 SQL 쿼리 허용: SQLite 환경에서 N+1 쿼리가 이점이 되므로, 데이터 페칭을 데이터 사용 위치에 가깝게 배치합니다.