글을 쓴다는 건 참 힘든 것인거 같다 그래도 이렇게 쓰는 나 강하다는 증거.
언제나 좋은 정보 유용한 글을 쓰고 싶지만 참 힘든거 같습니다.
본론으로 들어가서!
페이지 요청 시 서버에서 HTML을 생성하여 클라이언트에 전달을 해줍니다.
클라이언트 요청 시마다 서버에서 데이터를 가져와 페이지를 렌더링 시킵니다. 데이터가 최신 상태로 유지되지만 서버의 부하가 증가할 수 있으며, 서버 응답 시간이 길어질 수 있습니다.
export default async function Page() {
const response = await fetch("https://api.adviceslip.com/advice", {
cache: "no-store",
});
const data = await response.json();
return (
<div>
<h2>SSR 페이지</h2>
<p>{JSON.stringify(data.slip.advice)}</p>
</div>
);
}
cache 옵션을 'no-store' 를 사용하여 매 요청 시 서버에서 데이터를 다시 가져옵니다.

새로고침 할 떄 마다 새로운 advice 를 가지고 오는 모습을 볼 수 있습니다.
빌드 시 데이터를 가져와 정적인 HTML 파일을 생성하여 클라이언트에게 제공합니다.
데이터가 자주 변하지 않거나, 페이지가 생성된 후 변동이 적은 경우가 적합하다고 생각합니다. 예를 들어 최근에 학습 강의중 영화 썸네일 페이지가 잇었습니다. 해당 페이지 처럼 크게 변동사항이 없는 경우가 어울리겠습니다.
정적 페이지로 제공되면 사용자는 빠른 응답 속도를 경험할수 있고 서버의 부하가 적고 CDN을 통해 빠르게 서빙할 수 있습니다.
export default async function Page() {
const response = await fetch("https://api.adviceslip.com/advice", {
cache: "force-cache",
});
const data = await response.json();
return (
<div>
<h2>SSR 페이지</h2>
<p>{JSON.stringify(data.slip.advice)}</p>
</div>
);
}
코드는 크게 달리지지 않습니다 다만,
force-cache를 사용하여 페이지를 정적으로 생성하고, 이후 요청에 대해서는 캐시된 데이터를 사용합니다.
새로고침을 계속 했음에도,
캐쉬된 데이터만 계속 나오는 것을 볼 수 있습니다.
SSG와 유사하지만, 페이지를 주기적으로 재생성 하여 최신 데이터를 반영할 수 있습니다.
revalidate 옵션을 통해 주기적으로 페이지를 재생성 할 수 있습니다.
빠른 응답 속도와 서버 부하를 유지하면서, 데이터의 최신성을 확보할 수 있고 사용자 요구에 따라 페이지를 자동으로 갱신할 수 있습니다.
export default async function Page() {
const response = await fetch("https://api.adviceslip.com/advice", {
cache: "force-cache",
next: { revalidate: 5 },
});
const data = await response.json();
return (
<div>
<h2>ISR 페이지</h2>
<p>{JSON.stringify(data.slip.advice)}</p>
</div>
);
}
revalidate 를 사용함으로, 5초 이전까지는 캐쉬된 데이터를 사용하고, 이후 에는 설정된 주기에 따라 서버에서 새로운 데이터를 요청하고, HTML 파일을 갱신합니다.
처음 빌드 된 이후
--- 5초후 ---
값이 변화된 것을 볼 수 있습니다.
ISR을 활용하면 실시간으로 자주 업데이트가 필요하지 않지만, 데이터의 최신 상태를 보장해야 하는 페이지에 적합합니다.
오늘은 정말 간단하게 react-query가 아닌 기본 내장 fetch 함수로 next14 app router 로 구현 하면서 기록해봤다. 그럼 다음 포스팅에서 봐요~!