본문 바로가기
기술의기록

Next.js 16.0 Beta 완전 분석 - 15버전과 뭐가 달라졌을까?

by Jeremy Winchester 2025. 10. 13.
반응형

안녕하세요! 오늘은 정말 핫한 소식을 가지고 왔어요. 바로 오늘 공개된 Next.js 16.0 Beta에 대한 이야기인데요, 15버전을 사용하고 계신 분들이라면 꼭 알아야 할 변경사항들이 가득합니다. 😊

프론트엔드 개발자라면 누구나 한 번쯤 "음... 이번 버전은 업그레이드해야 하나?" 고민해보셨을 텐데요. 이 글을 읽고 나면 여러분의 프로젝트에 Next.js 16을 적용할지 확실한 판단을 내릴 수 있을 거예요!

🎯 Next.js 16 Beta, 한눈에 보는 핵심 요약

먼저 바쁘신 분들을 위해 핵심만 쏙쏙 정리해드릴게요:

  • Turbopack이 드디어 정식(Stable) 버전으로! 🎉 이제 모든 프로젝트의 기본 번들러
  • React 19.2 지원 - View Transitions, useEffectEvent 등 최신 기능 사용 가능
  • 완전히 새로워진 캐싱 API - updateTag(), refresh() 추가
  • Client Segment Cache 기본 활성화 - 라우팅 성능 대폭 개선
  • 수많은 Breaking Changes - 마이그레이션 필수!

자, 그럼 이제 하나씩 자세히 살펴볼까요?


🚀 1. Turbopack, 드디어 기본 번들러로 등극!

15버전에서는?

Next.js 15에서 Turbopack은 아직 '실험적(Experimental)' 기능이었어요. 사용하려면 --turbo 플래그를 명시적으로 붙여야 했죠.

 
 
bash
# Next.js 15
next dev --turbo  # Turbopack 사용하려면 플래그 필요
next build --turbo

16버전에서 달라진 점

이제 Turbopack이 기본 번들러입니다! 🎊

 
 
bash
# Next.js 16
next dev      # 기본적으로 Turbopack 사용
next build    # Turbopack으로 빌드

# Webpack 사용하려면 오히려 플래그 필요
next dev --webpack
next build --webpack

성능 개선 수치를 보면 입이 떡 벌어지는데요:

  • 프로덕션 빌드 속도: 2-5배 향상
  • Fast Refresh 속도: 최대 10배 향상
  • 개발 서버 시작: 기존보다 53% 빠름

실제로 Vercel 내부 앱의 50% 이상이 이미 개발 환경에서, 20% 이상이 프로덕션 빌드에서 Turbopack을 사용하고 있다고 하니, 이제 정말 믿고 쓸 수 있는 수준이에요! ✨

파일시스템 캐싱까지!

16버전에서는 **Turbopack File System Caching(Beta)**이라는 새로운 기능도 추가되었어요. 개발 서버를 재시작할 때 이전에 컴파일한 결과를 디스크에서 읽어오기 때문에 대규모 프로젝트에서 엄청난 시간 절약이 가능합니다.

 
 
javascript
// next.config.js
const nextConfig = {
  experimental: {
    turbopackFileSystemCacheForDev: true,
  },
};

export default nextConfig;

⚛️ 2. React 19.2 지원 - 최신 기능 활용

15버전에서는?

Next.js 15는 React 19 RC(Release Candidate)를 지원했어요. 아직 정식 버전은 아니었죠.

16버전에서 달라진 점

이제 React 19.2 정식 버전을 사용할 수 있어요! 새롭게 추가된 기능들이 정말 매력적인데요:

🎬 View Transitions

 
 
jsx
// 페이지 전환 시 부드러운 애니메이션 효과
import { useTransition } from 'react';

function MyComponent() {
  const [isPending, startTransition] = useTransition();
  
  return (
    <button onClick={() => startTransition(() => {
      // 상태 업데이트
    })}>
      클릭하세요
    </button>
  );
}

🎯 useEffectEvent

 
 
jsx
// Effect에서 비반응적 로직 분리
import { useEffectEvent } from 'react';

function Chat({ serverUrl }) {
  const onConnect = useEffectEvent(() => {
    console.log('연결됨!');
  });

  useEffect(() => {
    // onConnect는 의존성 배열에 포함 안 해도 됨
    connection.on('connect', onConnect);
  }, [serverUrl]);
}

🎨 Activity Component

 
 
jsx
// 백그라운드 활동 렌더링
<Activity>
  <BackgroundTask />
</Activity>

💾 3. 캐싱 API 대격변!

이 부분이 정말 중요한데요, Next.js 16에서는 캐싱 관련 API가 완전히 재설계되었어요.

15버전의 캐싱

 
 
javascript
// Next.js 15
import { revalidateTag } from 'next/cache';

// 단순하게 태그만 revalidate
revalidateTag('blog-posts');

16버전의 새로운 캐싱 API

1️⃣ revalidateTag() - 이제 두 번째 파라미터 필수!

 
 
javascript
// Next.js 16
import { revalidateTag } from 'next/cache';

