`"use client"`를 사용하는 컴포넌트에서, 데이터를 서버에 POST 하고 나서, 데이터들이 리스트형태로 되돌아가는 과정에서 최신 데이터가 반영되게 하려면 어떻게 해야할까??
Next.js 공식문서는 다음과 같은 상황에 2가지 해결책을 제시한다.
Cached data can be revalidated in two ways
[Time-based revalidation] Automatically revalidate data after a certain amount of time has passed. This is useful for data that changes infrequently and freshness is not as critical.
[On-demand revalidation] Manually revalidate data based on an event (e.g. form submission). On-demand revalidation can use a tag-based or path-based approach to revalidate groups of data at once. This is useful when you want to ensure the latest data is shown as soon as possible (e.g. when content from your headless CMS is updated).
Time-based revalidation은 일정 시간마다 캐싱된 값들을 다시 만들도록 하는 것이다.
처음에 이렇게 만들었다가, 클라이언트분께서 Form을 작성한 이후에 다른 탭을 갔다 와야 저장이 된다고 해결해달라고 하셨다.
개발자가 아닌 분들에게 하나하나 설명드릴 필요도 없고, 그분들도 알 필요 없다고 생각한다.
그래서, 이를 근본적으로 해결하는 방법으로 On-demand revalidation을 사용하기로 했다.
✏️ First Solution
1. server component fetch function에 revalidate tag를 달아준다.
이때, 4번의 속도가 매우 빨라서, User는 마치 이미 만들어진 페이지를 가져오는 것처럼 보인다.
하지만, 실제로는 뼈대 Html만 받아오는 것이다
→ 이는, SEO (Search Engine Optimization)에 부정적인 영향을 미친다.
(아래 사진) Skeleton HTML만 렌더링된 모습
NextJS는 React와 다른 “Pre-Rendering”을 통해 페이지를 렌더링한다.
공식문서에는 다음과 같이 설명되어 있다.
By default, Next.js pre-renders every page. This means that Next.js generates HTML for each page in advance, instead of having it all done by client-side JavaScript. Pre-rendering can result in better performance and SEO.
Each generated HTML is associated with minimal JavaScript code necessary for that page. When a page is loaded by the browser, its JavaScript code runs and makes the page fully interactive (this process is called hydration in React).
Pre-Render하는 대략적인 과정은 다음과 같다.
User의 Page Request
Server는 뼈대 Html + Javascript 코드를 바탕으로 완성된 페이지를 제공한다. → 이때, 사용한 Javascript 코드를 같이 넘겨준다 (Hydration) 이는, 첫 렌더링을 제외하면 Client Side Rendering 또한 가능하게 하기 위함이다. (event handling)
⭐여기서부터 중요하다⭐
Next.Js는 Pre-Rendering을 하는 시점을 On Build Time vs On Each Request로 구분한다
Build Time에 Pre-Render하는 방법을 Static Site Generation
Each Request에 Pre-Render하는 방법을 Server Side Rendering이라 한다.
그럼 CSR, SSG, SSR이 각각 어떻게 실행되는지 알아보자
Static Side Generation (Recommended)
→ 페이지들은 빌드할 때 Pre-Render된다.
이후, Hydrate을 통해 Regular React App처럼 Interactive한 Aplication으로 사용가능하다.
공식문서
If a page uses Static Generation, the ✏️page HTML is generated at build time.That means in production, the page HTML is generated when you run ⭐`next build`. This HTML will then be reused on each request. It can be cached by a CDN. In Next.js, you can statically generate pages with or without data.
How to User SSG?: `getStaticProps` Function
// 형식 정확히 일치 필요!
export async function getStaticProps(context) { … }
→ Server에서만 실행되는 코드를 작성한다. (i.e. Client에서 사용하는 코드는 사용 불가능하다.)
→ Not Be included in code bundle that server gives to client
→ getStaticPaths에 명시된 모든 params를 Static Site Generate한다. (Build때 pre-render) → 명시되지 않은 Path에 접근하면 404 Error를 발생시킨다
→ 해당 동적 라우트가 내용이 얼마 없을때
→ Pre-Render해야 하는 Route가 많거나, 데이터가 많으면 오래 걸린다 (ex. 게시판 or 판매목록)
true
→ getStaticPaths에 명시된 params만 SSG한다 → 명시되지 않은 Params는 useEffect하는 것처럼 그때 getStaticPaths 코드를 실행한다. → 즉, params에 없는 코드라도 404에러를 발생시키지 않는다 → params에 없으면 “blocking” 처럼 행동한다
→ 데이터가 많은데, Pre-Render해야하는 중요한 것만 몇개 있고 나머지는 그러지 않아도 되는 경우
“blocking”
→ SSR처럼, 눌렀을때 Pre-Render되기를 기다렸다가 Load된다.
Error Handling을 하면서 사용하기
fallback : false
→ route에 포함되지 않는 경우 404Error 발생.
→ `404.js` 에서 Error Handling
fallback : true
→ route에 포함되지 않는 경우 404Error가 발생하지 않음. 단, getStaticProps에서 데이터를 찾는 과정에서 코드Error가 발생함