React란
React는 Meta(구 Facebook)가 개발 · 유지하는 사용자 인터페이스 구축을 위한 JavaScript 라이브러리입니다. 선언적인 UI 기술과 컴포넌트 기반의 아키텍처가 특징으로, 소규모 위젯부터 풀 SPA까지 폭넓게 활용되고 있습니다. React의 핵심은 가상 DOM을 통한 효율적인 재렌더링입니다. 상태(state)가 변화하면 React는 차분만을 DOM에 반영하므로, 수동으로 DOM을 조작할 필요가 없습니다.이 페이지에서 설명하는 것은 React 19와 Inertia v3의 조합입니다. Laravel 13의 스타터 킷은 이 구성을 기본으로 사용합니다.
JSX와 TSX
React 컴포넌트는 JSX (JavaScript XML)라는 구문으로 작성합니다. HTML과 비슷한 표기법을 JavaScript 안에 직접 쓸 수 있습니다..tsx)가 표준 채택되어 있습니다. 타입 정의에 의해 IDE의 자동완성이 강화되고, 버그를 조기에 발견할 수 있습니다.
Laravel에서의 포지션
역사
React와 Laravel의 관계는 Vue보다 다소 짧지만, 현재는 동등 이상의 대우가 되어 있습니다. **Laravel 6 (2019년)**에서 인증 스캐폴드가laravel/ui 패키지로 분리되어, Vue와 함께 React 버전 스캐폴드도 제공되었습니다. 다만 당시에는 Vue가 주류였으며 React 버전의 존재감은 약한 상황이었습니다.
**Laravel Breeze (2021년)**에 Inertia + React 스택이 추가되면서 본격적인 채용이 시작되었고, **Laravel 12 (2025년)**의 스타터 킷 쇄신으로 React가 Vue와 완전히 동렬(오히려 먼저 표시됨)의 대우가 되었습니다.
현재의 주류 스타일: Inertia × React
현재 Laravel에서의 React 사용법의 중심은 Inertia × React입니다. Inertia는 API를 설계하지 않고 Laravel의 컨트롤러에서 직접 React 컴포넌트에 데이터를 전달할 수 있는 “모던 모놀리스” 아키텍처를 실현합니다.셋업
스타터 킷 경유 (권장)
신규 프로젝트에서 시작하는 경우에는 스타터 킷을 사용하는 것이 가장 손쉽습니다.inertiajs/inertia-laravel(서버사이드 어댑터)@inertiajs/react(클라이언트 어댑터)react+react-dom(React 19 본체)@vitejs/plugin-react(Vite 플러그인)- TypeScript +
@types/react - Tailwind CSS + shadcn/ui 컴포넌트 라이브러리
HandleInertiaRequests미들웨어- 로그인 · 회원가입 등의 인증 화면 (Inertia + React + TypeScript로 구현 완료)
수동 설치
기존 프로젝트에 추가하는 경우에는 서버사이드와 클라이언트사이드를 별도로 설치합니다.vite.config.ts에 React 플러그인을 추가합니다.
resources/js/app.tsx에서 Inertia 앱을 기동합니다.
수동 설치의 세부 내용(루트 템플릿 설정이나 미들웨어 등록 등)은 Inertia 공식 문서를 참고하세요.
디렉터리 구조
스타터 킷에서는 React의 페이지 컴포넌트를resources/js/pages/ 디렉터리에 배치합니다.
Inertia::render('posts/index', [...])이라고 쓰면 resources/js/pages/posts/index.tsx가 대응하는 컴포넌트가 됩니다.
JSX 구문의 기초
React는 JSX를 사용합니다. JavaScript 안에 HTML 라이크한 구문을 쓰는 스타일로, 스타터 킷의 코드를 읽기 위해 최소한 알아 두고 싶은 패턴을 소개합니다.{} — 변수 전개
JSX 내에서는 {}를 사용하여 JavaScript의 값이나 식을 삽입합니다.
조건 분기 — &&와 삼항 연산자
React에는 v-if에 해당하는 디렉티브가 없습니다. 심플한 조건에는 && 연산자, if/else에는 삼항 연산자 ? :를 사용합니다.
리스트 렌더링 — .map()
리스트 렌더링에는 Array.map()을 사용합니다. 효율적인 차분 갱신을 위해 key prop은 반드시 지정합니다.
v-for :key나 Svelte의 {#each}에 해당합니다.
className — CSS 클래스명
JSX는 JavaScript로 컴파일되므로, class는 예약어입니다. CSS 클래스에는 className을 사용합니다.
이벤트 핸들러 — 캐멀 케이스
JSX의 이벤트 속성은 캐멀 케이스이며, 함수의 참조를 전달합니다.페이지 컴포넌트의 기본
Inertia의 페이지 컴포넌트는 일반적인 React 컴포넌트입니다. Laravel의 컨트롤러에서 전달된 데이터를 props로 받을 수 있습니다.컨트롤러
React 페이지 컴포넌트
Link 컴포넌트
@inertiajs/react가 제공하는 <Link> 컴포넌트를 사용하면, 페이지 전환이 XHR로 이루어져 브라우저의 풀 리로드를 회피할 수 있습니다.
<a> 태그와 동일하게 작성할 수 있지만, 뒤에서 Inertia가 페이지 컴포넌트만을 교체하므로 SPA와 같은 조작감이 됩니다.
Form 컴포넌트
@inertiajs/react가 제공하는 <Form> 컴포넌트는 스타터 킷의 인증 화면에서 사용되는 폼 송신의 권장 스타일입니다. action과 method를 props로 지정하고, children 함수(render prop)로 errors와 processing을 받습니다.
기본 사용법
<Form>의 children은 ({ errors, processing }) => JSX라는 함수(render prop 패턴)입니다. Form 컴포넌트가 이 값들을 자동으로 산출하여 전달해 줍니다. 폼 필드에는 onChange 핸들러가 아니라 HTML 네이티브의 name 속성을 사용하며, 브라우저의 표준 폼 데이터 수집이 기능합니다.
스타터 킷의 패턴
스타터 킷은 Wayfinder를 사용하여 라우트를 오브젝트로 관리하고 있습니다.store.form()은 라우트 오브젝트의 action과 method를 포함하는 오브젝트를 반환하고, <Form>에 spread합니다.
resetOnSuccess에 지정한 필드는 송신 성공 시에 자동으로 리셋됩니다. 패스워드 필드 등 송신 후에 비우고 싶은 필드에 지정합니다.
Wayfinder를 사용하지 않는 경우는
action="/login"처럼 직접 URL을 전달하면 같은 방식으로 동작합니다.useForm 훅
폼 처리에는 @inertiajs/react의 useForm 훅을 사용합니다. 폼 상태 관리 · 송신 · 유효성 검증 오류 표시가 심플하게 구현됩니다.
컨트롤러 측
React 폼 컴포넌트
useForm이 반환하는 오브젝트의 주요 프로퍼티를 정리합니다.
유효성 검증 오류가 반환되었을 때,
useForm은 입력 내용을 유지한 채 오류를 표시합니다.
공유 데이터 (Shared Data)
모든 페이지에서 공통으로 필요한 데이터(로그인 중인 사용자 정보 · 플래시 메시지 등)는HandleInertiaRequests 미들웨어의 share() 메서드로 정의합니다.
usePage() 훅을 사용합니다.
공유 데이터는 모든 요청에 포함되므로, 필요 최소한의 데이터로 좁힐 것을 권장합니다.
fn()을 사용한 지연 평가로 하면, 실제로 접근되었을 때만 평가됩니다.React 훅 기초
Inertia × React로 개발하는 데 있어 알아 두어야 할 React의 기본 훅을 소개합니다.useState — 로컬 상태 관리
useEffect — 부수 효과 처리
useMemo와 useCallback — 퍼포먼스 최적화
TypeScript 지원
스타터 킷의 React 버전은 TypeScript가 기본입니다. Inertia의 타입 정의와 조합하면 props의 타입 안전을 확보할 수 있습니다.전역 타입 정의
스타터 킷에서는resources/js/types/index.d.ts에 공유 데이터의 타입을 정의합니다.
페이지 컴포넌트에서의 타입 이용
정리
React는 Laravel과의 조합에서, 특히 Inertia를 경유한 “모던 모놀리스” 구성에서 힘을 발휘합니다. TypeScript와의 궁합도 뛰어나며, 대규모 애플리케이션 개발에 적합합니다.
Inertia × React를 사용하면, Laravel 백엔드의 심플함과 React의 강력한 에코시스템을 조합한 개발 경험을 얻을 수 있습니다. 스타터 킷으로 프로젝트를 생성하면 인증 화면도 포함해서 바로 개발을 시작할 수 있습니다.
Inertia.js 공식 문서
Inertia v3의 전 기능에 대해서는 공식 문서를 참고하세요.