본문 바로가기

개발 공부/React

Next.js revalidatePath, redirect

Next.js는 정적 생성(Static Generation)과 서버 사이드 렌더링(Server-Side Rendering)을 손쉽게 사용할 수 있도록 지원합니다.

이러한 기능 덕분에 캐시된 데이터를 효과적으로 관리하고, 사용자에게 최신 정보를 제공할 수 있습니다.

 

Next.js에서는 정적 페이지를 미리 생성해두어 빠른 응답 속도를 제공할 수 있습니다.

그러나 데이터가 변경되었을 때 이 캐시를 수동 또는 자동으로 무효화하여 최신 데이터를 반영해야 합니다.

  • revalidatePath: 특정 경로에 해당하는 정적 페이지의 캐시를 무효화(재검증)하여, 변경된 데이터를 반영할 수 있도록 합니다.
  • redirect: 서버나 클라이언트에서 특정 경로로 사용자를 이동시키는 함수로, 작업 후 결과 페이지로 자연스럽게 연결할 때 사용합니다.

 

revalidatePath 

정적 페이지 생성(Static Generation)을 사용하는 경우, 빌드 시점의 데이터가 캐싱됩니다.

그러나 데이터가 변경될 경우 캐시된 페이지는 오래된 정보를 보여줄 수 있습니다.
revalidatePath 함수는 특정 경로에 대한 캐시를 무효화하고, 최신 데이터를 반영하도록 강제로 페이지를 다시 생성하도록 요청합니다.
이는 보통 관리자 페이지에서 데이터 수정 후 최신 정보로 페이지를 갱신할 때 사용됩니다.

예제

인보이스(invoice) 데이터가 업데이트된 후, /dashboard/invoices 경로의 캐시를 무효화하는 과정을 보여줍니다.

import { revalidatePath } from 'next/cache';

/**
 * 인보이스 업데이트 후 캐시 무효화 함수
 * @param invoiceId - 업데이트할 인보이스의 ID
 */
export async function updateInvoice(invoiceId: string): Promise<void> {
  try {
    // 1. 데이터베이스에서 인보이스 업데이트 작업 수행
    // 예시: await updateInvoiceInDatabase(invoiceId);
    
    // 2. 업데이트 후, '/dashboard/invoices' 페이지의 캐시를 무효화
    revalidatePath('/dashboard/invoices');
    
    console.log('인보이스 업데이트 및 캐시 무효화 완료');
  } catch (error) {
    console.error('인보이스 업데이트 중 오류 발생:', error);
    // 추가적인 에러 핸들링 로직 구현 가능
    throw error;
  }
}

 

  • 에러 처리: 업데이트 작업 중 에러 발생 시, 적절한 로깅과 추가 핸들링이 필요합니다.
  • 캐시 무효화 시점: 데이터를 변경한 직후 호출하여 최신 페이지가 생성되도록 해야 합니다.

redirect 

서버 액션이나 API 요청 후, 특정 페이지로 사용자를 이동시키고자 할 때 redirect 함수를 사용합니다.
이 함수는 클라이언트와 서버 모두에서 사용할 수 있으며, 사용자에게 결과 페이지를 보여줄 때 유용합니다.

예제

폼 제출 후 서버에서 데이터 처리가 완료되면 사용자를 대시보드 페이지로 이동시키고 싶을 때 아래와 같이 사용할 수 있습니다.

import { redirect } from 'next/navigation';

/**
 * 폼 데이터 처리 후 대시보드 페이지로 리디렉션하는 함수
 * @param formData - 제출된 폼 데이터
 */
export async function handleFormSubmit(formData: FormData): Promise<void> {
  try {
    // 1. 폼 데이터 처리 (예: 데이터베이스 저장, API 호출 등)
    // 예시: await processFormData(formData);
    
    // 2. 처리 완료 후 '/dashboard/invoices' 페이지로 리디렉션
    redirect('/dashboard/invoices');
  } catch (error) {
    console.error('폼 제출 처리 중 오류 발생:', error);
    // 에러 페이지로 리디렉션하거나, 사용자에게 피드백 제공 가능
    throw error;
  }
}

 

 

  • 서버와 클라이언트에서 사용: Next.js 13 버전 이상에서는 서버 액션에서도 redirect를 사용할 수 있어, 페이지 전환을 쉽게 처리할 수 있습니다.
  • 사용자 경험: 데이터 처리 후 자동으로 페이지를 이동시켜, 사용자에게 작업 완료 상태를 명확하게 전달할 수 있습니다.

 

두 기능의 조합: 데이터 업데이트 후 최신 상태 반영과 페이지 이동

실제 애플리케이션에서는 데이터 업데이트와 동시에 최신 데이터를 반영한 페이지로 이동하는 시나리오가 자주 발생합니다.

아래 예제는 인보이스 업데이트 후, 캐시를 무효화하고 사용자에게 최신 정보를 보여주기 위해 리디렉션하는 전 과정을 구현한 예제입니다.

import { revalidatePath } from 'next/cache';
import { redirect } from 'next/navigation';

/**
 * 인보이스 업데이트 후 캐시 무효화 및 리디렉션 처리 함수
 * @param invoiceId - 업데이트할 인보이스의 ID
 */
export async function updateInvoiceAndRedirect(invoiceId: string): Promise<void> {
  try {
    // 1. 데이터베이스에 인보이스 업데이트
    // 예시: await updateInvoiceInDatabase(invoiceId);
    
    // 2. 업데이트가 완료된 후, '/dashboard/invoices' 페이지 캐시 무효화
    revalidatePath('/dashboard/invoices');
    
    // 3. 최신 데이터가 반영된 페이지로 리디렉션
    redirect('/dashboard/invoices');
  } catch (error) {
    console.error('업데이트 및 리디렉션 처리 중 오류 발생:', error);
    // 오류 상황에 대한 추가 처리 로직 구현
    throw error;
  }
}

 

  • 데이터 업데이트: 인보이스의 변경 사항을 데이터베이스에 반영합니다.
  • 캐시 무효화: 변경된 데이터를 반영하기 위해 /dashboard/invoices 페이지의 캐시를 무효화합니다.
  • 리디렉션: 사용자를 해당 페이지로 이동시켜 최신 데이터를 확인할 수 있도록 합니다.

 

 

 

'개발 공부 > React' 카테고리의 다른 글

React useActionState  (0) 2025.03.06
React Dynamic Route Segments  (0) 2025.03.03
React Streaming, Suspense  (0) 2025.02.25
Static과 Dynamic Rendering  (0) 2025.02.23
React.ReactNode, ReactElement, ComponentProps, Ref  (0) 2025.01.31