// ✅ cacheLife 프로필 필수
revalidateTag('blog-posts', 'max');      // 추천!
revalidateTag('news-feed', 'hours');
revalidateTag('analytics', 'days');

// 또는 커스텀 시간 설정
revalidateTag('products', { revalidate: 3600 });

// ⚠️ 이렇게 하면 deprecated 경고!
revalidateTag('blog-posts');  // 안 됨!

언제 사용할까?

  • 정적 콘텐츠에 적합
  • Stale-While-Revalidate(SWR) 동작
  • 백그라운드에서 재검증하면서 캐시된 데이터 즉시 제공

2️⃣ updateTag() - 완전히 새로운 API!

 
 
javascript
'use server';
import { updateTag } from 'next/cache';

export async function updateUserProfile(userId: string, profile: Profile) {
  await db.users.update(userId, profile);
  
  // 캐시 만료 + 즉시 새로고침
  // 사용자가 변경사항을 바로 확인 가능!
  updateTag(`user-${userId}`);
}

언제 사용할까?

  • Server Actions 전용
  • Read-Your-Writes 시맨틱스 필요할 때
  • 폼 제출, 사용자 설정 등 즉각적인 반영이 필요한 경우

3️⃣ refresh() - 캐시 건드리지 않는 새로고침

 
 
javascript
'use server';
import { refresh } from 'next/cache';

export async function markNotificationAsRead(notificationId: string) {
  await db.notifications.markAsRead(notificationId);
  
  // 캐시되지 않은 데이터만 새로고침
  refresh();
}

언제 사용할까?

  • 알림 카운트, 라이브 메트릭 등 캐시되지 않은 동적 데이터
  • 캐시된 페이지는 그대로 두고 싶을 때

🛣️ 4. 라우팅 및 네비게이션 완전 개편

15버전의 문제점

같은 레이아웃을 공유하는 50개의 링크가 있다면? 레이아웃을 50번 다운로드했어요. 😱

16버전의 해결책

🎯 레이아웃 중복 제거(Layout Deduplication)

 
 
jsx
// 50개의 상품 링크가 있어도
<Link href="/products/1">상품 1</Link>
<Link href="/products/2">상품 2</Link>
// ...
<Link href="/products/50">상품 50</Link>

// 공유 레이아웃은 딱 1번만 다운로드! 🎉

⚡ 증분 프리페칭(Incremental Prefetching)

  • 이미 캐시된 부분은 다시 가져오지 않음
  • 링크가 뷰포트에서 벗어나면 요청 취소
  • 호버 시 우선순위 높여서 프리페칭
  • 데이터 무효화되면 자동으로 재프리페칭

트레이드오프: 개별 요청 수는 증가할 수 있지만, 전체 전송 크기는 대폭 감소합니다. 대부분의 앱에서 더 나은 선택이에요!


🔐 5. Breaking Changes - 꼭 확인하세요!

Next.js 16은 정말 많은 Breaking Changes가 있어요. 마이그레이션 전에 반드시 확인하셔야 합니다!

버전 요구사항 변경

항목Next.js 15Next.js 16

Node.js 18.18+ 20.9+ (LTS)
TypeScript 4.5+ 5.1+
React 18.2+ 또는 19 RC 19.2+
브라우저 Chrome 64+, Safari 12+ Chrome 111+, Safari 16.4+

제거된 기능들

❌ AMP 지원 완전 제거

 
 
javascript
// Next.js 15
export const config = { amp: true };  // 동작함

// Next.js 16
export const config = { amp: true };  // 에러! 제거됨

❌ next lint 명령어 제거

 
 
bash
# Next.js 15
next build  # 자동으로 lint 실행

# Next.js 16
next build  # lint 실행 안 함! 별도로 실행 필요
eslint . --ext .js,.jsx,.ts,.tsx

❌ serverRuntimeConfig / publicRuntimeConfig 제거

 
 
javascript
// Next.js 15
module.exports = {
  serverRuntimeConfig: { secret: 'xxx' },  // 동작함
};

// Next.js 16
// 환경 변수 사용하세요!
process.env.SECRET_KEY

❌ 동기 API 접근 완전 제거

 
 
javascript
// Next.js 15 (일부 경고)
const params = props.params;  // 동작하긴 했음
const cookies = cookies();    // 동작하긴 했음

// Next.js 16 (필수 변경!)
const params = await props.params;     // await 필수!
const cookieStore = await cookies();   // await 필수!
const headersList = await headers();   // await 필수!
const draftMode = await draftMode();   // await 필수!

동작 변경

🖼️ next/image 기본값 변경

 
 
javascript
// Next.js 15 기본값
{
  minimumCacheTTL: 60,           // 1분
  imageSizes: [16, 32, 48, ...], // 16px 포함
  qualities: [1..100]            // 모든 품질
}

// Next.js 16 기본값
{
  minimumCacheTTL: 14400,        // 4시간! ⚠️
  imageSizes: [32, 48, ...],     // 16px 제거됨
  qualities: [75]                // 75로 고정
}

🔒 next/image 보안 강화

 
 
javascript
// Next.js 15
<Image src="/api/image?id=123" />  // 동작함

