
2024년 12월 10일, Next.js 15.1이 정식으로 출시되었다.
이번 릴리즈는 React 19 정식 지원, 개선된 오류 디버깅, 안정화된 after() API, 새로운 인증 오류 처리 API와 같은 다양한 업데이트를 포함하고 있다. 15.1버전에서 제공하는 새로운 기능들을 살펴보고, 각 기능이 어떤 영향을 미치는지 알아보자!
Next.js 15.1은 React 19를 정식으로 지원한다. React 19는 Pages Router와 App Router에서 모두 사용할 수 있으며, 안정성과 성능 면에서 중요한 개선 사항을 제공한다.
Pages Router와 App Router에서의 지원
Next.js 15.1에서는 오류 디버깅 경험을 대폭 개선했다. 오류 발생 시 불필요한 정보를 숨기고 애플리케이션 코드에 집중할 수 있도록 개선되어, 개발자가 문제의 원인을 더 빠르고 직관적으로 파악할 수 있게 되었다.
Source Map 개선
소스 맵 개선을 통해 오류의 출처를 더 정확하게 파악할 수 있다.
Edge 런타임 오류 처리
Edge 런타임 환경에서의 오류 처리가 더욱 개선되었다.
Terminal Before:
⨯ app/page.tsx (6:11) @ eval
⨯ Error: boom
at eval (./app/page.tsx:12:15)
at Page (./app/page.tsx:11:74)
at AsyncLocalStorage.run (node:async_hooks:346:14)
at stringify (<anonymous>)
at AsyncLocalStorage.run (node:async_hooks:346:14)
at AsyncResource.runInAsyncScope (node:async_hooks:206:9)
digest: "380744807"
4 | export default function Page() {
5 | const throwError = myCallback(() => {
> 6 | throw new Error('boom')
| ^
7 | }, [])
8 |
9 | throwError()
GET / 500 in 2354ms
Terminal After:
⨯ Error: boom
at eval (app/page.tsx:6:10)
at Page (app/page.tsx:5:32)
4 | export default function Page() {
5 | const throwError = myCallback(() => {
> 6 | throw new Error('boom')
| ^
7 | }, [])
8 |
9 | throwError() {
digest: '225828171'
}
Next.js 15.1에서는 after() API가 안정화되었다. 이 API는 응답 스트리밍이 완료된 후에도 추가 작업을 실행할 수 있도록 지원하며, 주로 로그 기록, 데이터 처리, 시스템 동기화와 같은 비차단 작업에 사용된다. 응답 성능을 유지하면서도 부가 작업을 분리해 실행할 수 있어 효율적인 작업 처리가 가능하다.
역할
사용 예제
import { after } from 'next/server';
export default function Layout({ children }) {
after(() => {
console.log('응답 후 작업 수행');
});
return <>{children}</>;
}
이 간단한 형태로 after()는 응답 흐름을 방해하지 않고 추가 작업을 처리할 수 있는 유연성을 제공한다.
Next.js 15.1에서는 새로운 인증 오류 처리 API인 forbidden()과 unauthorized()를 도입했다. 이 API는 기존의 notFound() API와 유사한 방식으로 동작하며, 사용자 인증 및 권한 관리를 더욱 세밀하게 처리할 수 있도록 설계되었다.
설정 및 사용 방법
1. 기능 활성화 next.config.ts 파일에 다음 설정 추가:
const nextConfig = {
experimental: {
authInterrupts: true,
},
};
export default nextConfig;
2. API 활용
import { forbidden } from 'next/navigation';
export default async function AdminPage() {
const session = await verifySession();
if (session.role !== 'admin') forbidden();
return <h1>관리자 페이지</h1>;
}
import { unauthorized } from 'next/navigation';
export default async function ProtectedPage() {
const session = await verifySession();
if (!session) unauthorized();
return <h1>인증된 페이지</h1>;
}
3. 커스터마이징 가능한 오류 페이지
forbidden.tsx와 unauthorized.tsx 파일을 생성하여 맞춤 UI를 제공할 수 있다.
import Link from 'next/link';
export default function Forbidden() {
return (
<div>
<h2>접근 금지</h2>
<p>이 자원에 대한 접근 권한이 없습니다.</p>
<Link href="/">홈으로 돌아가기</Link>
</div>
);
}
import Link from 'next/link';
export default function Unauthorized() {
return (
<div>
<h2>인증 필요</h2>
<p>이 페이지에 접근하려면 로그인해야 합니다.</p>
<Link href="/login">로그인 페이지로 이동</Link>
</div>
);
}
Next.js는 빈번한 업데이트를 통해 개발자들에게 항상 새로운 기능과 개선된 경험을 제공하며, 최신 웹 개발 트렌드에 맞춰 나아가는 모습을 보여주고 있다. 이러한 빠른 업데이트 주기는 개발자들에게 새로운 기능과 도구를 빠르게 접할 기회를 주는 동시에, 적응해야 할 부분이 많아지고 기존 코드와의 호환성 문제를 고민해야 하는 부담을 안기기도 한다. 그러나 이러한 부담을 감수하더라도 지속적인 발전과 혁신을 이루어나가는 Next.js의 행보는 매우 인상적이다.
이번 업데이트를 바로 적용해보고 개선된 Next.js의 기능을 직접 체험할 계획이다. 새로운 기능들이 실제 프로젝트에서 어떤 영향을 미칠지 경험해보는 것이 기대된다. 앞으로의 업데이트에서도 Next.js가 어떤 방향으로 나아갈지 더욱 기대하게 된다.