
npx @next/codemod@canary upgrade latestpackage.json 의 Next.js, React, React DOM 버전을 최신으로 변경next.config.js 설정 파일 업데이트 (제거된 옵션 삭제 등)props 타입과 사용법을 변경해야 합니다.// [변경 전]
// export default function Page({ params }: { params: { slug: string } }) { ... }
// [변경 후]
// 1. Props 타입: params를 Promise로 감싸줍니다.
export default async function Page({ params }: { params: Promise<{ slug: string }> }) {
// 2. 데이터 접근: 반드시 await를 사용하여 값을 추출해야 합니다.
// await 없이 params.slug에 접근하면 런타임 에러가 발생합니다.
const { slug } = await params;
return <div>Blog Post: {slug}</div>;
}next/headers 에서 가져오는 함수들도 모두 await 가 필요합니다.import { cookies } from 'next/headers';
export default async function RootLayout({ children }: { children: React.ReactNode }) {
// [변경] cookies() 호출 앞에 await를 붙여야 합니다.
// 이전 버전(v15)에서는 경고만 떴지만, v16에서는 에러가 발생합니다.
const cookieStore = await cookies();
const theme = cookieStore.get('theme');
return (
<html lang="en" className={theme?.value}>
<body>{children}</body>
</html>
);
}?v=1 같은 쿼리 파라미터를 사용하고 있었다면, 이제 next.config.js 에 명시적으로 허용 설정을 추가해야 합니다.
이는 무분별한 이미지 생성을 막기 위한 조치입니다.localhost)이 아닌, 사설 네트워크 등에서 로컬 IP로 이미지를 로드해야 한다면 dangerouslyAllowLocalIP 옵션을 켜야 합니다.module.exports = {
images: {
// 1. 로컬 이미지에 쿼리 스트링 사용 시 패턴 명시 필요
localPatterns: [
{
pathname: '/assets/**',
search: '?v=1',
},
],
// 2. 사설망 등에서 로컬 IP로 이미지 로드 시 필요 (보안 주의)
// 기본값은 false로 변경되었습니다.
dangerouslyAllowLocalIP: true,
},
};@folder 형식을 사용 중이라면 주의하세요.
이제 각 슬롯에 대응하는 default.js 파일이 없으면 // 해당 슬롯에 보여줄 기본 컨텐츠가 없더라도 파일은 생성해야 합니다.
export default function Default() {
// 아무것도 렌더링하지 않으려면 null을 반환합니다.
return null;
}middleware.ts (또는 .js) 파일의 이름을 middleware 에서 proxy 로 변경해야 합니다.# 파일명 변경
mv middleware.ts proxy.tsimport { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
// [변경] 함수 이름을 proxy로 수정
export function proxy(request: NextRequest) {
return NextResponse.next();
}config.amp 나 useAmp 훅을 사용 중이라면 제거해야 합니다.next build 과정에서 린트(Lint)가 자동으로 실행되지 않습니다.
CI/CD 파이프라인에 별도로 eslint 명령어를 추가해 주세요.next/legacy/image 컴포넌트는 삭제되었습니다.
표준 next/image 로 교체해야 합니다.