Next.js와 Remix의 논쟁은 2026년에 급격한 변곡점을 맞이했습니다. 대부분의 비교 글이 놓친 핵심은 이겁니다: 독립적인 React 프레임워크로서의 Remix가 React Router 7에 흡수되었습니다. 그리고 Remix 3? Preact로 분기하면서 React 생태계를 완전히 벗어났습니다. 이것은 이 두 프레임워크를 평가하는 방식을 완전히 바꿉니다.

그렇다면 실제 차이점은 무엇일까요? Next.js는 Vercel의 기능이 풍부한 React Server Components 중심 메타프레임워크로, SSR, SSG, ISR, 스트리밍을 지원합니다. Remix(현재는 프레임워크 모드의 React Router 7로 존재)는 Shopify의 SSR 중심 프레임워크로, 웹 표준, 로더, 액션, 점진적 향상을 기반으로 합니다. 아키텍처가 근본적으로 다르며, 각각이 빛나는 시나리오도 다릅니다.

프로덕션 Next.js 애플리케이션을 배포한 경험과 클라이언트 프로젝트용 Remix를 평가한 경험을 바탕으로, 이 가이드는 다른 비교 글이 제공하지 않는 것들을 제시합니다: 나란히 비교하는 TypeScript 코드 예제, 실제 성능 벤치마크, 4가지 규모별 배포 비용 분석, 체계적인 의사결정 프레임워크입니다. 막연한 "상황에 따라 다르다"는 답변은 없습니다. 본론으로 들어가겠습니다.

빠른 요약: 한눈에 보는 Next.js vs Remix

시간이 부족하다면 여기 요약본이 있습니다. SSG/ISR이 필요하거나 거대한 생태계를 원하거나 콘텐츠 중심 사이트를 만든다면 Next.js를 선택하세요. 더 단순한 정신 모델, 점진적 향상, 벤더 락인이 없기를 원한다면 Remix/React Router 7을 선택하세요. 이제 전체 그림입니다:

이 글의 나머지 부분은 각 카테고리를 코드 예제, 벤치마크 데이터, 명확한 결론과 함께 분석합니다.

Next.js와 Remix란 무엇인가?

Next.js 개요

Next.js는 Vercel이 만들고 유지보수하는 지배적인 React 메타프레임워크입니다. App Router(RSC 중심 아키텍처), Pages Router(레거시), 그리고 SSR, SSG, ISR, 스트리밍, 미들웨어 등을 포함하는 툴킷을 제공합니다. 약 132K GitHub 스타를 받았으며 State of JS 2024에 따르면 약 68%의 프로덕션 사용률을 기록하고 있습니다. TikTok, Spotify, Twitch, Netflix 같은 회사들이 Next.js로 구축되어 있습니다.

Next.js를 React 프레임워크의 스위스 아미 나이프라고 생각하면 됩니다. 모든 것을 하지만, 복잡성의 대가가 있을 수 있습니다.

Remix 개요

Remix는 Shopify의 웹 표준 기반 SSR 중심 프레임워크입니다. 철학은 우아한 단순함입니다: 로더가 데이터를 가져오고, 액션이 변경을 처리하고, 중첩된 라우팅이 UI를 예측 가능하게 유지합니다. Remix로 만든 앱은 점진적 향상 덕분에 JavaScript 없이도 작동합니다. Shopify(Hydrogen, Admin), Docker, NASA GCN이 프로덕션에서 사용 중입니다.

Remix를 정밀 도구라고 생각하면 됩니다. 더 적은 것을 하지만, 하는 것들을 예외적으로 잘합니다.

2026년 현황: React Router 7, Remix 3, 그리고 당신을 위한 의미

여기가 다른 비교 글이 명확하게 설명하지 않은 부분입니다. 주의 깊게 읽으세요. 2026년 프레임워크 선택을 위한 가장 중요한 맥락입니다:

React Router v7이 Remix의 핵심 패턴 전부를 흡수했습니다: 로더, 액션, 중첩된 라우팅, 서버 렌더링 말입니다. 현재 Remix v2를 사용하고 있다면, 권장 업그레이드 경로는 "프레임워크 모드"의 React Router v7입니다. 기본적으로 이미 수백만 개의 React 앱을 지배하던 라우터로 이름이 바뀌고 합쳐진 것입니다.

Remix 3는 완전히 별개의 프로젝트입니다. React를 완전히 대체하기 위해 Preact로 분기합니다. Remix v2에서 Remix 3로의 마이그레이션 경로는 없습니다. React 생태계에 헌신적이라면 Remix 3는 당신의 프레임워크가 아닙니다.

이것이 실제로 의미하는 바는? 2026년 React 프로젝트의 경우, 실제 비교는 Next.js vs React Router 7입니다. 이 글 전체에서 "Remix"라고 할 때, 현재 React Router 7 프레임워크 모드에 있는 패턴을 의미합니다.

그리고 세 번째 플레이어가 부상하고 있습니다: TanStack Start는 RC 상태이며, 두 프레임워크 모두보다 가벼운 대안으로 타입 안전한 라우팅과 데이터 페칭을 제공합니다. 자세한 내용은 나중에 다루겠습니다.

Next.js vs Remix 라우팅: 파일 관례와 중첩된 레이아웃

라우팅은 애플리케이션의 뼈대입니다. 두 프레임워크 모두 파일 기반 라우팅을 사용하지만, 관례는 꽤 다릅니다. 비교해봅시다.

