React·Next.js·Vue·Svelte 프레임워크 선택 기준과 실무
이 장을 읽기 전에: HTML/CSS의 기본 구조(태그, 셀렉터)와 JavaScript의 기초(변수, 함수, 이벤트)를 이해하고 있으면 읽기 쉽다. 자신 없는 경우에는 제2장의 TypeScript/JavaScript 항목을 먼저 읽는 것을 권장한다.
웹 애플리케이션에서, 사용자가 직접 눈으로 보고 조작하는 부분을 프론트엔드라고 부른다. 식당으로 말하자면 "홀과 서빙"에 해당하는 부분이다. 음식이 아무리 맛있어도(백엔드가 아무리 뛰어나도), 메뉴를 읽을 수 없거나 주문 방법을 모른다면(UI가 나쁘다면), 손님은 돌아가 버린다.
이 장에서는 프론트엔드 개발의 전체 그림과, 프레임워크 선정의 판단 기준을 정리한다.
이 섹션이 답하는 질문: 프론트엔드 개발에는 어떤 접근 방식이 있는가?
2000년대의 웹사이트는, 서버가 HTML을 생성해서 브라우저에 반환하는 단순한 구조였다. 그러나 Gmail(2004년)과 Google Maps(2005년)의 등장으로, "페이지 전체를 다시 읽어들이지 않고 부분적으로 업데이트하는" 풍부한 웹 앱이 요구되게 되었다. 이 수요에 부응하기 위해 프론트엔드 기술은 급속히 진화하고 복잡해졌다.
2026년 시점에서는 복수의 아키텍처 패턴이 공존하고 있으며, 프로젝트의 성격에 따라 적절한 것을 선택할 필요가 있다.
� 국내 서비스 패턴: 네이버·카카오·쿠팡 등 검색 유입이 중요한 서비스는 SSR/SSG를, 사내 관리도구·B2B SaaS 대시보드는 SPA를 많이 채택한다. 이커머스(쿠팡·무신사·29CM)는 ISR을 활용해 상품 페이지 성능과 최신성을 동시에 잡는 구성이 많다.
⚠️ "일단 SPA"는 위험하다. SEO가 불필요한 관리 화면이라면 SPA로 문제없지만, 검색 엔진 유입이 중요한 서비스에서는 SSR이나 SSG를 검토해야 한다. 국내 주요 검색 엔진인 네이버는 Googlebot과 크롤링 방식이 다를 수 있으므로, SEO 전략 수립 시 네이버 서치어드바이저 기준도 함께 확인한다.
프론트엔드 아키텍처는 하나로 결정되지 않는다. SEO의 필요성, 업데이트 빈도, 인터랙티브성의 3가지를 축으로 판단한다. 2026년 시점의 주류는 서버 측에서 먼저 렌더링하면서 필요한 부분만 클라이언트에서 동작시키는 하이브리드형이다.
이 섹션이 답하는 질문: React, Vue, Svelte… 결국 어느 것을 선택하면 좋은가?
프론트엔드 프레임워크 없이 복잡한 웹 앱을 만드는 것은 설계도 없이 건물을 짓는 것과 같다. 상태 관리, 컴포넌트 재이용, 라우팅, 데이터 취득…… 이것들을 매번 제로부터 구현하는 것은 비현실적이며, 버그의 온상이 된다.
프레임워크는 이러한 공통 과제의 모범 사례를 패키지화한 것이다.
막힐 때의 사고 방식
채용 시장, 정보량, 기존 라이브러리 자산을 중시한다면 → React / Next.js
읽기 쉬움과 학습 속도를 중시한다면 → Vue / Nuxt
작게 시작해서 가볍게 만들고 싶다면 → Svelte / SvelteKit
콘텐츠 중심으로 JavaScript를 너무 많이 보내고 싶지 않다면 → Astro
� 국내 채용 현황: 원티드·프로그래머스 채용 공고 기준으로 React(Next.js) 수요가 압도적으로 높다. Vue는 기존 서비스 유지보수나 중견 기업에서 여전히 요구되며, Angular는 금융·공공·엔터프라이즈 레거시 환경에서 사용된다. Svelte와 Astro는 채용보다 개인 프로젝트·사이드 프로젝트에서 인기가 높다.
⚠️ 프레임워크의 인기만으로 선택하지 않을 것. SEO, 인증, 관리 화면, 실시간성, 디자인 시스템, 팀 경험 쪽이 실무에서는 훨씬 중요하다.
⚠️ Next.js를 선택하는 경우는 App Router와 Server Components를 전제로 생각하면 좋다. 한편, 모든 화면을 Next.js로 통일할 필요는 없다. 단순한 관리 화면이나 임베디드 앱에서는 Vite 기반 SPA가 더 단순할 수도 있다.
2026년 시점에서도, 가장 인기 있는 기술 = 모든 안건의 정답은 아니다. React / Next.js는 무난한 선택지이지만, Vue / Nuxt, Svelte / SvelteKit, Astro에는 각각 명확한 강점이 있다. 중요한 것은 "이 안건에서 무엇을 최적화하고 싶은가"를 먼저 결정하는 것이다.
이 섹션이 답하는 질문: Server Components란 무엇인가? Next.js의 설계는 어떻게 바뀌었는가?
기존의 React 프론트엔드에서는 데이터 취득도 화면 표시도 클라이언트 측으로 치우치기 쉬웠다. 그 결과 초회 표시가 무거워지기 쉽고, SEO나 저속 회선에서 불리해지는 경우가 있었다.
Next.js의 App Router는, 어디까지를 서버에서 렌더링하고 어디서부터를 클라이언트에서 동작시키는가를 명시적으로 나누기 쉽게 했다. 이것이 현재의 Next.js를 이해하는 데 있어서 중요한 변화다.
React의 Server Components는 React 공식에서는 "번들 전에 별도 환경에서 먼저 렌더링되는 새로운 종류의 컴포넌트"라고 설명되어 있다. Next.js App Router에서는 이 사고방식이 기본 설계에 내장되어 있다.
// app/products/page.tsx — Server Component (기본값)
// 서버에서 실행: DB 직접 접근, API 호출 가능
import ProductGrid from './product-grid';
export default async function Page() {
const products = await fetchProducts(); // 서버에서 직접 데이터 취득
return <ProductGrid products={products} />;
}
// app/products/product-grid.tsx — Client Component
// 브라우저에서 실행: 상태, 이벤트 처리 가능
'use client';
import { useState } from 'react';
export default function ProductGrid({ products }) {
const [query, setQuery] = useState('');
return <>{/* 검색 입력이나 정렬 등의 대화 처리 */}</>;
}
Server Components가 특히 유효한 장면
초회 표시를 가볍게 하고 싶다
데이터 취득을 서버 측으로 모으고 싶다
클라이언트에 보내는 JavaScript를 줄이고 싶다
Client Components나 기존형 클라이언트 상태 관리가 필요한 장면
폼 입력, 모달, 드래그, 키보드 조작 등 대화 중심의 UI
실시간 업데이트, 낙관적 업데이트, 오프라인 대응
브라우저 API에 강하게 의존하는 기능
⚠️ Next.js 공식 문서에서도 Layouts와 Pages는 App Router에서 Server Components가 기본이다. 먼저 서버에서 처리할 수 있는 부분을 Server Components에 두고, 필요한 곳만 Client Components로 분리하면 정리하기 쉽다.
⚠️ Server Components는 "무엇이든 안전하다"는 의미가 아니다. Next.js는 server-only에 의한 보호와 빌드 시 체크를 제공하고 있지만, 2025년 12월에는 App Router / RSC에 관련된 중대한 보안 어드바이저리 CVE-2025-66478도 공개되었다. App Router를 사용한다면 패치 적용을 지속할 것.
⚠️ Next.js 16에서는 Turbopack이 신규 프로젝트의 기본 번들러가 되었으며, Cache Components가 도입되었다. 이것들은 편리하지만, 먼저 이해해야 할 기본은 Server Components와 Client Components의 경계다.
Next.js의 현재 위치는 "React를 브라우저에서 전부 동작시키는" 것이 아니라 서버와 클라이언트의 책무를 나누는 설계에 있다. Server Components는 강력하지만, 대화적 UI는 여전히 Client Components가 담당한다. 이 경계를 올바르게 설계할 수 있는가가 Next.js를 제대로 활용할 수 있는지를 결정한다.
이 섹션이 답하는 질문: "상태"란 무엇인가? 왜 관리가 필요한가?
웹 애플리케이션에는 "상태(state)"가 있다. 로그인 중인 사용자 이름, 장바구니의 내용물, 폼의 입력값, 다크 모드의 ON/OFF — 이것들은 모두 상태다.
작은 앱에서는 상태 관리에 어려움을 겪지 않지만, 앱이 성장하면 "이 화면에서 변경한 값이 다른 화면에 반영되지 않는다", "같은 데이터를 여러 곳에서 가지고 있어 불일치가 발생한다"는 문제가 발생한다.
상태는 다음 3가지로 나누면 정리하기 쉽다.
⚠️ 먼저 로컬 상태로 닫을 수 없는지를 생각한다. 다음으로 서버 상태로 취급할 수 없는지를 생각한다. 글로벌 상태 라이브러리는 마지막에 검토한다.
React 계열에서 자주 쓰이는 선택지는 다음과 같다.
// 상태 관리 선택 판단 흐름 — 실무 예시
// 1단계: 로컬 상태로 닫을 수 있는가?
지금 바로 작가의 멤버십 구독자가 되어
멤버십 특별 연재 콘텐츠를 모두 만나 보세요.
오직 멤버십 구독자만 볼 수 있는,
이 작가의 특별 연재 콘텐츠