Frontend/Next.js
[Next.js/Page Router] 3. ISR (Incremental Static Regeneration)
ayeongjin
2025. 2. 4. 00:20
ISR (Incremental Static Regeneration)
1. SSG의 문제점
- SSG 방식으로 페이지를 빌드 타임에 정적으로 생성하면, 이후에도 같은 페이지가 계속 반환됨
- 속도는 빠르지만 최신 데이터를 즉시 반영하기 어려움
2. ISR이란?
- *증분 정적 재생성(Incremental Static Regeneration)**의 약자로, 일정 시간마다 정적 페이지를 다시 생성하는 기술
- SSG 방식으로 생성된 페이지에 유통기한을 설정하여 일정 시간이 지나면 새롭게 생성 가능
- 최신 데이터가 필요할 때만 페이지를 재생성하여 성능과 신선한 데이터를 모두 보장
✅ ISR의 장점
- 빠른 응답 속도 (기존 SSG의 장점 유지)
- 최신 데이터 반영 가능 (SSR의 장점 추가)
- 서버 부하 감소: 필요할 때만 페이지를 재생성
3. ISR 동작 방식
- 유통기한 내 요청: 기존 정적 HTML을 반환
- 유통기한 이후 요청: 새로운 HTML을 생성 후 반환, 이후 요청부터는 갱신된 HTML 제공
4. ISR 적용 방법
export const getStaticProps = async () => {
console.log("인덱스 페이지 호출");
const [allBooks, recoBooks] = await Promise.all([
fetchBooks(),
fetchRandomBooks(),
]);
return {
props: {
allBooks,
recoBooks,
},
revalidate: 3, // ISR: 3초마다 페이지를 재생성
};
};
📌 ISR 적용 후 빌드 결과
- 페이지가 3초마다 새롭게 갱신됨
5. 주문형 재검증 (On-Demand ISR)
- 일정 시간마다 재생성하는 ISR 방식은 사용자의 직접적인 업데이트 요청을 즉시 반영하기 어려움
- 예를 들어,
- 게시글 수정: 페이지 데이터가 즉시 반영되지 않음
- 게시글 삭제: 기존 정적 페이지가 남아 있음
- 게시글이 특정 시점에 업데이트되는데 불필요한 재생성이 발생할 수 있음
- 이를 해결하기 위해 On-Demand ISR을 사용하여 특정 요청이 발생할 때만 페이지를 재검증 (revalidate)
6. On-Demand ISR 적용 예시
📌 API 엔드포인트에서 페이지 재검증 실행
// pages/api/revalidate.ts
import { NextApiRequest, NextApiResponse } from "next";
export default async function handler(
req: NextApiRequest,
res: NextApiResponse
) {
try {
await res.revalidate("/"); // 특정 경로의 페이지를 다시 생성
return res.json({ revalidate: true });
} catch (err) {
res.status(500).send("Revalidation Failed");
}
}
📌 On-Demand ISR 요청 실행 결과
7. 배운점
- ISR은 SSG의 빠른 응답 속도를 유지하면서 최신 데이터를 반영할 수 있는 방식
- 정적 페이지의 유효기간을 설정하여 자동으로 갱신 가능 (revalidate 옵션)
- On-Demand ISR을 활용하면 특정 이벤트 발생 시 즉시 페이지를 갱신 가능
- SSR, SSG, ISR을 조합하여 최적의 렌더링 전략을 선택하는 것이 중요