Next.js는 서버 코드를 두 가지 런타임에서 실행할 수 있습니다. Node.js 런타임(기본값)은 완전한 Node 환경이고, Edge 런타임은 사용자에게 가까운 전 세계 분산 엣지 위치에서 실행되는 가볍고 V8 기반의 환경입니다.
런타임 선택
ts
// 라우트 핸들러 / 페이지별로
export const runtime = "edge"; // 또는 "nodejs" (기본값)
Node.js 런타임 Edge 런타임
────────────────────────────────────────────────────────────────
API 완전한 Node (fs, crypto, Web API만 (fetch,
Buffer, 네이티브 모듈) Request/Response) — 제한됨
npm 패키지 전부 Node API를 쓰지 않는 것만
콜드 스타트 느리고 무거움 거의 0, 가벼움
위치 리전 (단일 리전) 글로벌 (사용자 근처)
사용자까지 지연 멀면 더 높음 매우 낮음 (지리 분산)
실행 한계 더 길고, 더 많은 메모리 짧은 CPU 시간, 적은 메모리
데이터베이스 직접 TCP 연결 HTTP 기반 DB만 (raw TCP 불가)
✓ middleware (인증 검사, 리다이렉트, 지역 routing) — 빠르고 글로벌해야 함
✓ 단순하고 지연에 민감한 엔드포인트 (개인화, A/B, 기능 플래그)
✓ 응답을 맞춤화하기 위한 지오로케이션/헤더 읽기
Edge는 사용자에게 가까이 있는 것과 즉각적인 콜드 스타트로 이득을 보는 가벼운 로직에 빛납니다.
✓ 직접 데이터베이스 연결 (TCP를 통한 Prisma 등)
✓ 무거운 연산, 큰 의존성, 네이티브 모듈
✓ Node 전용 API를 사용하는 모든 것 (fs, Node의 crypto.randomBytes, Buffer)
export const runtime = "edge";
import fs from "fs"; // ❌ Edge에서 사용 불가 — 빌드/런타임 에러
import { PrismaClient } from "@prisma/client"; // ⚠️ Edge에서는 HTTP/data-proxy 필요
많은 인기 라이브러리(raw DB 소켓을 여는 ORM 포함)는 HTTP 기반 어댑터 없이는 Edge에서 동작하지 않습니다. 흔한 함정입니다.
런타임 선택은 실질적인 아키텍처 결정입니다. Edge는 최소한의 콜드 스타트로 빠르고 글로벌하며 가벼운 로직(특히 middleware)에, Node.js는 완전한 API 접근, 직접 DB 연결, 무거운 작업에 적합합니다.
Edge의 한계(Web API만, raw TCP 없음, 짧은 실행)를 아는 것이 데이터베이스 중심이거나 Node에 의존하는 코드를 그것을 지원할 수 없는 런타임에 두는 빈번한 실수를 막아 줍니다.