diff --git a/client/public/img/suspense/1.png b/client/public/img/suspense/1.png new file mode 100644 index 0000000..4646a58 Binary files /dev/null and b/client/public/img/suspense/1.png differ diff --git a/client/public/img/suspense/2.png b/client/public/img/suspense/2.png new file mode 100644 index 0000000..97d5b1a Binary files /dev/null and b/client/public/img/suspense/2.png differ diff --git a/client/public/img/suspense/3.png b/client/public/img/suspense/3.png new file mode 100644 index 0000000..0801dfb Binary files /dev/null and b/client/public/img/suspense/3.png differ diff --git a/client/public/img/suspense/4.png b/client/public/img/suspense/4.png new file mode 100644 index 0000000..64acf7a Binary files /dev/null and b/client/public/img/suspense/4.png differ diff --git a/client/public/img/suspense/5.png b/client/public/img/suspense/5.png new file mode 100644 index 0000000..ed59e41 Binary files /dev/null and b/client/public/img/suspense/5.png differ diff --git a/client/public/img/suspense/cover.jpeg b/client/public/img/suspense/cover.jpeg new file mode 100644 index 0000000..61b7102 Binary files /dev/null and b/client/public/img/suspense/cover.jpeg differ diff --git a/server/_post/suspense .md b/server/_post/suspense .md new file mode 100644 index 0000000..08700bd --- /dev/null +++ b/server/_post/suspense .md @@ -0,0 +1,151 @@ +--- +date: "2024-04-03" +title: "next13 버전 suspense 정리" +imgpath: "/img/suspense/cover.jpeg" +--- + +# next13 버전 suspense 정리 + +## 1. Intro + +joflix는 넷플릭스를 next13 버전으로 클론코딩한 프로젝트입니다. +suspense를 적용시켜보고 싶어 공부한 내용과 제 프로젝트로 어떻게 작동하는지 설명하겠습니다. + +## 2. SSR + +SSR(서버사이드 렌더링) next 렌더링 흐름은 다음과 같습니다. + +1. 서버 컴포넌트의 data fetching +2. fetching한 데이터를 사용하여 html을 그려 보여주고 +3. js파일을 다운후 +4. html에 js로직을 연결합니다. + +4번의 과정을 hydration(수분 보충)이라고 합니다. + +hydration안된 html 즉,2번 상태의 html은 버튼 클릭과 같은 인터랙티브한 반응이 불가능합니다. + +멋지게 표현한다면 TTV(Time to View)와 TTI(Time to Interactive)간에 시간 간격이 존재한다.라고 표현할 수 있습니다. + +### TTV + +- Time To View +- 사용자가 웹 사이트를 볼 수 있는 시간 + +### TTI + +- Time To Interact +- 사용자가 웹 사이트와 상호작용(클릭 등)을 할 수 있는 시간 + +### 참고자료 + +- [React 18의 새로운 Suspense SSR 아키텍처](https://github.com/reactwg/react-18/discussions/37) + +## 3. SSR의 문제점 + +**HTML을 보여주기 전에 모든 것을 가져와야 합니다.** + +현재 API를 사용하면 HTML로 렌더링할 때 이미 서버의 구성 요소에 대한 모든 데이터가 준비되어 있어야 합니다. 이는 HTML 을 클라이언트에 보내기 전에 서버에서 모든 데이터를 수집해야 함 을 의미합니다. 이는 상당히 비효율적입니다. + +예시로 저의 프로젝트로 설명 하겠습니다. + +제 프로젝트의 레이아웃 입니다. +![seo](../img/suspense/3.png) + +프로젝트 홈페이지 +![seo](../img/suspense/4.png) + +- [프로젝트 링크](https://joflix-coral.vercel.app/) + +홈페이지 page.tsx + +```js +// app/page.tsx +export default function Home() { + return ( +
+ +
+ +
+
+ ); +} +``` + +제 프로젝트는 +Screen 서버 컴포넌트에서도 data fetching을 하고 +Slider 서버 컴포넌트에서도 data fetching을 하고 있습니다. + +html을 클라이언트에게 보여주기전에 Screen과 Slider의 data fetching을 완료해야 합니다. + +Slider 컴포넌트의 data fetching을 setTimeout으로 5초 지연 시키고 렌더링을 살펴보겠습니다. + +```js +// Slider에서 사용하는 axios에 5초 지연 +import { Movie } from "../../types/moive"; +import { axiosInstance } from "../apiInstance"; + +export const getMovies = async (category?: string): Promise => { + return new Promise((resolve, reject) => { + setTimeout(async () => { + try { + const response = await axiosInstance.get( + `/movie/${category ? category : "now_playing"}?language=ko&page=1` + ); + resolve(response.data.results); + } catch (error) { + reject(error); + } + }, 5000); + }); +}; +``` + +슬라이더 data fetching 5초 지연 +![seo](../img/suspense/5.png) + +렌더링 결과 +![seo](../img/suspense/1.png) + +Screen의 data fetching은 끝났지만 Slider의 data fetching이 끝나지 않아서 +Screen에 대한 html을 클라이언트에게 못 보내주는 모습을 확인 할 수 있습니다. + +## 4. suspense + +이러한 문제를 해결하는 방법으로 suspense가 있습니다 + +suspense로 감싼 뒤 실행시켜 보겠습니다. + +```js +// app/page.tsx +export default function Home() { + return ( +
+ + + + +
+
+
+ ); +} +``` + +슬라이더 data fetching 5초 지연 +![seo](../img/suspense/5.png) + +![seo](../img/suspense/2.png) + +먼저 data fetching이 완료된 Screen의 html을 렌더링 해준 모습을 볼 수 있습니다. +5초뒤에 data fetching이 완료되는 Slider의 data fetching을 기다리지 않는 모습을 볼 수 있습니다. + +더 나아가 html의 렌더링이 끝난 Screen은 html과 js로직을 연결(hydration)합니다. + +저의 프로젝트로 설명을 해봤는데 저의 프로젝트에 대한 정보가 없어 이해하기 힘들거 같습니다. +[React 18의 새로운 Suspense SSR 아키텍처](https://github.com/reactwg/react-18/discussions/37)을 참고해 주세요. + +### 참고자료 + +- [React 18의 새로운 Suspense SSR 아키텍처](https://github.com/reactwg/react-18/discussions/37) +- [기초부터 배우는 Next YTMusic 클론 코딩 (with next.js 14, UI 마스터)](https://www.inflearn.com/course/%EA%B8%B0%EC%B4%88-next-ytmusic-%ED%81%B4%EB%A1%A0%EC%BD%94%EB%94%A9)