Inertia.js와 Rails를 활용한 사고방식: SPA 개발의 간소화

Brandon Shar, Svyatoslav Kryukov, and Brian Knoles: Inertia Rails workshop. SF Ruby Conference 2025

작성자
Evil Martians
발행일
2026년 01월 22일

핵심 요약

  • 1 Inertia.js는 Rails의 MVC 모놀리스 구조를 유지하면서 React, Vue, Svelte와 같은 최신 JavaScript 프레임워크를 뷰 레이어로 활용하여 단일 페이지 애플리케이션(SPA) 경험을 제공하는 프로토콜입니다.
  • 2 복잡한 GraphQL/JSON API, JWT, 클라이언트 측 상태 관리 없이 Rails가 주도하는 방식으로 개발을 간소화하며, Turbolinks에서 영감을 받아 서버 응답에 따라 JSON 데이터만 교환하여 프런트엔드를 업데이트합니다.
  • 3 부분 새로고침(partial reloads), 지연 속성(deferred props), `inertia share` 같은 기능을 통해 효율적인 데이터 관리와 성능 최적화를 지원하며, `Alba` 및 `Typealizer`와 같은 도구로 백엔드에서 TypeScript 타입을 자동 생성하여 개발 생산성을 높입니다.

도입

본 발표는 Inertia.js와 Ruby on Rails를 함께 사용하여 단일 페이지 애플리케이션(SPA)을 구축하는 방법에 대한 심층적인 통찰력을 제공합니다. Inertia.js는 Rails 개발자가 익숙한 MVC 모놀리스 아키텍처의 장점을 유지하면서 React, Vue, Svelte와 같은 현대적인 JavaScript 프레임워크를 뷰 레이어로 활용할 수 있도록 설계된 '프로토콜'입니다. 연사들은 Inertia Rails 어댑터의 핵심 유지보수자로서, 복잡한 클라이언트-서버 통신을 간소화하고 개발 경험을 향상시키는 Inertia의 철학과 실제 적용 사례를 소개합니다.

Inertia.js의 핵심 원칙 및 작동 방식

Inertia.js는 클라이언트 측 JavaScript 라이브러리와 서버 측 어댑터(Rails용 inertia-rails 젬)로 구성됩니다. 그 작동 방식은 다음과 같습니다:

  • 초기 요청: Rails는 단일 div 안에 JSON 데이터가 포함된 전체 HTML 페이지를 반환합니다. 클라이언트 측 Inertia는 이 JSON을 추출하여 React, Vue 또는 Svelte 컴포넌트 트리를 렌더링합니다.

  • 이후 요청: 사용자가 애플리케이션과 상호작용할 때, Rails 서버는 JSON 데이터만 반환하고, Inertia는 이 새로운 데이터를 기존 컴포넌트 트리에 교체하여 다시 렌더링합니다. 이는 Turbolinks의 페이지 전환 방식과 유사하게 작동하여 전체 페이지 새로고침 없이 SPA 경험을 제공합니다.

Inertia Rails의 개발 원칙

Inertia는 Rails 개발자에게 익숙한 방식으로 개발할 수 있도록 다음 원칙을 강조합니다:

  • HTTP 활용: 전통적인 Rails 애플리케이션처럼 링크를 사용하고 서버 요청을 통해 데이터를 변경하는 등 HTTP를 적극적으로 활용합니다.

  • Rails 주도: 서버(Rails)가 애플리케이션의 상태를 관리하고 라우트를 정의하며, 프런트엔드의 복잡성을 백엔드로 옮겨 React는 뷰 레이어 역할에 집중합니다.

  • React를 뷰 레이어로: React는 주로 UI 요소에 대한 로컬 상태만 관리하며, 서버로부터 전달된 props를 기반으로 렌더링되어 단방향 데이터 흐름을 유지합니다.

  • 페이지를 계약으로: Inertia는 애플리케이션을 ‘페이지’ 단위로 분할하며, 각 페이지는 뷰 모델과 유사하게 작동하여 데이터와 로직을 캡슐화합니다.

주요 기능 및 데모 시연

발표에서는 다양한 데모를 통해 Inertia Rails의 주요 기능을 시연했습니다:

  • 빠른 시작: rails newinertia-rails 제너레이터를 통해 Vite, TypeScript, React, TailwindCSS가 포함된 Inertia 앱을 손쉽게 설정하는 과정을 보여주었습니다.

  • inertia linkinertia form: SPA 내비게이션을 위한 inertia link 컴포넌트와 Rails의 유효성 검사를 자동으로 처리하는 inertia form의 사용법을 시연했습니다.

  • inertia share: 애플리케이션 전반에 걸쳐 플래시 메시지나 로그인 사용자 정보와 같은 공통 데이터를 공유하는 방법을 설명했습니다. 람다를 사용하여 속성 평가를 지연시켜 성능을 최적화하는 기법도 소개되었습니다.

  • 버전 관리: 클라이언트와 서버 간 버전 불일치 시 자동으로 전체 페이지를 새로고침하여 오래된 JavaScript 코드로 인한 문제를 방지하는 기능을 시연했습니다.

  • 부분 새로고침(Partial Reloads) 및 지연 속성(Deferred Props): 특정 데이터만 부분적으로 새로고침하거나(예: 실시간 검색 결과), 느린 데이터를 비동기적으로 로드하여 초기 페이지 로드 속도를 향상시키는 only 옵션과 deferred prop의 활용법을 보여주었습니다.

  • 외부 프로토콜 통합: Action Cable(WebSocket)을 사용하여 실시간 채팅 기능을 구현하며, client-side visit을 통해 Inertia 페이지 객체에 WebSocket으로 수신된 데이터를 병합하여 React 컴포넌트를 업데이트하는 방법을 시연했습니다. 이는 Inertia 프로토콜 외부의 데이터를 통합하는 유연성을 보여줍니다.

  • AlbaTypealizer: Rails 백엔드에서 Alba 시리얼라이저와 Typealizer 플러그인을 사용하여 TypeScript 타입을 자동 생성함으로써 프런트엔드 개발의 편의성과 안정성을 극대화하는 방법을 소개했습니다.

점진적 도입 및 공존

Inertia는 기존 Rails 애플리케이션에 점진적으로 도입될 수 있습니다. 특정 페이지나 섹션만 Inertia로 전환하고, 나머지 부분은 기존 Rails 뷰(ERB)를 유지하는 것이 가능합니다. 이는 Devise와 같은 기존 Rails 젬과의 원활한 공존을 통해 입증되었습니다. Inertia는 Rails 라우트를 진입점으로 사용하므로, Inertia 경로로 진입하면 SPA 경험이 시작되고, Inertia가 아닌 경로로 이동하면 일반적인 Rails 페이지 로딩이 발생합니다.

결론

Inertia.js는 Ruby on Rails 개발자들에게 React, Vue, Svelte와 같은 강력한 프런트엔드 프레임워크를 활용하면서도 Rails의 익숙한 개발 패러다임을 유지할 수 있는 매력적인 대안을 제시합니다. 복잡한 API 계층 없이 서버가 주도하는 SPA 개발을 가능하게 하여, 개발 복잡성을 줄이고 생산성을 높이는 데 기여합니다. `inertia share`, `partial reloads`, `deferred props`, 그리고 `Alba` 및 `Typealizer`와 같은 도구들의 활용은 Inertia Rails가 제공하는 강력한 개발 경험을 더욱 풍부하게 합니다. 이는 기존 Rails 애플리케이션의 현대화 또는 새로운 SPA 구축에 있어 매우 효율적이고 실용적인 솔루션으로 평가됩니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

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