Reactive state for the backend
- 백엔드 반응형 상태는 여러 사용자나 탭에서 데이터 불일치(stale data)를 방지하는 개념으로, 서버리스/분산 환경의 SSR에서 구현하기 어렵습니다. 🔄
- 프론트엔드는 웹소켓 등으로 실시간 업데이트가 용이하지만, 서버는 지속적인 클라이언트 연결 부재와 다중 캐시 관리의 어려움이 있습니다. 🌐
- Next.js Pages Router에서는 수동 캐싱(Redis, ISR)과 복잡한 수동 경로별 무효화(revalidation)가 필요했습니다. 📜
- App Router는 프레임워크가 캐싱을 이해하고
unstable_cache를 거쳐 useCache와 같은 기본 요소를 제공합니다. 🚀
useCache는 컴포넌트와 데이터 캐싱을 위한 통합 인터페이스를 제공하며, 프레임워크가 데이터 종속성을 추적하여 세밀한 반응성을 가능하게 합니다. ✨
revalidateTag를 사용하면 데이터가 사용되는 모든 페이지와 캐시 위치를 단 한 번의 호출로 무효화할 수 있어 수동 작업을 크게 줄입니다. ✅
useCache는 캐싱 로직을 백그라운드 구현 세부 사항으로 숨겨 개발자가 일반적인 코드 작성에 집중할 수 있게 합니다. 🛠️
- 데이터가 변경될 때
revalidateTag를 호출하고, 특정 태그를 사용하여 필요한 데이터만 재검증함으로써 콘텐츠를 자동으로 최신 상태로 유지합니다. 💡
- Convex 데이터베이스 예시에서는 래퍼 함수가 DB 변경을 구독하고, 웹훅을 통해 해시된 키로
revalidateTag를 호출하여 실시간 업데이트를 구현합니다. 📡
- CMS 통합 예시에서는 CMS 웹훅이 데이터 변경 시
revalidateTag를 트리거하여 관련 저자 정보 페이지를 모두 무효화합니다. 📝
- 데모를 통해
useCache와 revalidateTag가 서버 측 렌더링 시 발생하는 '오래된 콘텐츠 깜빡임' 현상을 제거하여 사용자 경험을 개선함을 보여줍니다. ⚡
useCache는 엔터프라이즈/고객별 캐시 태그, 데이터 수명(주/시간) 설정, 사용자 정의 캐시 핸들러 등 다양한 고급 시나리오를 지원합니다. ⚙️
updateTag는 서버 액션에서 다음 요청이 즉시 최신 데이터를 제공하도록 강제하는 반면, revalidateTag는 백그라운드에서 재검증하여 첫 요청은 오래된 데이터일 수 있지만 이후 요청은 최신 데이터를 제공합니다. 🔄➡️🆕
데브허브 | DEVHUB | Reactive state for the backend