



SSG 방식의 경우, 속도는 빠르지만 최신 데이터를 반영할 수 없는 문제가 존재했다.
ISR 방식은 이 문제를 해결하기 위해. SSG 방식이지만, 일정 시간 이후에는 사전 렌더링을 다시 실행해서 최신 데이터를 반영하는 등의 작업을 수행할 수 있다.


export const getStaticProps = async () => {
const [allBooks, recoBooks] = await Promise.all([
fetchBooks(),
fetchRandomBooks(),
]);
return {
props: {
allBooks,
recoBooks,
},
revalidate: 3,
};
};


ISR의 추가적인 기능. ISR은 Next.js를 사용할 때, 가장 추천되는 전략이지만. ISR 방식을 적용하기 어려운 페이지들도 분명 존재한다.
예를 들어, 게시판. 여기는 일정 시간을 기준으로 데이터가 업데이트되지 않는다. 사용자들이 언제든 게시글을 생성하고 수정, 삭제할 수 있기 때문. 그렇기에 ISR 방식을 사용할 수가 없다.
그렇다고 SSR을 사용하기도 어렵다. 서버에서 부담하는 요소들이 너무 많아, 게시판같이 사용자들이 몰리는 서비스에서는 자칫 서버가 마비될 수도 있기 때문.


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");
}
}
getStaticProps 함수에서 revalidate 옵션을 쓰는 것이 아니라, revalidate API 함수를 새로 만들어준다.
revalidate (재생성)하려는 페이지의 경로를 revalidate 함수의 인수로 넣어준다.
해당 페이지의 재생성이 성공했다면, 그 결과를 json 형식으로 반환해준다. 실패한다면 500 코드와 실패 메시지를 반환해준다.
학습 프로젝트 기준으로, api/revalidate 경로로 요청을 보내면, '/' 경로에 해당하는 페이지가 On-Demand-ISR 방식으로 재생성되는 것.
Next.js를 사용하는 서비스라고 한다면 기본적으로 On-Demand-ISR을 사용한다.
