📌 Next.js의 ISR(Incremental Static Regeneration) 방식 자세한 설명
2025. 3. 5. 20:54ㆍ프론트엔드/Next JS
728x90
✅ ISR(Incremental Static Regeneration)이란?
ISR(증분 정적 생성)은 Next.js에서 제공하는 정적 페이지 재생성 기법으로, 기존 SSG의 단점을 보완합니다.
🔹 ISR의 특징
- SSG처럼 정적 페이지를 미리 생성하지만, 특정 시간이 지나면 다시 데이터를 가져와 업데이트 가능
- 사용자는 항상 빠르게 페이지를 받아볼 수 있지만, 일정 시간마다 새로운 데이터를 반영
- revalidate 옵션을 사용하여 페이지를 특정 주기(초 단위)마다 재생성 가능
- SSR과 달리, 모든 요청에서 서버 렌더링을 수행하지 않으므로 성능이 뛰어남
🔹 ISR 동작 과정
1️⃣ 초기 빌드 시점: getStaticProps가 실행되어 정적 HTML 페이지를 생성
2️⃣ 사용자가 요청 시: 미리 생성된 HTML을 반환 → 이때까지는 SSG 방식과 동일
3️⃣ revalidate 시간이 지나면:
- 다음 사용자 요청 시 백그라운드에서 페이지를 다시 생성
- 새로운 HTML이 완성되면 기존 HTML을 새로운 버전으로 교체
4️⃣ 사용자는 계속 빠른 페이지를 경험하면서도 최신 데이터가 반영됨
📝 ISR 흐름 예시
요청 시점 반환되는 데이터
| 처음 요청 | SSG로 생성된 정적 HTML 제공 |
| revalidate(예: 3초) 이내 요청 | 기존 HTML 그대로 제공 |
| revalidate 후 첫 요청 | 기존 HTML 제공하면서 백그라운드에서 새로운 HTML 생성 |
| 새로운 HTML 생성 완료 후 | 이후 요청부터 새로운 HTML 제공 |
🔹 ISR이 필요한 이유
SSG는 페이지 로딩 속도가 빠르지만, 한 번 빌드되면 데이터가 변경되지 않는다는 단점이 있습니다.
ISR을 활용하면 최신 데이터를 반영하면서도 SSR보다 빠른 성능을 제공할 수 있습니다.
✅ ISR이 유용한 경우
- 자주 업데이트되는 블로그, 뉴스 사이트 (예: 일정 시간마다 새로운 기사 반영)
- 상품 정보가 업데이트되는 쇼핑몰 (예: 가격이 변동되는 경우)
- 데이터가 일정 주기로 변하는 사이트 (예: 도서 목록, 추천 책 리스트)
✅ ISR을 활용한 getStaticProps 예제 분석
아래 코드에서 ISR을 활용한 getStaticProps 구현 방식을 살펴보겠습니다.
export const getStaticProps = async () => {
console.log("인덱스 페이지");
const [allBooks, recoBooks] = await Promise.all([
fetchBooks(),
fetchRandomBooks(),
]);
return {
props: {
allBooks, // 전체 도서 목록
recoBooks, // 추천 도서 목록
},
revalidate: 3, // 3초마다 페이지를 재검증 (ISR 적용)
};
};
🔹 코드 분석
- fetchBooks()와 fetchRandomBooks()를 이용해 전체 도서 목록과 추천 도서 목록을 가져옴
- getStaticProps가 실행될 때 데이터를 가져와 미리 HTML을 생성
- revalidate: 3을 설정하여 3초마다 새로운 데이터를 가져와 갱신
- 첫 요청 이후, 3초가 지나면 다음 요청 시 백그라운드에서 새 데이터를 가져와 페이지를 업데이트
✅ ISR이 적용된 페이지 컴포넌트 분석
export default function Home({
allBooks,
recoBooks,
}: InferGetStaticPropsType<typeof getStaticProps>) {
return (
<div className={style.container}>
<section>
<h3>지금 추천하는 도서</h3>
{recoBooks.map((book) => (
<BookItem key={book.id} {...book} />
))}
</section>
<section>
<h3>등록된 모든 도서</h3>
{allBooks.map((book) => (
<BookItem key={book.id} {...book} />
))}
</section>
</div>
);
}
🔹 컴포넌트 구조
- allBooks → 등록된 모든 도서 목록
- recoBooks → 추천 도서 목록
- BookItem 컴포넌트를 이용해 도서 정보를 렌더링
- ISR이 적용되었기 때문에, 사용자는 항상 최신 도서 정보를 빠르게 확인 가능
✅ ISR vs SSG vs SSR 비교
방식 SSG(정적 생성) SSR(서버 렌더링) ISR(증분 정적 생성)
| 초기 로딩 속도 | 빠름 (미리 생성됨) | 느림 (매 요청마다 서버에서 생성) | 빠름 (미리 생성됨) |
| SEO | 좋음 | 좋음 | 좋음 |
| 데이터 최신성 | 빌드 시점 데이터만 제공 | 항상 최신 데이터 제공 | 일정 주기로 최신 데이터 반영 |
| 서버 부하 | 없음 (정적 파일 제공) | 높음 (요청마다 렌더링) | 낮음 (업데이트 주기마다 재생성) |
| 사용 예시 | 블로그, 제품 상세 페이지 | 실시간 데이터 제공 페이지 (대시보드) | 뉴스, 상품 정보, 리뷰 페이지 |
✅ revalidate 옵션을 적절하게 설정하는 방법
revalidate 값을 설정할 때 고려해야 할 요소:
- 자주 변경되는 데이터 → 10초 이하 (revalidate: 3 ~ revalidate: 10)
- 덜 자주 변경되는 데이터 → 1분 ~ 10분 (revalidate: 60 ~ revalidate: 600)
- 거의 변경되지 않는 데이터 → 1시간 이상 (revalidate: 3600)
✅ Next.js에서 ISR을 활용해야 하는 경우
ISR을 사용할 때 SSG를 사용할 때
| 데이터가 자주 변경됨 | 데이터가 자주 변경되지 않음 |
| 빠른 로딩이 필요함 | 최초 빌드 시점의 데이터만 필요함 |
| 서버 부하를 줄이면서 최신 데이터 제공 | 페이지가 자주 변경되지 않아도 됨 |
✅ 결론
ISR(Incremental Static Regeneration)은 정적 사이트 생성(SSG)의 성능을 유지하면서도 최신 데이터를 반영할 수 있는 방법입니다.
- getStaticProps에서 revalidate를 설정하면 정적 페이지를 일정 주기마다 자동 갱신 가능
- SSG보다 데이터 최신성이 뛰어나고, SSR보다 서버 부하가 적음
- 쇼핑몰, 뉴스, 추천 도서 페이지 등 데이터가 자주 변하지만 빠른 로딩이 중요한 경우에 적합
🚀 Next.js를 활용하면 CSR, SSG, SSR, ISR을 적절히 조합하여 최적화된 웹사이트를 구축할 수 있습니다! 🔥
728x90
'프론트엔드 > Next JS' 카테고리의 다른 글
| Next.js에서 SEO 최적화하는 방법 (SSR, SSG, ISR, 동적 경로 포함) (2) | 2025.03.05 |
|---|---|
| 📌 On-Demand ISR (특정 페이지 즉시 다시 생성) 자세한 설명 (0) | 2025.03.05 |
| 📌 Next.js에서 getStaticProps와 getStaticPaths를 활용한 SSG 정리 (0) | 2025.03.05 |
| Next.js의 SSG(Static Site Generation) 개념과 활용 (0) | 2025.03.02 |
| Next.js에서 getServerSideProps를 활용한 도서 데이터 관리 (1) | 2025.03.02 |