프로젝트에서 Next.js 13을 사용하던 중, 특정 API 요청에 대해 초기 응답 시간이 10~15초가량 지연되는 현상이 발생했다.
단순한 API 응답 지연이 아닌, 첫 요청 시에만 발생하는 일회성 지연이라는 점에서 콜드 스타트(cold start)를 의심하게 되었고, 본격적인 문제 분석과 해결에 착수했다.
모든 요청이 정상적인 200이나 304 상태 코드였지만, 첫 로딩 시만 비정상적으로 긴 대기 시간

뭐냐,, 왜 12초나 걸리는거냐. 너..
이후 동일 요청은 매우 빠르게 처리됨
이 현상은 Vercel 또는 서버리스 환경에서 발생하는 대표적인 cold start 패턴이었다.
콜드 스타트는 서버리스 환경에서 자주 발생하는 문제로,
초기 요청 시 런타임 환경을 새로 띄우는 시간 지연 현상을 말한다.
특히 Next.js의 기반 프로젝트에서는 dynamic import 또는 lazy loading
ESM 패키지 처리 방식이 복합적으로 작용해 cold start latency가 증가할 수 있다.
✅ ESM 패키지 transpile 및 cheerio import 방식 수정 등 구조적 안정성 확보
✅ NumericFormat 타입 오류 해결을 포함한 TypeScript 문제 처리
// next.config.js
module.exports = {
transpilePackages: ['cheerio', 'rc-util', 'lodash-es'],
}

왼쪽이 Next.js@13 , 우측 사진이 Next.js@14 이다. Vercel에서 로그표시도 달라졌다.

사용자가 해당 페이지에 요청을 보냈을 때, 만약 캐시 만료되었다면:
새로 데이터를 fetch하고 HTML을 재생성한 뒤 응답
이때 문제는, ISR이 실제 유저 요청과 동기적으로 묶여 있음
→ 결과적으로 콜드 스타트 + API fetch 지연 + HTML 생성이 겹치면
→ 한 요청에 10초, 15초 이상 걸리는 경우가 생긴다.
유저가 요청을 보내면 → 기존 캐시된 HTML을 즉시 반환
동시에 백그라운드에서 API fetch + 캐시 갱신 작업을 실행
이 재생성된 HTML은 다음 요청에 쓰임
즉, ISR Cache updated는 사용자 응답 이후에 이뤄지는 구조.
Vercel 로그에 Background Revalidation으로 찍힘
Execution Duration: 136ms 처럼 엄청 빠르게 응답한 것도, 캐시가 먼저 반환되서.