Next.js 16 Preview: 무엇이 바뀌었나? (feat. 제로 번들)
Vercel이 공개한 Next.js 16 프리뷰의 핵심 기능 분석. 자바스크립트를 보내지 않는 '제로 번들' 아키텍처와 향상된 서버 액션, 그리고 Turbopack의 정식 출시.
2025년 12월, 드디어 Next.js 16의 프리뷰 버전이 공개되었습니다. Next.js 15가 안정화에 집중했다면, 이번 16 버전은 ‘성능의 극한’을 추구합니다. Vercel의 CEO 길예르모 라우히는 이번 업데이트를 두고 “React가 브라우저를 떠나 서버로 완전히 이주하는 첫걸음”이라고 표현했습니다.
프론트엔드 리드로서 직접 베타 버전을 설치해보고, 실무에서 체감할 수 있는 핵심 변화들을 정리했습니다. 특히 이번 업데이트의 핵심인 제로 번들(Zero Bundle) 아키텍처와 실시간 양방향 통신이 가능해진 **서버 액션(Server Actions)**을 중점적으로 분석합니다.
1. Zero Bundle: HTML의 화려한 귀환
React 앱을 띄우기 위해 수백 킬로바이트의 JS 파일을 다운로드하던 시대는 끝났습니다. Next.js 16은 “가능한 한 클라이언트로 JS를 보내지 않는다”는 철학을 극단적으로 밀어붙였습니다.
1.1 서버 전용 상태 머신 (Server-Only State Machine)
이전 버전까지는 useState를 사용하려면 무조건 파일 최상단에 'use client'를 선언하고 클라이언트 컴포넌트로 전환해야 했습니다. 이 과정에서 불필요한 번들 사이즈 증가가 발생했습니다.
하지만 Next.js 16에서는 간단한 토글, 탭 전환, 모달 열기/닫기 같은 UI 로직을 서버에서 미리 계산된 CSS와 HTML 속성으로 변환합니다.
// Next.js 15 (이전 방식)
'use client';
import { useState } from 'react';
export default function Tabs() {
const [active, setActive] = useState('A');
return (
<div>
<button onClick={() => setActive('A')}>Tab A</button>
<button onClick={() => setActive('B')}>Tab B</button>
{active === 'A' && <ContentA />}
{active === 'B' && <ContentB />}
</div>
);
}
// Next.js 16 (새로운 방식)
import { ServerToggle } from 'next/server-ui';
export default function Tabs() {
// 이 코드는 클라이언트 JS 번들에 포함되지 않습니다.
// 빌드 타임에 순수 HTML 체크박스 핵이나
// 브라우저의 Popover API로 자동 변환됩니다.
return (
<ServerToggle>
<Tab title="A">Content A</Tab>
<Tab title="B">Content B</Tab>
</ServerToggle>
);
}
결과적으로 브라우저가 다운로드하는 자바스크립트 크기는 0KB가 됩니다. 이는 TTI(Time to Interactive)를 획기적으로 단축시킵니다. 실제 사내 프로젝트의 랜딩 페이지에 적용해본 결과, LCP(Largest Contentful Paint)가 1.2초에서 0.4초로 3배 가까이 빨라지는 것을 확인했습니다.
2. 향상된 Server Actions: 폼 그 이상
Server Actions가 처음 도입되었을 때는 단순히 API 라우트를 대체하는 용도였습니다. 하지만 16 버전에서는 실시간 양방향 통신이 가능해졌습니다. 이제 웹소켓(WebSocket) 서버를 따로 구축할 필요가 없습니다.
2.1 스트리밍 액션 (Streaming Actions)
가장 반가운 기능은 서버 액션 실행 중에 진행 상황을 클라이언트로 스트리밍할 수 있다는 점입니다. 파일 업로드나 AI 응답 생성 같은 긴 작업을 처리할 때 유용합니다.
// actions.ts
'use server';
export async function generateReport(formData: FormData) {
const stream = createStream(); // Next.js 16 내장 함수
// 1. 데이터 수집
stream.update({ status: 'collecting', progress: 10 });
await collectData();
// 2. AI 분석
stream.update({ status: 'analyzing', progress: 50 });
await analyzeWithAI();
// 3. 완료
stream.done({ status: 'completed', url: '/reports/123' });
}
// ClientComponent.tsx
'use client';
import { useActionState } from 'react';
import { generateReport } from './actions';
export default function ReportButton() {
// useActionState가 스트림 데이터를 실시간으로 받아옵니다.
const [state, action] = useActionState(generateReport, { progress: 0 });
return (
<form action={action}>
<button>리포트 생성</button>
{state.progress > 0 && <ProgressBar value={state.progress} />}
</form>
);
}
3. Turbopack Stable: 이제 진짜 빠르다
Next.js 13부터 베타였던 터보팩이 드디어 정식 버전이 되었습니다. Vercel은 “이제 Webpack으로 돌아갈 이유는 없다”고 단언했습니다.
3.1 성능 벤치마크 (vs Next.js 15)
M4 Pro 맥북 프로 환경에서 5,000개 이상의 컴포넌트가 있는 대규모 모노레포 프로젝트를 기준으로 테스트했습니다.
| 항목 | Next.js 15 (Webpack) | Next.js 16 (Turbopack) | 개선율 |
|---|---|---|---|
| 초기 부팅 시간 | 12.5s | 1.8s | 694% |
| HMR (코드 수정 반영) | 1.2s | 0.05s | 2400% |
| 프로덕션 빌드 시간 | 4m 30s | 1m 10s | 385% |
| 메모리 사용량 | 4.2GB | 1.1GB | 73% 절감 |
Rust로 작성된 엔진 덕분에 빌드 시 메모리 점유율이 절반 이하로 떨어졌습니다. 이는 AWS나 Vercel 같은 클라우드 환경에서 CI/CD 파이프라인 비용을 획기적으로 절감할 수 있음을 의미합니다.
4. 부분적 프리렌더링(PPR)의 완성
정적 페이지와 동적 페이지의 이분법적인 구분이 사라졌습니다. 하나의 페이지 안에서 헤더는 정적으로(빌드 타임), 장바구니는 동적으로(런타임) 렌더링하는 **PPR(Partial Prerendering)**이 기본값으로 활성화됩니다.
4.1 개발자 경험(DX)의 변화
더 이상 페이지 상단에 export const dynamic = 'force-dynamic' 같은 옵션을 적을지 말지 고민할 필요가 없습니다. 프레임워크가 코드를 정적 분석하여, 데이터 의존성이 없는 부분은 정적으로, 쿠키나 헤더를 쓰는 부분은 동적으로 알아서 쪼개서 빌드합니다.
이로 인해 “동적 페이지는 느리다”라는 편견이 깨졌습니다. 사용자는 항상 CDN에서 캐싱된 껍데기를 0.1초 만에 보게 되며, 개인화된 데이터는 그 안에서 병렬로 스트리밍됩니다.
5. 마이그레이션 가이드: v15에서 v16으로
Next.js 16은 파괴적인 변경을 최소화했지만, 몇 가지 주의할 점이 있습니다.
- Node.js 버전: 최소 요구 사양이 Node.js 22.x LTS로 상향되었습니다.
Image컴포넌트: 레거시 props(layout,objectFit) 지원이 완전히 중단되었습니다.- 미들웨어: 엣지 런타임의 일부 API가 변경되었습니다. 특히
NextResponse.rewrite사용 시 URL 검증 로직이 강화되었으므로 확인이 필요합니다.
# 자동 마이그레이션 도구 실행
npx @next/codemod@latest upgrade-to-v16
대부분의 변경 사항은 위 명령어로 자동 수정되므로, 업데이트에 대한 부담은 크지 않습니다.
마치며
역설적이게도 Next.js 16은 개발자가 알아야 할 것을 줄여주는 방향으로 진화했습니다. 최적화, 캐싱, 번들링 설정을 프레임워크가 알아서 해주기 때문입니다. 우리는 이제 next.config.js를 수정하는 시간이 아니라, “사용자에게 어떤 가치를 줄 것인가”를 고민하는 시간에 더 집중할 수 있게 되었습니다.
2026년의 웹 개발은 그 어느 때보다 쾌적할 것입니다. 더 이상 “React는 무겁다”는 핑계를 댈 수 없는 시대가 왔습니다. 지금 바로 16 버전을 설치하고, 제로 번들의 가벼움을 경험해보시기 바랍니다.
전체 댓글 0개