원클릭으로
jikime-framework-nextjs15
Next.js 15 upgrade guide with breaking changes from 14. Async params, Turbopack stable, fetch caching changes.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Next.js 15 upgrade guide with breaking changes from 14. Async params, Turbopack stable, fetch caching changes.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
AI-powered legacy site rebuilding workflow. Captures screenshots, analyzes source code, and generates modern frontend/backend code. Claude Code reads screenshots and writes actual code. Use when rebuilding legacy PHP, WordPress, or similar sites to Next.js, React, or other modern frameworks.
하네스를 구성합니다. 전문 에이전트를 정의하며, 해당 에이전트가 사용할 스킬을 생성하는 메타 스킬. (1) '하네스 구성해줘', '하네스 구축해줘' 요청 시, (2) '하네스 설계', '하네스 엔지니어링' 요청 시, (3) 새로운 도메인/프로젝트에 대한 하네스 기반 자동화 체계를 구축할 때, (4) 하네스 구성을 재구성하거나 확장할 때 사용.
Leader agent role guide for jikime team orchestration. Covers task distribution, plan approval, worker monitoring, and team shutdown. Use when spawned as the leader role in a jikime team.
Reviewer agent role guide for jikime team orchestration. Covers plan review, quality assessment, acceptance criteria validation, and feedback delivery via team inbox. Use when spawned as the reviewer role in a jikime team.
Use this skill when the user asks to "jikime team을 사용해줘", "팀 만들어줘", "에이전트 생성해줘", "멀티 에이전트로 작업해줘", "병렬로 에이전트 실행해줘", "여러 에이전트 조율해줘", "작업을 여러 에이전트에게 분배해줘", "team status 확인해줘", "task 만들어줘", "inbox 확인해줘", or mentions "jikime team", "multi-agent coordination", "spawn agents", "team tasks", "agent inbox", "task board", "team leader", "team worker". Also trigger when the scope of work is large enough to benefit from splitting into parallel subtasks — for example "전체 코드베이스 리팩토링", "여러 기능 동시에 구현", "대규모 분석", "full-stack app 만들어줘". Provides comprehensive guidance for using the jikime team CLI to orchestrate multi-agent teams with task management, messaging, and monitoring.
Claude Code skill for operating as part of a jikime multi-agent team (swarm). Provides command reference, coordination protocols, and role-specific workflows for leader, worker, and reviewer agents. Triggers when the task involves multi-agent coordination, spawning workers, assigning tasks, monitoring team progress, or when the scope exceeds what a single agent can efficiently handle (e.g., "build a full-stack app", "implement multiple features in parallel", "refactor the entire codebase"). Also triggers on keywords: "create a team", "spawn agents", "assign tasks", "team status", "board attach", "agent inbox", "multi-agent", "swarm", "jikime team".
| name | jikime-framework-nextjs@15 |
| description | Next.js 15 upgrade guide with breaking changes from 14. Async params, Turbopack stable, fetch caching changes. |
| tags | ["framework","nextjs","version","async-params","turbopack","react-19"] |
| triggers | {"keywords":["nextjs 15","next.js 15","async params","turbopack","react 19"],"phases":["run"],"agents":["frontend"],"languages":["typescript"]} |
| progressive_disclosure | {"enabled":true,"level1_tokens":"~100","level2_tokens":"~2022"} |
| type | version |
| framework | nextjs |
| version | 15 |
| previous_version | 14 |
| user-invocable | false |
Next.js 14에서 15로 업그레이드 시 필요한 breaking changes와 마이그레이션 패턴을 정의합니다.
| 항목 | 값 |
|---|---|
| Version | 15.0.0 ~ 15.x |
| Release Date | October 2024 |
| Node.js | 18.18+ (20+ recommended) |
| React | 19 RC |
다음 규칙은 Next.js 14부터 동일하게 적용됩니다. 상세 내용은 jikime-framework-nextjs@14를 참조하세요.
| 규칙 | 요약 |
|---|---|
| 프로젝트 구조 | src/app/ 기반 App Router, src/app/api/[endpoint]/route.ts API 라우트 |
| 네이밍 규칙 | 폴더/파일: kebab-case, 컴포넌트 export: PascalCase |
| UI 라이브러리 | shadcn/ui 필수 사용, lucide-react 아이콘 |
| 스타일링 | Tailwind CSS + CSS variables 기반 테마 |
새 프로젝트를 시작할 때는 다음 순서로 생성합니다:
# Step 1: Next.js 15 프로젝트 생성
npx create-next-app@15 my-app --typescript --tailwind --eslint --app --src-dir
# Step 2: 프로젝트 폴더로 이동
cd my-app
# Step 3: shadcn/ui 초기화
npx shadcn@latest init
# Step 4: 필요한 컴포넌트 추가
npx shadcn@latest add button card input form table
CRITICAL:
npx shadcn@latest init은 기존 Next.js 프로젝트에서만 실행합니다. 프로젝트 생성은 반드시create-next-app으로 먼저 해야 합니다.
| 변경 사항 | 영향도 | 자동 수정 |
|---|---|---|
params/searchParams async | 🔴 High | codemod |
| fetch cache default 변경 | 🟡 Medium | Manual |
NextRequest.geo/ip 제거 | 🟡 Medium | Manual |
next/dynamic ssr 옵션 | 🟢 Low | codemod |
| Runtime config 제거 | 🟢 Low | Manual |
// src/app/posts/[slug]/page.tsx
type Props = {
params: { slug: string }
searchParams: { [key: string]: string | undefined }
}
export default function PostPage({ params, searchParams }: Props) {
const { slug } = params // Direct access
const { sort } = searchParams
return <div>Post: {slug}</div>
}
export async function generateMetadata({ params }: Props) {
const post = await getPost(params.slug) // Direct access
return { title: post.title }
}
// src/app/posts/[slug]/page.tsx
type Props = {
params: Promise<{ slug: string }> // Now a Promise!
searchParams: Promise<{ [key: string]: string | undefined }>
}
export default async function PostPage({ params, searchParams }: Props) {
const { slug } = await params // Must await
const { sort } = await searchParams
return <div>Post: {slug}</div>
}
export async function generateMetadata({ params }: Props) {
const { slug } = await params // Must await
const post = await getPost(slug)
return { title: post.title }
}
// Before (14)
type LayoutProps = {
children: React.ReactNode
params: { slug: string }
}
// After (15)
type LayoutProps = {
children: React.ReactNode
params: Promise<{ slug: string }>
}
export default async function Layout({ children, params }: LayoutProps) {
const { slug } = await params
return <div>{children}</div>
}
npx @next/codemod@canary next-async-request-api .
// Default: force-cache (cached)
const data = await fetch('https://api.example.com/data')
// Equivalent to: fetch(url, { cache: 'force-cache' })
// Default: no-store (NOT cached)
const data = await fetch('https://api.example.com/data')
// Equivalent to: fetch(url, { cache: 'no-store' })
// To cache, must be explicit:
const data = await fetch('https://api.example.com/data', {
cache: 'force-cache'
})
// Or use time-based revalidation:
const data = await fetch('https://api.example.com/data', {
next: { revalidate: 3600 }
})
// Option 1: Explicit caching per fetch
const data = await fetch(url, { cache: 'force-cache' })
// Option 2: Route segment config
export const fetchCache = 'default-cache'
// Option 3: next.config.js (temporary)
const nextConfig = {
experimental: {
staleTimes: {
dynamic: 30,
static: 180,
}
}
}
// Before (14)
export function middleware(request: NextRequest) {
const { geo, ip } = request
const country = geo?.country
}
// After (15) - Use headers from hosting provider
export function middleware(request: NextRequest) {
// Vercel
const country = request.headers.get('x-vercel-ip-country')
const ip = request.headers.get('x-forwarded-for')
// Or use @vercel/functions
import { geolocation, ipAddress } from '@vercel/functions'
const geo = geolocation(request)
const ip = ipAddress(request)
}
// Before (14)
const Component = dynamic(() => import('./component'), {
ssr: false
})
// After (15)
const Component = dynamic(() => import('./component'), {
ssr: false // Still works but deprecated
})
// Recommended
import dynamic from 'next/dynamic'
const Component = dynamic(() => import('./component'), {
loading: () => <p>Loading...</p>
})
// Use 'use client' directive for client-only components instead
// Before (14) - next.config.js
const nextConfig = {
serverRuntimeConfig: {
mySecret: 'secret'
},
publicRuntimeConfig: {
apiUrl: 'https://api.example.com'
}
}
// In component
import getConfig from 'next/config'
const { serverRuntimeConfig, publicRuntimeConfig } = getConfig()
// After (15) - Use environment variables
// .env.local
MY_SECRET=secret
NEXT_PUBLIC_API_URL=https://api.example.com
// In component
const apiUrl = process.env.NEXT_PUBLIC_API_URL
# Next.js 15: Turbopack is stable for development
next dev --turbo
# Or in package.json
{
"scripts": {
"dev": "next dev --turbo"
}
}
// next.config.ts (TypeScript support)
import type { NextConfig } from 'next'
const nextConfig: NextConfig = {
// config
}
export default nextConfig
'use client'
import { useFormStatus, useFormState } from 'react-dom'
import { useOptimistic, use } from 'react'
// useFormStatus - form submission state
function SubmitButton() {
const { pending } = useFormStatus()
return <button disabled={pending}>Submit</button>
}
// useOptimistic - optimistic UI updates
function TodoList({ todos }) {
const [optimisticTodos, addOptimisticTodo] = useOptimistic(
todos,
(state, newTodo) => [...state, newTodo]
)
}
npx @next/codemod@canary next-async-request-api .npx @next/codemod@canary next-dynamic-ssr .params access uses awaitsearchParams access uses awaitgeo/ip access updated for hosting providerserverRuntimeConfig/publicRuntimeConfig migrated to env varsnext build# Upgrade Next.js
npm install next@15 react@19 react-dom@19
# Run codemods
npx @next/codemod@canary next-async-request-api .
# Upgrade TypeScript types
npm install -D @types/react@19 @types/react-dom@19
# Test
npm run build
npm run dev
If issues occur:
# Revert to Next.js 14
npm install next@14 react@18 react-dom@18
# Revert codemod changes
git checkout .
| 스킬 | 용도 |
|---|---|
jikime-framework-nextjs@14 | Next.js 14 App Router 기본 패턴, 프로젝트 구조, 네이밍 규칙, shadcn/ui |
jikime-framework-nextjs@16 | Next.js 16 업그레이드 가이드 ('use cache', PPR, updateTag) |
jikime-platform-vercel | Vercel 배포, Edge Functions, ISR |
jikime-library-shadcn | shadcn/ui 컴포넌트 라이브러리 (Next.js 필수) |
Version: 1.1.0
Last Updated: 2026-01-23
Upgrade Path: Next.js 15 → 16: See jikime-framework-nextjs@16