unstable_cache란?
unstable_cache는 특정 함수 호출의 결과를 캐싱해서, 같은 인수로 함수가 다시 호출될 때 데이터베이스를 다시 조회하거나 API를 호출하는 대신 캐시된 값을 즉시 반환하게 만듭니다. 이로써 불필요한 데이터 요청을 줄여 응답 시간을 단축하고 서버 부하를 줄일 수 있습니다.
이 함수는 Next.js의 내장 캐싱 시스템과 통합되어 동작하기 때문에, 일반적인 메모이제이션(memoization) 함수보다 더 강력합니다. 특히 Vercel 환경에서 배포될 때 Next.js 캐시 레이어와 긴밀하게 작동하도록 설계되었습니다.
사용법
unstable_cache는 revalidate와 tags라는 두 가지 주요 옵션을 사용합니다.
import { unstable_cache } from 'next/cache';
const getMyData = unstable_cache(
async (userId) => {
// 이 함수의 결과가 캐시됩니다.
// userId가 같은 요청이 오면 이 코드는 다시 실행되지 않습니다.
const data = await fetch(`https://api.example.com/data/${userId}`);
return data.json();
},
['my-data-key'], // 캐시 식별자
{
revalidate: 60, // 60초마다 캐시 갱신
tags: ['posts'], // 'posts' 태그가 무효화될 때 함께 무효화
}
);
주요 옵션
- revalidate: 캐시의 유효 기간을 초 단위로 설정합니다. 이 시간이 지나면 다음 요청 시 함수가 다시 실행되어 캐시를 갱신합니다.
- tags: 캐시에 태그를 부여합니다. revalidateTag(‘posts’) 함수를 사용하여 특정 태그를 가진 모든 캐시를 수동으로 무효화할 수 있습니다. 이는 데이터가 변경되었을 때 즉시 캐시를 최신 상태로 만드는 데 유용합니다.
추가적으로
revalidatePath의 역할
revalidatePath는 사용자가 특정 페이지에 접근했을 때 생성된 HTML 캐시를 무효화합니다. 이렇게 캐시가 무효화되면, 다음 요청 시 해당 페이지는 캐시된 데이터를 사용하는 대신 서버에서 다시 렌더링되어 최신 정보를 가져오게 됩니다.
이 기능은 CMS(콘텐츠 관리 시스템)나 백엔드에서 데이터가 업데이트되었을 때, 프런트엔드 페이지를 자동으로 갱신해야 할 때 특히 유용합니다.
사용법
revalidatePath는 revalidateTag와 유사하게 동작하지만, 태그 대신 **경로(path)**를 기반으로 캐시를 무효화합니다.
// app/actions.ts (Server Action 예시)
"use server";
import { revalidatePath } from 'next/cache';
export async function createPost() {
// 1. 데이터베이스에 새 게시물 추가
await db.post.create({ /* ... */ });
// 2. 게시물 목록 페이지의 캐시를 초기화
revalidatePath('/posts');
}
위 코드에서 createPost라는 서버 액션이 실행되면, revalidatePath('/posts')가 호출되어 /posts 경로의 캐시가 무효화됩니다. 다음 사용자가 /posts 페이지에 접근하면, Next.js는 최신 게시물 목록을 포함하여 페이지를 다시 렌더링하게 됩니다.
fetch함수에서도 비슷한 기능을 사용할 수 있다
fetch 함수의 캐싱 기능
Next.js 환경에서 fetch 함수는 기본적으로 자동으로 캐시를 적용합니다. 이 동작은 cache 옵션을 통해 제어할 수 있습니다.
- cache: 'force-cache' (기본값): fetch는 요청을 캐시하고, 동일한 URL에 대한 다음 요청 시 캐시된 결과를 사용합니다. 서버 컴포넌트에서 fetch를 사용하면 이 옵션이 기본적으로 활성화됩니다.
- cache: 'no-store': 요청을 캐시하지 않고, 항상 새로운 데이터를 가져옵니다. 동적인 데이터나 자주 변경되는 데이터를 가져올 때 유용합니다.
- cache: 'no-cache': 요청을 캐시하지만, 다음 요청 시 서버에 데이터를 재검증(revalidate)하여 최신 버전인지 확인합니다.
revalidate 옵션을 통한 재검증
fetch 함수는 revalidate 옵션을 사용하여 시간 기반 캐시 재검증을 설정할 수 있습니다.
// 60초마다 캐시 갱신
const response = await fetch('https://api.example.com/data', {
next: { revalidate: 60 } // 60초가 지나면 다음 요청 시 캐시 갱신
});
위 코드는 revalidate 태그를 사용한 것과 유사하게, 60초마다 데이터가 자동으로 갱신됩니다.
태그를 이용한 재검증 (tags)
fetch 함수는 revalidateTag와 직접적으로 연동되는 tags 옵션도 제공합니다.
// 'posts' 태그를 사용하여 fetch 요청
const response = await fetch('https://api.example.com/posts', {
next: { tags: ['posts'] }
});
// 데이터가 업데이트되면 태그를 통해 캐시를 초기화
// (서버 액션, 라우트 핸들러 등에서 사용)
import { revalidateTag } from 'next/cache';
revalidateTag('posts');
'개발 공부 > Next' 카테고리의 다른 글
| [Next] generateStaticParams (0) | 2025.09.13 |
|---|---|
| [Next] Route Segment Config (0) | 2025.09.11 |
| [Next] Parallel Routes (0) | 2025.09.07 |
| [Next] Intercepting Route (0) | 2025.09.07 |
| [Next] IntersectionObserver (0) | 2025.09.06 |