Remix v2는 React 서버 사이드 렌더링을 실제로 즐겁게 만드는 무료 프레임워크를 가지고 있다
Source: Dev.to
v2에서 바뀐 점
| Feature | Remix v1 | Remix v2 |
|---|---|---|
| 라우팅 | 파일 컨벤션 v1 | 플랫 라우트 (v2 컨벤션) |
| 개발 서버 | Custom | Vite |
| CSS | Custom imports | Vite CSS |
| Meta | Object | Function |
| Error boundary | CatchBoundary + ErrorBoundary | 단일 ErrorBoundary |
빠른 시작
npx create-remix@latest my-app
cd my-app && npm run dev
데이터 로딩이 포함된 중첩 라우트
// app/routes/posts.$postId.tsx
import type { LoaderFunctionArgs } from "@remix-run/node";
import { json } from "@remix-run/node";
import { useLoaderData } from "@remix-run/react";
export async function loader({ params }: LoaderFunctionArgs) {
const post = await db.post.findUnique({ where: { id: params.postId } });
if (!post) throw new Response("Not Found", { status: 404 });
return json({ post });
}
export default function Post() {
const { post } = useLoaderData();
return (
## {post.title}
{post.content}
);
}
액션 (서버‑사이드 폼 처리)
import { ActionFunctionArgs, redirect } from "@remix-run/node";
export async function action({ request }: ActionFunctionArgs) {
const formData = await request.formData();
const title = formData.get("title") as string;
await db.post.create({ data: { title } });
return redirect("/posts");
}
export default function NewPost() {
return (
Create
);
}
useState도 없고, onSubmit 핸들러도 없으며, 수동 fetch 호출도 필요 없습니다—폼은 프로그레시브 엔핸스먼트를 통해 바로 동작합니다.
에러 바운더리
import { useRouteError, isRouteErrorResponse } from "@remix-run/react";
export function ErrorBoundary() {
const error = useRouteError();
if (isRouteErrorResponse(error)) {
return {error.status}: {error.data};
}
return Something went wrong;
}
단일 바운더리 하나로 라우트당 예상 오류(예: 404)와 예상치 못한 오류를 모두 처리합니다.
Remix를 Next.js보다 선택해야 하는 이유
- 중첩 라우트 → 병렬 데이터 로딩, 워터폴 효과 없음.
- JavaScript 없이 동작하는 폼 → 완전한 프로그레시브 엔핸스먼트.
- 표준 Web API(Request, Response, FormData)를 직접 사용.
- React Server Components(RSC)보다 단순한 사고 모델.
결론
Vite 위에서 동작하는 Remix v2는 빠르고, 간단하며, 웹 표준을 최우선으로 합니다. Next.js의 복잡함 없이 React SSR을 원한다면 바로 이 솔루션입니다.
데이터 수집 자동화나 맞춤형 스크래퍼가 필요하신가요? 준비된 도구는 제 Apify actors에서 확인하시고, 맞춤 솔루션은 spinov001@gmail.com으로 이메일 주세요.