피드로 돌아가기
Dev.toInfrastructure
원문 읽기
Tag-based Revalidation 도입을 통한 Webhook 호출 90% 및 처리 시간 92% 절감
How I reduced Sanity webhook fanout by batching revalidation tags in a single route handler
AI 요약
Context
Sanity CMS의 문서별 Webhook 설정으로 인해 대량 발행 시 다수의 POST 요청과 ISR Purge가 동시다발적으로 발생하는 구조. Vercel 환경에서 빈번한 Cold Start와 캐시 무효화 경합으로 인해 배포 시간이 2분 이상 소요되는 병목 현상 발생.
Technical Solution
- 개별 Path 기반의 무효화 대신 Next.js의
revalidateTag를 활용한 Tag-based Revalidation 구조로 전환 - Sanity Webhook 설정을 단일 Route Handler로 통합하여
_type및_id페이로드만 수신하도록 설계 - Server Component의 fetch 옵션에 데이터 타입별 Tag를 선언하여 특정 타입의 모든 데이터를 그룹 단위로 무효화
- 상세 페이지의 경우
sanity:post와sanity:${post._id}두 가지 Tag를 중첩 적용하여 인덱스와 개별 페이지의 정밀한 캐시 제어 구현 - CDN(Cloudflare 등) 사용 시 Vercel 내부 요청 여부를 확인하여 외부 CDN Purge API를 호출하는 2차 무효화 로직 통합
실천 포인트
- 1,000페이지 미만 사이트에서 다수 문서의 동시 업데이트가 잦은 경우 Tag-based Revalidation 검토 - fetch 옵션에 `next: { tags: [...] }`를 명시하여 데이터 의존성 정의 - Vercel 외 외부 CDN 사용 시 `x-vercel-id` 헤더 확인을 통한 CDN Purge 연동 구현 - 문서 수가 10,000개 이상이거나 타입이 너무 다양할 경우 PPR(Partial Prerendering) 또는 시간 기반 ISR 고려