
핵심 답변: Nuxt 4.6.0과 4.6.1은 단순한 개발 서버 편의 업데이트가 아닙니다. 서버 코드를 h3와 nitropack의 직접 의존에서 조금씩 떼어 내는 nuxt/server가 생겼고, 4.6.1은 그 새 경로의 성능·개발 서버 문제를 보완했습니다. Nuxt 5와 Nitro v3를 바라보는 프로젝트라면 지금 무조건 마이그레이션하기보다, server/api의 경계를 하나 골라 새 import로 옮기고 SSR·타입 검사·배포 프리뷰까지 묶어 검증하는 것이 안전합니다.
평소에는 defineEventHandler가 자동 import되니 어느 패키지에서 왔는지 생각하지 않아도 됩니다. 그러나 서버 런타임이 바뀌는 시기에는 이 편리함이 발목을 잡을 수 있습니다. 오래된 h3 이벤트 모양과 새 portable RequestEvent를 같은 파일에서 섞으면 Nuxt가 오류를 내며, 리다이렉트·오류 생성·헤더 설정 방식에도 차이가 있습니다. 이번 릴리스의 핵심은 코드가 짧아지는 데 있지 않고, 어느 서버 빌더에서 실행해도 같은 계약을 유지할 수 있게 하는 데 있습니다.
여기서는 10월 초 공개된 공식 릴리스 노트를 기준으로, 실제 Nuxt 서비스에서 먼저 확인할 파일과 테스트를 정리합니다. 특히 server/api, middleware, nuxt.config.ts, CI의 typecheck와 preview 배포가 어떻게 연결되는지에 초점을 맞춥니다.
무슨 일이 있었나
Nuxt 팀은 2026년 10월 5일 Nuxt v4.6.0을 공개했습니다. 공식 설명에 따르면 4.5.2 이후 420개 이상 커밋이 들어간 마이너 릴리스이며, Nuxt 3는 2026년 7월 31일에 EOL(지원 종료)에 도달해 3.x 동시 릴리스는 없습니다. 따라서 아직 Nuxt 3에 머문 서비스라면 “다음 패치까지 기다리자”가 아니라 4.x 업그레이드 계획을 별도 작업으로 잡는 편이 맞습니다.
가장 큰 변화는 nuxt/server import 표면입니다. 핸들러·미들웨어·서버 유틸리티가 휴대 가능한 RequestEvent 타입을 향하도록 하고, 기본 구현은 여전히 Nitro지만 장기적으로 Nitro v3, h3 v2, 실험적 Vite 서버 사이의 결합을 줄입니다. 같은 릴리스에는 NUXT_APP_SECRET 기반의 앱 시크릿과 세션 도우미, 대형 라우트 집합에서 타입 깊이 문제를 줄인 typed $fetch, 새 CLI v4도 포함됐습니다.
이어 10월 9일 v4.6.1 패치가 나왔습니다. portable event의 web view를 첫 접근 시 만들도록 해 성능을 조정했고, Vite 8.1 이상 의존성 최적화 메시지, baseURL이 있는 fetch 응답 타입, nodenext에서의 Nitro 타입 해석, dev server 핸들러 중복 등록 같은 문제를 고쳤습니다. 4.6.0을 시험했다면 4.6.1을 기준으로 재검증하는 편이 낫습니다.
왜 중요한가
서버 의존성은 보통 API 핸들러보다 모듈과 플러그인에서 더 깊게 퍼집니다. h3의 타입을 앱 전역으로 끌어올리면 Nitro와 h3의 메이저 버전 차이가 TypeScript 충돌로 드러날 수 있습니다. Nuxt가 자체 서버 계약을 제공하면 프레임워크가 업스트림 변경을 흡수할 여지가 생기고, 앱과 모듈은 더 안정적인 import 경계에 설 수 있습니다. 다만 이는 기존 API가 사라진다는 뜻이 아닙니다. 공식 노트도 특수 기능이 필요하면 기존 h3 또는 nitropack/runtime import가 그대로 동작한다고 밝힙니다.
운영 관점에서는 배포 플랫폼을 바꾸거나 preview 환경을 늘릴 때 가치가 큽니다. SSR 요청의 URL·헤더·응답 상태가 Web API 모양으로 정리되면, Cloudflare·Node·향후 서버 구현 사이에서 앱 코드를 덜 고칩니다. 반대로 업로드 multipart 처리처럼 새 표면에 없는 기능을 억지로 옮기면 배포 위험만 커집니다. 새 경계는 선택적으로 도입하고, 기존 동작의 회귀를 정확히 잡는 방식이 좋습니다.
server/api: 한 파일에서 import 계열을 섞지 않습니다
먼저 단순한 읽기 API 하나를 고르십시오. 예를 들어 server/api/projects.get.ts라면 다음처럼 새 import를 명시합니다.
import { defineEventHandler, getQuery } from 'nuxt/server'
export default defineEventHandler((event) => {
const { team } = getQuery<{ team?: string }>(event)
return { team: team ?? 'default' }
})
여기서 중요한 점은 자동 import된 defineEventHandler와 nuxt/server의 defineEventHandler를 한 핸들러에서 섞지 않는 것입니다. Nuxt 4의 자동 import는 여전히 h3 도우미이며 이벤트 형태가 다릅니다. 혼용 시 NUXT_E8012가 나타날 수 있습니다. 파일 단위로 새 표면을 선택하고, 코드 리뷰에서 import를 확인하는 규칙을 두면 원인을 찾기 쉽습니다.
마이그레이션 전후에는 curl만 하지 말고 입력 없는 요청, 잘못된 query, 인증 없는 요청, 에러 응답을 모두 테스트하십시오. 새 API에서 응답 상태는 event.res.status와 event.res.statusText, 헤더는 event.res.headers로 다룹니다. 기존 h3 방식의 응답 제어를 무심코 복사하면 타입은 통과해도 SSR 프리뷰에서 결과가 달라질 수 있습니다.
검증된 입력과 typed fetch: 대형 API에서 CI 시간을 측정합니다
4.6은 route tree를 바탕으로 typed $fetch를 다시 구성했습니다. 릴리스 노트의 측정에서는 라우트가 수백·수천 개일 때 이전 방식의 타입 인스턴스화가 크게 늘고 TS2589가 발생하던 문제가 줄었습니다. Nuxt 4에서는 기본값이 아니라 opt-in입니다. 처음부터 전역 활성화하지 말고 nuxt.config.ts의 브랜치에서 켠 뒤 CI 시간을 비교하십시오.
export default defineNuxtConfig({
experimental: {
routeTypedFetch: true,
strictRouteTypes: true
}
})
strictRouteTypes는 존재하지 않는 경로 호출을 더 빨리 잡을 수 있지만, 동적으로 만드는 URL이나 손으로 선언한 ServerRoutes 확장이 있는 프로젝트에서는 타입 수정이 필요할 수 있습니다. server/api/orders.post.ts에서 body 스키마를 검증한다면, 호출하는 composable의 정상·누락·잘못된 타입 케이스를 단위 테스트와 nuxi typecheck로 같이 보십시오. 타입이 좋아졌다고 런타임 인증이 생기는 것은 아닙니다.
세션과 NUXT_APP_SECRET: 배포 환경의 시크릿을 명시합니다
4.6은 runtimeConfig.appSecret과 NUXT_APP_SECRET를 도입하고, 이를 바탕으로 목적별 비밀을 파생하는 deriveSecret 및 쿠키에 봉인하는 세션 도우미를 제공합니다. 개발 환경에서는 값이 없을 때 생성·보존할 수 있지만 빌드는 시크릿을 만들지 않습니다. 즉 로컬에서 잘 됐다는 이유로 preview와 production이 안전하다고 볼 수 없습니다.
CI/CD의 배포 변수에 NUXT_APP_SECRET이 환경별로 설정됐는지, 교체 시 기존 세션을 어떻게 무효화할지 먼저 정하십시오. 값을 nuxt.config.ts에 하드코딩하거나 runtimeConfig.public에 넣어서는 안 됩니다. 쿠키 기반 세션이 저장소 설정을 줄여도, 관리자 화면에서 세션 무효화와 권한 변경을 확인하는 흐름은 별도로 필요합니다.
CLI v4와 개발 서버: 빠른 시작보다 재현 가능한 오류 보고가 먼저입니다
Nuxt 4.6과 함께 @nuxt/cli v4가 배포됐습니다. dev 터미널 UI, route·network·오류 패널, 느린 시작 원인 표시, 실행 중 서버와 통신하는 명령이 추가됐습니다. 공식 노트의 측정에서는 CLI 설치 크기와 첫 화면 시간이 줄었지만, 수치는 자신의 모듈·OS·캐시 조건과 다를 수 있습니다.
개발팀에는 오류가 한 번만 정확히 보이는 쪽이 더 중요합니다. 4.6의 새 오류 채널은 nuxt.config.ts 문법 오류를 고친 뒤 개발 페이지를 다시 로드하는 흐름을 개선합니다. 4.6.1은 dev handler 등록과 Vite 관련 문제도 고쳤습니다. 업그레이드 PR에서 pnpm dev만 열어 보지 말고, 설정 파일 오류를 의도적으로 만들었다 고친 뒤 SSR 오류 overlay·터미널 로그·HMR 복구가 모두 정상인지 확인하십시오.
배포와 롤백: 실험적 서버 선택은 preview에서만 시작합니다
Nuxt는 기본 Nitro가 대부분의 경우 맞다고 명시합니다. @nuxt/vite-server는 실험적 구현이므로, 새 서버 빌더를 운영에 바로 넣기보다 preview 환경에서 routeRules, 이미지, 리다이렉트, 에러 페이지, 캐시 헤더를 비교해야 합니다. 특히 routeRules로 ISR이나 캐시를 설정한 서비스는 SSR HTML과 API 응답이 동일한 헤더를 내는지 확인하십시오.
롤백은 package.json 버전만 되돌리는 일이 아닙니다. lockfile, Node 버전, 배포 어댑터, 새 시크릿 변수와 함께 되돌릴 지점을 문서화해야 합니다. 4.6.0에서 시작했다면 4.6.1 패치와 비교해 dev·build·preview를 다시 돌리고, 장애 시에는 새 nuxt/server 파일만 기존 h3 구현으로 되돌릴 수 있도록 PR을 작게 유지하는 편이 낫습니다.
개발자 실행 계획
- 1.
nuxi info, Node 버전, lockfile의 Nuxt를 기록하고 4.6.1 기준 업그레이드 브랜치를 만듭니다. - 2.
server/api의 단순 GET 한 개만nuxt/server로 옮기고 import 혼용을 검사합니다. - 3. 해당 API의 정상·오류·인증 실패 테스트를 추가하고 SSR 페이지에서 호출해 봅니다.
- 4.
nuxi typecheck, build, preview를 CI 필수 단계로 실행해 시간과 오류를 비교합니다. - 5.
NUXT_APP_SECRET의 preview/production 설정과 교체 절차를 배포 문서에 적습니다. - 6. routeTypedFetch는 별도 PR에서 켜고 동적 URL·ServerRoutes 오류를 정리합니다.
- 7. preview에서 routeRules, 쿠키, 리다이렉트, 캐시 헤더를 캡처해 기존 배포와 비교합니다.
리스크와 한계
nuxt/server는 이식성 있는 기본 표면이지 h3의 모든 기능을 즉시 대체한다는 선언이 아닙니다. multipart·특정 Nitro 훅처럼 새 표면 밖의 기능은 기존 import를 유지하는 편이 안전할 수 있습니다. 또한 routeTypedFetch와 strictRouteTypes는 Nuxt 4에서 실험적 opt-in이므로, 타입 오류가 늘었다면 설정을 되돌리고 작은 범위부터 정리하십시오.
Nuxt 3 EOL은 중요한 사실이지만, 모든 서비스가 당일 대규모 업그레이드를 해야 한다는 뜻은 아닙니다. 현재 보안 요구, 모듈 호환성, Node 런타임을 확인하고 스테이징에서 롤백 가능한 배포를 먼저 만드십시오. 공식 릴리스 노트의 성능 수치도 각 프로젝트의 절대 성능 보장은 아니므로 CI와 실제 preview 지표로 판단해야 합니다.
FAQ
Nuxt 4.6으로 올리면 모든 server/api를 nuxt/server로 바꿔야 하나요?
아닙니다. 공식 노트도 기존 h3·Nitro import가 계속 동작한다고 설명합니다. Nuxt 5 준비가 필요한 파일부터 명시적으로 옮기고 회귀 테스트를 통과시키십시오.
Nuxt 4.6.0 대신 4.6.1을 설치해야 하나요?
새 도입이라면 4.6.1이 합리적입니다. 4.6.0 뒤에 나온 패치로 개발 서버, 타입 해석, Vite 호환성, portable event 성능 관련 수정이 포함됐습니다.
NUXT_APP_SECRET 없이 세션 기능을 운영에 써도 되나요?
권장하지 않습니다. 개발 환경의 자동 생성과 운영 빌드는 다릅니다. 배포 환경에 충분히 긴 비밀값을 설정하고 교체·무효화 절차를 마련해야 합니다.
출처 및 추가 읽기
- Nuxt v4.6.0 공식 릴리스 노트
- Nuxt v4.6.1 공식 릴리스 노트
- Nuxt Server Imports 가이드
- Nuxt upgrade: nuxt/server으로 이동
- Nuxt experimental routeTypedFetch 문서
- Nuxt CLI v4 공식 릴리스
더 깊게 읽기: 실전 가이드
이 리포트는 최근 흐름을 빠르게 파악하기 위한 요약입니다. 실제 프로젝트에 적용할 때는 아래의 기준 글과 함께 확인하면 더 안전합니다.