// Next.js 16
// localPatterns 설정 필수!
// next.config.js
images: {
  localPatterns: [
    { pathname: '/api/image', search: '?id=*' }
  ]
}

🛡️ 로컬 IP 차단

 
 
javascript
// Next.js 16
// 기본적으로 로컬 IP 이미지 최적화 차단
images: {
  dangerouslyAllowLocalIP: true,  // 명시적으로 허용 필요
}

🎛️ 6. Middleware → Proxy 권장

15버전

 
 
javascript
// middleware.ts
export function middleware(request) {
  // ...
}

16버전 권장사항

 
 
javascript
// proxy.ts (권장되는 새 이름!)
export function proxy(request) {
  // ...
}

아직 middleware.ts도 동작하지만, 앞으로는 proxy.ts로 이름을 바꾸는 것이 권장돼요. 네트워크 경계와 라우팅 초점을 더 명확히 하기 위한 변경이라고 합니다.

마이그레이션 코드모드 제공:

 
 
bash
npx @next/codemod@canary middleware-to-proxy

🧪 7. 실험적 기능들

Build Adapters API (Alpha)

커스텀 빌드 어댑터를 만들어서 배포 플랫폼에 맞게 빌드 프로세스를 수정할 수 있어요.

 
 
javascript
// next.config.js
const nextConfig = {
  experimental: {
    adapterPath: require.resolve('./my-adapter.js'),
  },
};

Cache Components

PPR(Partial Pre-Rendering)이 Cache Components로 통합되었어요.

 
 
javascript
// Next.js 15
experimental: {
  ppr: true,  // 이렇게 사용했음
}

// Next.js 16
experimental: {
  cacheComponents: true,  // 이제 이렇게!
}

Model Context Protocol (MCP) 서버

개발 서버에 MCP 서버가 추가되어 AI 도구와의 통합이 가능해졌어요!

 
 
bash
# 환경변수로 활성화
NEXT_MCP_ENABLED=true next dev

📦 8. 그 외 주요 변경사항

Client Segment Cache 기본 활성화

 
 
javascript
// Next.js 15
experimental: {
  clientSegmentCache: true,  // 명시적 설정 필요
}

// Next.js 16
// 기본적으로 활성화됨! 설정 불필요

React Compiler 정식(Stable) 지원

 
 
javascript
// Next.js 15
experimental: {
  reactCompiler: true,
}

// Next.js 16 (stable!)
reactCompiler: true,  // experimental 아님!

병렬 라우트에 default.js 필수

 
 
javascript
// Next.js 15
app/
  @modal/
    page.tsx  // default.js 없어도 동작

// Next.js 16
app/
  @modal/
    page.tsx
    default.tsx  // 필수! 없으면 빌드 에러
 
 
tsx
// default.tsx
export default function Default() {
  return null;  // 또는 notFound()
}

🚀 마이그레이션 방법

1. 자동 업그레이드 (권장!)

 
 
bash
npx @next/codemod@canary upgrade beta

2. 수동 업그레이드

 
 
bash
npm install next@beta react@latest react-dom@latest

3. 새 프로젝트 시작

 
 
bash
npx create-next-app@beta

💭 내 생각은...

Next.js 16 Beta를 직접 테스트해본 결과, Turbopack의 성능 개선이 정말 체감됩니다. 특히 대규모 프로젝트에서 개발 서버 시작 시간이 확 줄어든 게 느껴지더라고요.

다만 Breaking Changes가 많아서 기존 프로젝트를 바로 업그레이드하기엔 신중해야 할 것 같아요. 특히:

  • 동기 API가 모두 비동기로 변경된 점
  • next/image 기본값 변경으로 인한 이미지 캐싱 동작 변화
  • AMP 지원 제거 (AMP 사용 중이라면 대안 필요)

이런 부분들은 프로덕션 환경에 적용하기 전에 충분한 테스트가 필요합니다.

업그레이드 추천 시기

✅ 바로 시도해볼 만한 경우:

  • 새 프로젝트 시작
  • 개발 환경에서 먼저 테스트
  • Turbopack 성능 개선 체험하고 싶을 때

⏸️ 좀 더 기다릴 경우:

  • 중요한 프로덕션 서비스
  • AMP 사용 중
  • React 18 사용 중 (아직 19로 업그레이드 안 한 경우)

🎁 마무리하며

Next.js 16 Beta는 성능과 개발자 경험 양쪽 모두에서 큰 발전을 이룬 버전이에요. Turbopack의 안정화, 향상된 라우팅 시스템, 새로운 캐싱 API까지... 프론트엔드 개발의 미래가 정말 기대되네요! ✨

Beta 버전이니만큼 아직 안정화 작업이 진행 중이지만, 지금부터 테스트해보고 피드백을 공유하면 안정 버전이 나올 때 더 완성도 높은 프레임워크를 만날 수 있을 거예요.

여러분의 프로젝트에는 어떤 기능이 가장 유용할 것 같나요? 댓글로 의견 공유해주시면 함께 이야기 나눠요! 💬

그럼 오늘도 즐거운 코딩 되세요! 🚀


🔗 참고 자료

반응형