Next.js의 런타임(runtime)
은 실행 중에 코드에서 사용할 수 있는 라이브러리, API 및 일반적인 기능 집합을 의미한다.
Next.js에는 애플리케이션 코드의 일부를 렌더링할 수 있는 두 가지 서버 런타임이 있다
Node.js 런타임
Edge 런타임
각 런타임은 고유한 API 세트를 가지고 있다. 두 런타임 모두 배포 인프라에 따라 스트리밍
도 지원할 수 있다.
기본적으로, app
디렉토리는 Node.js 런타임을 사용한다. 그러나 라우트별로 다른 런타임으로 선택할 수도 있다.
런타임을 선택할 때 고려해야 할 많은 사항이 있다. 다음 표는 주요 차이점을 한눈에 보여준다.
Node | Serverless | Edge | |
---|---|---|---|
Cold Boot | / | ~250ms | Instant |
HTTP Streaming | Yes | Yes | Yes |
IO | All | All | fetch |
Scalability | / | High | Highest |
Security | Normal | High | High |
Latency | Normal | Low | Lowest |
npm Packages | All | All | A smaller subset |
Next.js에서 경량화된 엣지 런타임은 사용 가능한 Node.js API의 일부이다.
엣지 런타임은 작고 간단한 함수로 낮은 대기 시간에 동적이고 개인화된 콘텐츠를 제공해야 하는 경우에 이상이다. 엣지 런타임은 리소스 사용을 최소화하여 속도를 높이지만, 많은 상황에서 제한적일 수 있다.
예를 들어, Vercel의 엣지 런타임에서 실행되는 코드는 1MB
에서 4MB
사이로 제한되며, 이 제한에는 가져온 패키지, 폰트 및 파일이 포함되며, 배포 인프라에 따라 다를 수 있다.
Node.js 런타임을 사용하면 모든 Node.js API와 그에 의존하는 모든 npm 패키지에 액세스할 수 있다. 그러나 엣지 런타임을 사용하는 라우트에 비해 시작 속도가 느릴 수 있다.
Next.js 애플리케이션을 Node.js 서버에 배포하는 경우 인프라 관리, 확장 및 구성을 직접 처리해야 한다. 또는 Vercel과 같은 서버리스 플랫폼에 Next.js 애플리케이션을 배포할 수 있으며, 이를 플랫폼이 대신 처리해준다.
서버리스는 엣지 런타임보다 더 복잡한 계산 작업을 처리할 수 있는 확장 가능한 솔루션을 필요로 하는 경우에 이상적이다. 예를 들어, Vercel의 서버리스 함수를 사용하면 가져온 패키지, 폰트 및 파일을 포함한 전체 코드 크기는 50MB
이다.
엣지를 사용하는 라우트와 비교했을 때 단점은 서버리스 함수가 요청을 처리하기 전에 부팅하는 데 수백 밀리초가 걸릴 수 있다는 것이다. 사이트의 트래픽 양에 따라 함수가 자주 "워밍(warm)"되지 않기 때문에 이는 빈번한 현상일 수 있다.
Next.js 애플리케이션에서 개별 라우트 세그먼트에 대해 런타임을 지정할 수 있다. 이를 위해 runtime
이라는 변수를 선언하고 내보내야 한다. 이 변수는 문자열이어야 하며, 'nodejs'
또는 'edge'
런타임 중 하나의 값을 가져야 한다.
다음 예제는 'edge'
값을 가진 runtime
을 내보내는 페이지 라우트 세그먼트를 보여준다.
export const runtime = 'edge'; // 'nodejs' (default) | 'edge'
세그먼트 런타임이 설정되지 않은 경우 기본적으로 nodejs
런타임이 사용된다. Node.js 런타임으로 변경할 계획이 없다면 runtime
옵션을 사용할 필요는 없다.
[출처]
https://nextjs.org/docs/app/building-your-application/rendering/edge-and-nodejs-runtimes