Vercel이 배포 속도를 평균 400~600ms 줄인 함수 캐싱 개선을 자동 적용하기 시작했다. 핵심은 배포별 고유 환경변수(`VERCEL_DEPLOYMENT_ID` 등)가 함수 페이로드에 포함돼 코드가 같아도 매번 다른 해시가 만들어지던 문제를 해결한 것이다. 이 변수들을 런타임 주입으로 바꿔 코드가 동일하면 업로드 단계 자체를 건너뛴다.
핵심 포인트- 기존 문제: `VERCEL_DEPLOYMENT_ID` 같은 배포별 환경변수가 함수 페이로드에 포함돼 동일 코드도 배포마다 다른 해시를 갖게 됐다 — 캐시 미스가 항상 발생하는 구조.
- 해결책: 이 변수들을 함수 빌드 시점이 아닌 런타임에 주입해 코드 자체의 내용으로만 해시를 계산한다.
- 결과: 코드 변경이 없는 함수는 업로드 단계를 완전히 건너뜀 — 평균 400~600ms, 대규모 빌드에서 최대 5초 단축.
- 적용 대상: Vercel Functions(프레임워크 미사용), Python/Go/Ruby/Rust 프로젝트. Next.js는 곧 적용 예정.
- 별도 설정 불필요 — 자동 적용.
상세 정리- 근본 원인: CI/CD에서 배포별 고유 식별자를 환경변수로 넣는 건 일반적인 패턴이다. 그런데 Vercel은 이 변수를 함수 번들 빌드 시 포함시켜 페이로드 해시에 반영했다. 결과적으로 코드 변경 0이어도 새 배포마다 해시가 달라지고 항상 전체 업로드가 발생했다.
- 변경 포인트: `VERCEL_DEPLOYMENT_ID` 등 배포별 변수를 함수 페이로드에서 분리 → 런타임 주입 방식으로 전환. 빌드 단계의 페이로드는 이제 실제 코드·의존성만 반영한다.
- 캐싱 효과: 동일 코드의 재배포(예: 설정만 바꾸거나 다른 서비스만 변경된 모노레포 배포)에서 함수 업로드 단계 자체가 스킵된다.
- 성능 수치: 일반 프로젝트 평균 400~600ms 단축, 함수가 많은 대규모 빌드에서 최대 5초 단축 측정.
- 적용 범위: Vercel Functions(프레임워크 없는 직접 함수), Python/Go/Ruby/Rust 런타임. Next.js 지원은 별도 릴리즈 예정.
- 엣지 케이스: 코드 자체가 변경됐으면 당연히 캐시 히트 없음 — 캐싱은 코드 동일성 기반으로만 작동.
왜 읽나Vercel에 Python/Go/Ruby/Rust 함수를 반복 배포하는 팀이 별도 설정 없이 얻을 수 있는 배포 속도 개선 사례.