โ ์ด์ ํฌ์คํ ๊ณผ ์ด์ด์ง๋๋ค!
2024.07.12 - [Frontend ๐/React] - [React] ํ์ด๋๋ ์ด์ (Hydration), Next etc.
[React] ๋ฆฌ์กํธ ๊ธฐ์ ๋ฉด์ ํธ๋๋ถ VII - ํ์ด๋๋ ์ด์ (Hydration), Next etc.
1. ํ์ด๋๋ ์ด์ 2. Next.JS1. ํ์ด๋๋ ์ด์ (Hydration) โญ๏ธํ์ด๋๋ ์ด์ ๋ฆฌ์กํธ์์ ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง ํน์ SSG(์คํํฑ ์ฌ์ดํธ ์ ๋ค๋ ์ด์ )์ ์คํํ HTML ๊ฒฐ๊ณผ๋ฌผ์ ๋ฐ์์จ ๋ค, ๋ธ๋ผ์ฐ์ ์์ ์ด๊ฒ์ ๋ค
jaejae-sosp.tistory.com
1. ์ฌ์ ๋ ๋๋ง ํจ์ ์ข ๋ฅ โญ๏ธ
- getInitialProps
- Next 9.3 ๋ฒ์ ์ด์ ์๋ getInitialProps๋ง์ผ๋ก ์ฌ์ ๋ ๋๋ง ๊ด๋ จ ๋ฌธ์ ๋ฅผ ์ ๋ถ ํด๊ฒฐํ์ง๋ง, 9.3 ๋ฒ์ ๋ถํฐ๋ getInitialProps๊ฐ 3๊ฐ์ง๋ก ๋ถ๋ฆฌ๋จ
- getStaticProps, getStaticPath, getServerSideProps
- getStaticProps
- ๋น๋์ ๊ณ ์ ๋๋ ๊ฐ์ผ๋ก ๋น๋ ์ดํ์๋ ์์ ์ด ๋ถ๊ฐ๋ฅํจ
- data๋ฅผ ๋น๋ ์์ ๋ฏธ๋ฆฌ ๋ก๊ฒจ์ ์ ์ (static)์ผ๋ก ์ ๊ณต
- ๋งค ์ ์ ์ ์์ฒญ๋ง๋ค fetchํ ํ์๊ฐ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ํ์ด์ง๋ฅผ ๋ ๋๋งํ ๋ ์ ๋ฆฌํจ
- ์ ์ ์ ๊ตฌ์ ๋ฐ์ง ์๊ณ ํผ๋ธ๋ฆญํ๊ฒ ์บ์ํ ์ ์๋ ๋ฐ์ดํฐ์
- SEO ๋ฑ์ ์ด์๋ก ์ธํด ๋น ๋ฅด๊ฒ ๋ฏธ๋ฆฌ ๋ ๋๋งํด์ผ๋ง ํ๋ ํ์ด์ง์ ์ฌ์ฉ
- getStaticPath
- ๋์ ๋ผ์ฐํ + getStaticProps๋ฅผ ์ํ ๋ ์ฌ์ฉ
- ์ ์ํ์ง ์์ ํ์ ๊ฒฝ๋ก๋ ์ ๊ทผํด๋ ํ๋ฉด์ด ๋จ์ง ์์(error ํ์ด์ง๋ก ๋ผ์ฐํ )
- ๋์ ๋ผ์ฐํ ์, ๋ผ์ฐํ ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ๋ํ๋ ๋ฃ์ด์ผ ํจ
- getServerSideProps
- ๋น๋์ ์๊ด์์ด, ๋งค ํ์ด์ง ์์ฒญ๋ง๋ค ๋ฐ์ดํฐ๋ฅผ ์๋ฒ๋ก๋ถํฐ ๊ฐ์ ธ์ด
2. Suspense โญ๏ธ
- Suspense๋?
- Suspense๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ธฐ๋ฅผ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋
- Suspense๋ '์ปดํฌ๋ํธ๊ฐ ์ฝ์ด๋ค์ด๊ณ ์๋ ๋ฐ์ดํฐ๊ฐ ์์ง ์ค๋น๋์ง ์์๋ค'๊ณ React์ ์๋ ค์ค ์ ์๋, ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉํ ์ ์๋ ๋งค์ปค๋์ฆ์
- ์ดํ์ React๋ ๋ฐ์ดํฐ๊ฐ ์ค๋น๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ ธ๋ค๊ฐ UI๋ฅผ ๊ฐฑ์ ํ ์ ์์
- ์ฅ๊ธฐ์ ์ธ ๊ด์ ์ผ๋ก๋, Suspense๊ฐ ๋ฐ์ดํฐ ์ถ์ฒ์ ์๊ด์์ด ์ปดํฌ๋ํธ๋ก๋ถํฐ ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๋ฐ์ ์ฌ์ฉ๋๋ ์ฃผ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋๊ธธ ๋ฐ๋
- Suspense๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ธฐ๋ฅผ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋
const resource = fetchProfileData();
function ProfilePage() {
return (
<Suspense fallback={<h1>Loading profile...</h1>}>
<ProfileDetails />
<Suspense fallback={<h1>Loading posts...</h1>}>
<ProfileTimeline />
</Suspense>
</Suspense>
);
}
function ProfileDetails() {
// ์์ง ๋ก๋ฉ์ด ์๋ฃ๋์ง ์์๋๋ผ๋, ์ฌ์ฉ์ ์ ๋ณด ์ฝ๊ธฐ๋ฅผ ์๋ํฉ๋๋ค
const user = resource.user.read();
return <h1>{user.name}</h1>;
}
function ProfileTimeline() {
// ์์ง ๋ก๋ฉ์ด ์๋ฃ๋์ง ์์๋๋ผ๋, ๊ฒ์๊ธ ์ฝ๊ธฐ๋ฅผ ์๋ํฉ๋๋ค
const posts = resource.posts.read();
return (
<ul>
{posts.map((post) => (
<li key={post.id}>{post.text}</li>
))}
</ul>
);
}
- Suspense๋ก ๊ฐ๋ฅํ ๊ฒ์?
- ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค(axios, SWR, react-query)์ด React์ ๊น๊ฒ ๊ฒฐํฉํ ์ ์๋๋ก ํด์ค
- ์๋์ ์ผ๋ก ์ค๊ณ๋ ๋ก๋ฉ ์ํ๋ฅผ ์กฐ์ ํ ์ ์๋๋ก ํด์ค. suspense๋ ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ๋ถ๋ฌ์ ธ์ผ ํ๋์ง๋ฅผ ์ ํ์ง ์๊ณ , ์ฑ์ ์๊ฐ์ ์ธ ๋ก๋ฉ ๋จ๊ณ๋ฅผ ๋ฐ์ ํ๊ฒ ํต์ ํ ์ ์๋๋ก ํด์ค.
- ๊ฒฝ์ ์ํ(Race Condition)๋ฅผ ํผํ ์ ์๋๋ก ๋์. await๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ๋น๋๊ธฐ ์ฝ๋๋ ์ข ์ข ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์, suspense๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐ์ ์ผ๋ก ์ฝ์ด์ค๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๊ฒ ํด์ค.
'Frontend ๐ > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Node] Dialogflow API๋ฅผ ํ์ฉํ ์ฑ๋ด ์ฌ์ดํธ - 3. TextQuery Function, EventQuery Function (0) | 2024.08.16 |
---|---|
[React] controlled pattern, uncontrolled pattern etc. (0) | 2024.07.25 |
[React] ํ์ด๋๋ ์ด์ (Hydration), Next etc. (1) | 2024.07.12 |
[React] SPA, SSR, SEO etc. (2) | 2024.07.05 |
[React] useLayoutEffect, ์ด๋ฒคํธ ํธ๋ค๋ง etc. (1) | 2024.07.05 |