Next.js App Router 파일 구조

Next.js는 app/ 디렉토리에서 폴더 기반 라우팅을 사용합니다. 각 폴더는 라우트 세그먼트이고, 특수 파일들이 동작을 정의합니다: UI를 위한 page.tsx, 공유 레이아웃을 위한 layout.tsx, suspense 상태를 위한 loading.tsx, 에러 바운더리를 위한 error.tsx입니다.

동적 세그먼트는 대괄호 표기법을 사용합니다: [postId]. Catch-all 라우트는 [...slug]를 사용합니다. 폴더 중첩은 URL 구조를 직접 반영하므로 직관적이지만, 복잡한 앱의 경우 매우 깊게 중첩된 디렉토리로 이어질 수 있습니다.

Remix 플랫 파일 라우팅

Remix는 점으로 구분된 세그먼트를 사용한 플랫 파일 접근 방식을 사용합니다. 폴더 계층 구조를 만드는 대신, 모든 라우트는 단일 app/routes/ 디렉토리에 있습니다. 파일명의 점들이 중첩을 정의합니다:

동적 세그먼트는 $ 접두사를 사용합니다: $postId. Splat 라우트는 $.tsx를 사용합니다. 모든 것이 평면이고, 스캔 가능하며, 폴더를 열지 않고도 전체 라우트 구조를 한눈에 볼 수 있습니다.

중첩된 레이아웃과 레이아웃 유지

두 프레임워크에서 같은 동적 라우트 컴포넌트입니다. 데이터 페칭 패턴이 근본적으로 얼마나 다른지 주목하세요:

Next.js 동적 라우트 ( app/blog/[postId]/page.tsx ):

Remix 동적 라우트 ( app/routes/blog.$postId.tsx ):

Remix는 부모 레이아웃이 마운트된 상태로 유지되면서 자식 라우트가 교체되는 중첩된 라우팅을 개척했습니다. Next.js의 App Router도 유사한 레이아웃 유지를 추가했지만, Remix의 구현이 더 성숙하고 예측 가능하다고 평가받습니다. 특히 대시보드 같은 깊게 중첩된 UI의 경우 더욱 그렇습니다.

Next.js는 또한 다른 어떤 프레임워크도 제공하지 않는 고급 패턴을 제공합니다: 병렬 라우트( @slot ), 인터셉팅 라우트, 라우트 그룹입니다. 앱이 이런 기능이 필요하다면 Next.js가 유일한 선택지입니다.

결론: 라우팅 단순함과 중첩된 레이아웃 예측 가능성은 Remix/React Router 7이 이깁니다. 병렬 라우트 및 인터셉팅 라우트 같은 고급 패턴은 Next.js가 이깁니다. 대부분의 앱에서는 두 라우팅 시스템 모두 훌륭하니, 플랫 파일과 폴더 중첩 중 어느 것을 선호하는지에 따라 선택하면 됩니다.

Next.js vs Remix 데이터 페칭: React Server Components vs 로더

이것이 두 프레임워크 간의 가장 논쟁이 많은 아키텍처상 차이이며, 코드와 함께 자세히 살펴볼 가치가 있습니다.

Next.js: React Server Components

App Router에서 Next.js 컴포넌트는 기본적으로 서버에서 렌더링됩니다. 데이터 페칭은 async/await를 사용하여 컴포넌트에서 직접 일어나며, 특수 API나 훅은 필요하지 않습니다. 그냥 async 함수를 작성합니다. 클라이언트 측 인터랙티브 컴포넌트가 필요하신가요? "use client" 바운더리를 추가하면 됩니다.

유연성은 강력합니다: SSG를 위해 generateStaticParams를, ISR을 위해 revalidate를, 제로 클라이언트 JS 콘텐츠를 위해 React Server Components를, 인터랙티브성을 위해 "use client"를 사용할 수 있습니다. 하지만 더 많은 옵션은 더 많은 결정을 의미하며, 실수로 데이터 페칭 워터폴을 만드는 더 많은 방법이 있습니다.

Remix: 로더와 병렬 데이터 로딩

Remix는 단 하나의 개념을 가집니다: 각 라우트는 렌더링 전에 서버에서 실행되는 로더 함수를 내보냅니다. 데이터는 직렬화되고 useLoaderData() 훅을 통해 액세스됩니다. 중첩된 라우트 트리의 모든 로더는 자동으로 병렬로 실행됩니다. 기본적으로 워터폴이 없습니다.

정신 모델의 차이

핵심적인 분리는 이것입니다: Next.js는 데이터를 페칭하는 여러 방법(RSC, getServerSideProps(레거시), 클라이언트 측 use(), 변경을 위한 서버 액션)을 제공합니다. Remix는 한 가지 방법만 제공합니다: 로더가 페칭하고, 액션이 변경합니다. 이것뿐입니다.

Remix의 단순함은 제한이 아닙니다. 이것은 설계 선택입니다. 하나의 개념은 더 적은 실수, 더 쉬운 온보딩, 더 예측 가능한 동작을 의미합니다. Next.js의 유연성은 더 많은 힘을 의미하지만 가파른 학습 곡선을 가집니다.

실용적인 함정: Remix/React Router 7은 +types/ 관례를 통해 라우트 레벨 타입을 생성하여 타입 안전한 로더, 액션, 매개변수를 기본으로 제공합니다. Next.js는 대부분의 패턴에 대해 수동 타이핑이 필요합니다.

...

출처 바로가기