RSC๋ React Server Components์ ์ฝ์๋ก, React18 ๋ฒ์ ๋ถํฐ ๋ฑ์ฅํ ๊ฐ๋ ์ด๋ค.
์๋ฒ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋ง ํ๊ณ ํด๋ผ์ด์ธํธ์์ ์ด๋ฅผ ํจ์จ์ ์ผ๋ก ํ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ์ผ๋ก, ์๋ฒ์ ํด๋ผ์ด์ธํธ์ ์ญํ ์ ๋ถ๋ฆฌํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ ํฅ์์ ์ํด ๋ฑ์ฅํ ๊ธฐ๋ฅ์ด๋ค.
RSC๋ React์ ์์ฒด์ ์ธ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์ ๊ผญ Next.js๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ ๊ตฌํํ ์ ์์ง๋ง, RSC๋ ์๋ฒ-ํด๋ผ์ด์ธํธ์ ์ํธ์์ฉ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ Node.js๊ธฐ๋ฐ์ ์๋ฒ ํ๊ฒฝ์ด ํ์ํ๋ค. ๊ทธ๋์ Next.js๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด Express.js ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ HTTP ์๋ฒ๋ฅผ ๋ง๋ค๊ณ , ์๋ฒ-ํด๋ผ์ด์ธํธ ์คํธ๋ฆฌ๋ฐ, Webpack ๋ฒ๋ค๋ง(์๋ฒ / ํด๋ผ์ด์ธํธ), ๋ฐ์ดํฐ ํต์ , ์ฑ๋ฅ ์ต์ ํ(์บ์ฑ) ๋ฑ์ ์ถ๊ฐ์ ์ธ ์ค์ ์ ์ง์ ํด์ผ ํด์ ๋ณต์ก๋๊ฐ ๋์์ง๋ค.
Next.js๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฒ์์ fetch()ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ณ , ๋ ๋๋ง๊น์ง ๋ชจ๋ ์๋ฒ ์ชฝ์์ ๊ตฌํ์ด ๋๋ค.
fetch()๋ ๋ธ๋ผ์ฐ์ ์ web API์ด์ง๋ง, LTS๋ฒ์ (18 ์ด์) Node.js์์๋ fetch() API๊ฐ ๋ด์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ๋ฉฐ, ์๋ฒ์ปดํฌ๋ํธ์์ node.js์ Fetch API๋ฅผ ์ฌ์ฉํ๊ณ , ํด๋ผ์ด์ธํธ์์ fetch๋ฅผ ์ฌ์ฉํ ๋๋ ๋ธ๋ผ์ฐ์ ์ fetch API๋ฅผ ์ฌ์ฉํ๋ค.
RSC๋ Next.js 13+ App Router์์๋ง ์ฌ์ฉํ ์ ์๋ค. Next.js์ Pages Router์์ ์ฌ์ฉํ ์ ์๋ ์ด์ ๋, Pages Router์ ์ค๊ณ๊ฐ RSC์ ํต์ฌ ์๊ตฌ์ฌํญ๊ณผ ๋ง์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ฒ ์ค์ฌ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ์ ์ง์ ๋ ๋๋ง, ๋ฒ๋ค ์ต์ ํ, Suspense ๊ธฐ๋ฐ ๋์ ๋ฑ์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ RSC๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ค๊ณ๋ ๊ฒ์ด Next.js 13+ App Router ์ด๋ค.
RSC ๋ฑ์ฅ ๋ฐฐ๊ฒฝ
React Server Components(RSC)๊ฐ ๋์จ ์ด์ ๋ ์ฑ๋ฅ ๋ฌธ์ ํด๊ฒฐ ๋ฐ ๊ฐ๋ฐ์์ ์์ฐ์ฑ์ ๋์ด๊ธฐ ์ํด ๋ฑ์ฅํ์๋ค. ๊ธฐ์กด React์ SSR ๋ชจ๋ธ๋ง์ผ๋ก๋ ํด๊ฒฐํ๊ธฐ ์ด๋ ค์ ๋ ๋ช ๊ฐ์ง ๊ทผ๋ณธ์ ์ธ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ณ ํด๋ผ์ด์ธํธ ์ค์ฌ ๋ ๋๋ง๊ณผ ์๋ฒ ์ค์ฌ ๋ ๋๋ง์ ์ฅ์ ์ ๊ฒฐํฉํ๋ ค๋ ๋ฑ ๋ค์๊ณผ ๊ฐ์ ๋ชฉ์ ์ ๊ฐ์ง๊ณ React.js 18์์ ๋ฑ์ฅํ๋ค.
์๋ฒ ์ปดํฌ๋ํธ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ ์ฐจ์ด์
ํน์ง | ์๋ฒ ์ปดํฌ๋ํธ | ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ |
์คํ ํ๊ฒฝ | ์๋ฒ์์ ์คํ | ๋ธ๋ผ์ฐ์ ์์ ์คํ |
๋ฐ์ดํฐ ์ ๊ทผ | ์๋ฒ ์์(DB, ํ์ผ ์์คํ ๋ฑ)์ ์ง์ ์ ๊ทผ ๊ฐ๋ฅ | API ์์ฒญ์ ํตํด ์๋ฒ ๋ฐ์ดํฐ์ ์ ๊ทผ |
๋ฒ๋ค ํฌ๊ธฐ ํฌํจ ์ฌ๋ถ | ํด๋ผ์ด์ธํธ๋ก ๋ฒ๋ค๋์ง ์์ | ํด๋ผ์ด์ธํธ๋ก ๋ฒ๋ค๋จ |
์ํธ์์ฉ ๊ฐ๋ฅ ์ฌ๋ถ | ์ฌ์ฉ์ ์ํธ์์ฉ ์ฒ๋ฆฌ ๋ถ๊ฐ๋ฅ | ์ฌ์ฉ์ ์ํธ์์ฉ ์ฒ๋ฆฌ ๊ฐ๋ฅ |
์ฌ์ฉ ์ | ๋ฐ์ดํฐ ๋ก๋, SEO ์นํ์ ์ธ HTML ์์ฑ | ๋ฒํผ ํด๋ฆญ, ์ ๋ ฅ ์ด๋ฒคํธ ์ฒ๋ฆฌ, ์ํ ๊ด๋ฆฌ |
1. ํด๋ผ์ด์ธํธ ์ค์ฌ ๋ ๋๋ง(CSR)์ ํ๊ณ ๊ทน๋ณต
2. ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ์ญํ ์ ๋ถ๋ฆฌํ์ฌ ๋ฒ๋ค ํฌ๊ธฐ ์ต์ ํ
3. SEO์ ์ด๊ธฐ ๋ก๋ฉ ์๋ ๊ฐ์
4. ์ ์ง์ ํ์ด๋๋ ์ด์ (Hydration)์ ํตํด ์ด๊ธฐ ๋ ๋๋ง ๋น์ฉ ๊ฐ์
5. ์๋ฒ์ ํด๋ผ์ด์ธํธ ๋ก์ง์ ๋ช ํํ ๋ถ๋ฆฌํด ๊ฐ๋ฐ์ ๊ฒฝํ ๊ฐ์
6. ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ก์ฑ๊ณผ ์๊ตฌ ์ฌํญ ์ถฉ์กฑ
๊ทธ๋ผ ์ด์ ์๋ ์์ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์์๋ ๋ถ๊ตฌํ๊ณ RSC๋ฅผ ๋์ ํ ์ ์์๋ ์ด์ ๊ฐ ๋ฌด์์ผ๊น? ๊ทธ๊ฑด React์ ์ด๊ธฐ ์ค๊ณ์ ๊ด๋ จ๋ ๊ธฐ์ ์ / ๊ตฌ์กฐ์ ํ๊ณ์, RSC์ ์ฃผ์ ๊ธฐ๋ฅ์ด React.js 18์์ ๋์ ๋ ์๋ก์ด ์ํคํ ์ฒ์ API์ ์์กดํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ธฐ์กด React์ ํ๊ณ์
1. ๋์์ฑ๊ธฐ๋ฅ (Concurrency Features)์ ๋ถ์ฌ
React.js 18 ์ด์ ์๋ ๋์์ฑ(Concurrency) ๊ฐ๋ ์ด React์ ์กด์ฌํ์ง ์์๋ค. RSC๋ ๋์์ฑ์ ํ์ฉํ์ฌ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ์์ ์ ๋ณ๋ ฌ๋ก ์ํํ๊ฑฐ๋, Suspense๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์คํธ๋ฆฌ๋ฐ์ผ๋ก ์ ์ง์ ์ผ๋ก ๋ ๋๋ง ํ ์ ์์ด์ผ ํ๋ค.
-> React.js 18 ์์ ์ถ๊ฐ๋ ๋์์ฑ ๊ธฐ๋ฅ์ React Suspense๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ก๋ฉ ์ํ๋ฅผ ์ ๊ณตํ๋ฉด์, ์ ์ง์ ์ผ๋ก UI๋ฅผ ๋ ๋๋ง ํ ์ ์๊ฒ ํด์ฃผ๋๋ฐ, RSC๋ ์ด ์ ์ง์ ๋ ๋๋ง์ ํต์ฌ์ผ๋ก ํ๋ค. ๋ํ Streaming Rendering์ ํตํด ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์คํธ๋ฆฌ๋ฐํ๋ฉฐ, ํ์ํ ๋ถ๋ถ๋ง ๋น ๋ฅด๊ฒ ๋ ๋๋งํ ์ ์๋ค.
2. ์๋ฒ ์ปดํฌ๋ํธ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ ๊ตฌ๋ถ์ ์ด๋ ค์
RSC๋ ์๋ฒ ์ปดํฌ๋ํธ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ๋ช ํํ ๊ตฌ๋ถํ์ฌ ์๋ฒ์์ ์คํ๋๋ ์ปดํฌ๋ํธ๋ ํด๋ผ์ด์ธํธ๋ก ๋ฒ๋ค๋์ง ์๋๋ก ์ค๊ณ๋์๋ค. ๊ทธ๋ฌ๋ React.js 18 ์ด์ ์๋ ์ด๋ฐ ๊ตฌ๋ถ์ ์ํ ๊ธฐ์ ์ ์ง์์ด ์์๋ค. (React.js 18 ์ดํ์๋. server.js / .client.js ์ ๋ช ์์ ์ธ ํ์ผ ํ์ฅ์๋ฅผ ํตํด React๊ฐ ์ปดํฌ๋ํธ๋ฅผ ์๋์ผ๋ก ๊ตฌ๋ถํ๋ค.)
-> RSC๋ ์๋ฒ ์ปดํฌ๋ํธ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ๋ช ํํ ๊ตฌ๋ถํด์ ์๋ฒ์์ ์คํ๋๋ ์ปดํฌ๋ํธ๋ ํด๋ผ์ด์ธํธ๋ก ๋ฒ๋ค๋์ง ์๋๋ก ์ค๊ณ๋์์ผ๋, React.js 18 ์ด์ ์๋ ์ด๋ฐ ๊ตฌ๋ถ์ ์ํ ๊ธฐ์ ์ ์ง์์ด ์์๋ค. (์ด์ ์๋ React ์ฑ์ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๋ฒ๋ค๋ง ๊ณผ์ ์์ ํด๋ผ์ด์ธํธ๋ก ์ ์ก๋๊ณ , ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋๋ก ์ค๊ณ๋์ด ์์๊ธฐ ๋๋ฌธ์, ์๋ฒ์์๋ง ์คํ๋๋๋ก ์ค๊ณ๋ ์ฝ๋๋ฅผ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด์ง ์๋ ๊ฒ ๋ถ๊ฐ๋ฅํ์์.)
3. ์๋ฒ ๋ ๋๋ง์ ์ ์ฝ(Old SSR Model)
React.js 18 ์ด์ ์ ์๋ฒ ๋ ๋๋ง ๋ชจ๋ธ์ ์ ํ๋ ๊ธฐ๋ฅ๋ง ์ ๊ณต๋์๋ค. ๊ธฐ์กด SSR์ ์ ์ฒด HTML์ ์๋ฒ์์ ๋ ๋๋ง ํ๊ณ ํด๋ผ์ด์ธํธ๋ก ์ ์กํ ํ, ํด๋ผ์ด์ธํธ์์ ์ด๋ฅผ ํ์ด๋๋ ์ด์
ํ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋๋ฐ, ์ด ๋ฐฉ์์ RSC์ ์ถฉ๋ํ๋ค.
-> React.js 18 ์ด์ ์๋ ํด๋ผ์ด์ธํธ ์ค์ฌ์ ํ์ด๋๋ ์ด์ ์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ์๋ฒ์์ ๋ ๋๋ง ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ํด๋ผ์ด์ธํธ๋ก ๋ฒ๋คํด์ผ ํ๊ณ , ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ์์ ์ค๋นํ ํ ํ ๋ฒ์ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด๋ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ RSC๊ฐ ์๊ตฌํ๋ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ ๋ฐฉ์์ด ์ง์๋์ง ์์๋ค.
4. React Suspense์ ์ ํ์ ์ธ ์ง์
React.js 16์์ ๋์ ๋ React Suspense๋, 18 ์ด์ ์๋ ํด๋ผ์ด์ธํธ์์๋ง ์ ํ์ ์ผ๋ก ์๋ํ์๋ค. ์๋ฒ์์๋ Suspsnse๋ฅผ ์ฌ์ฉํ ์ ์์๊ธฐ ๋๋ฌธ์ ์๋ฒ์์ ์ปดํฌ๋ํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์ UI๋ฅผ ์ ์ง์ ์ผ๋ก ๋ ๋๋ง ํ๋ ๊ธฐ๋ฅ์ด ๋ถ๊ฐ๋ฅํ๋ค. RSC๋ Suspense๋ฅผ ํตํด ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ์์ ์ ์กฐ์จํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ ๋๋ก ์ง์ํ๋ ค๋ฉด 18์ ๊ฐ์ ๋ Suspense๊ฐ ํ์ํ๋ค.
5. ๋ฐ์ดํฐ ํ์นญ๊ณผ ์๋ฒ ๋ก์ง์ ๋ถ๋ฆฌ ๋ฌธ์
React.js 18 ์ด์ ์๋ ๋ฐ์ดํฐ ํ์นญ ๋ก์ง๊ณผ UI ๋ ๋๋ง ๋ก์ง์ด ์์ ํ ๋ถ๋ฆฌ๋์ง ์์๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ์์ ๋ฐ์ดํฐ ํ์นญ์ ์ฒ๋ฆฌํ๋ฉด ํด๋ผ์ด์ธํธ์์ ์คํ๋๋ ์ฝ๋์๋ ๋์ผํ ๋ฐ์ดํฐ ํ์นญ ๋ก์ง์ด ํฌํจ๋๋ ๋ฌธ์ ๊ฐ ์์๋ค. React.js 18 ์ด์ ์๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ ๋ฐ์ดํฐ ํ๋ฆ์ด ๋ช ํํ์ง ์์๊ธฐ ๋๋ฌธ์ ์๋ฒ์์ ๋ฐ์ดํฐ ํ์นญ์ ์ํํ๋ฉด์๋ ํด๋ผ์ด์ธํธ์์ ๋ถํ์ํ ๋ก์ง์ด ํฌํจ๋๋ ๋ฒ๋ค ํฌ๊ธฐ ์ฆ๊ฐ ๋ฌธ์ ๊ฐ ์์๋ค.
6. Streaming Rendering ํ๋กํ ์ฝ์ ๋ถ์ฌ
React.js 18์์๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ดํฐ์ ์ปดํฌ๋ํธ๋ฅผ ๊ตํํ ๋ ์ฌ์ฉํ๋ Streaming Rendering ํ๋กํ ์ฝ์ด ๋์ ๋์ด ์ปดํฌ๋ํธ๋ฅผ ์ง๋ ฌํ๋ ๋ฐ์ดํฐ ํํ๋ก ํด๋ผ์ด์ธํธ์ ์ ์กํ๊ณ ํด๋ผ์ด์ธํธ์์ ์ด๊ฒ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ๋๋๋ฐ, ์ด์ ์๋ ์ด๋ฐ ๋ฉ์ปค๋์ฆ์ด ์์๋ค.
RSC ๋์ ์๋ฆฌ
1. ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ ๋ถ๋ฆฌ
์๋ฒ ์ปดํฌ๋ํธ
- ์๋ฒ์์ ์คํ๋๋ฉฐ, ํด๋ผ์ด์ธํธ๋ก ๋ฒ๋ค๋์ง ์๊ธฐ ๋๋ฌธ์, ํด๋ผ์ด์ธํธ๋ก ์ ์ก๋๋ ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ์ค์ด๋ค์ด, ์ด๊ธฐ ๋ก๋ฉ ์๋๊ฐ ๋นจ๋ผ์ง๋ค.
- ์ฃผ๋ก ๋ฐ์ดํฐ ํ์นญ์ด๋ CPU ์ง์ฝ์ ์ธ ์์ ์ ์ฒ๋ฆฌํ๋ค.
- HTML์ด๋ React ์์์ "์ง๋ ฌํ๋ ํํ(serialized form)"๋ก ํด๋ผ์ด์ธํธ์ ์ ๋ฌ๋๋ค.
- React์์ ํ์ผ ํ์ฅ์(.server.js)๋ก ๊ตฌ๋ถํ๋ค.
ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ
- ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ฉฐ, ํด๋ผ์ด์ธํธ๋ก ๋ฒ๋ค๋๋ค.
- ์ฌ์ฉ์์์ ์ํธ์์ฉ(interaction)์ ๋ด๋นํ๋ค.
- React์์ ํ์ผ ํ์ฅ์(.client.js)๋ก ๊ตฌ๋ถํ๋ค.
2. ์๋ฒ์์ ๋ ๋๋ง (Rendering on Server)
ํด๋ผ์ด์ธํธ ์์ฒญ ์ฒ๋ฆฌ
- ์ฌ์ฉ์๊ฐ ํ์ด์ง๋ฅผ ์์ฒญํ๋ฉด ์๋ฒ๋ ํด๋น ํ์ด์ง๋ฅผ ๊ตฌ์ฑํ๋ ์๋ฒ ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋ค.
๋ฐ์ดํฐ ํ์นญ
- ์๋ฒ ์ปดํฌ๋ํธ๋ ์๋ฒ ํ๊ฒฝ์์ ์คํ๋๋ฏ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค, REST API, GraphQL ๋ฑ๊ณผ ์ง์ ํต์ ํ ์ ์๋ค.
- ๋ฐ์ดํฐ๊ฐ ์ค๋น๋๋ฉด ์ด๋ฅผ React ์ปดํฌ๋ํธ๋ก ๋ ๋๋ง(Hydration)ํ๋ค.
์ถ๋ ฅ ์์ฑ
- ์๋ฒ ์ปดํฌ๋ํธ๋ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ํธ์ถํ๊ฑฐ๋ ํฌํจํ ์ ์์. ํ์ง๋ง ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ ์๋ฒ์์ ์คํ๋์ง ์๊ณ , '์ฐธ์กฐ'๋ก๋ง ๋จ๋๋ค.
- ์๋ฒ ์ปดํฌ๋ํธ๋ ํด๋ผ์ด์ธํธ์์ ์ฌ์ฉํ ์ ์๋๋ก ์ง๋ ฌํ๋ JSON ํ์์ ๋ฐ์ดํฐ๋ก ์ถ๋ ฅ๋๋ค.
3. ์ง๋ ฌํ๋ ๋ฐ์ดํฐ์ ํด๋ผ์ด์ธํธ ์ ์ก
- ์๋ฒ์์ ๋ ๋๋ง ๋ ๊ฒฐ๊ณผ๋ JSON ํํ๋ก (UI์ HTML, ์ปดํฌ๋ํธ ์ํ, ํธ๋ฆฌ ๊ตฌ์กฐ, ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ ์ฐธ์กฐ ์ ๋ณด ๋ฑ์ ํฌํจ) ํด๋ผ์ด์ธํธ์ ์ ์ก๋๋ค.
// jsonํ์ผ ํํ
{
"type": "div",
"props": {
"children": [
{
"type": "h1",
"props": {
"children": "Hello World"
}
},
{
"type": "$RC", // ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ์ฐธ์กฐํ๋ ํ ํฐ
"id": "ClientComponent123",
"props": {
"data": "example data"
}
}
]
}
}
- ํด๋ผ์ด์ธํธ๋ ์ด ๋ฐ์ดํฐ๋ฅผ React์ ํน์ํ ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ๋ค์ ๊ฒฐํฉํ๊ณ ๋ ๋๋ง ํ๋ค.
4. ํด๋ผ์ด์ธํธ์์์ ํ์ด๋๋ ์ด์ (Hydration on Client)
HTML๊ณผ JSON ๋ฐ์ดํฐ ๊ฒฐํฉ
- ์๋ฒ์์ ์์ฑ๋ HTML๊ณผ JSON ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด ํด๋ผ์ด์ธํธ๋ ์ด๊ธฐ UI๋ฅผ ๊ตฌ์ฑํ๋ค.
- ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๊ฐ ํฌํจ๋ ๋ถ๋ถ์ ์ด๊ธฐ์๋ 'place holder'๋ก ๋ ๋๋ง ๋๋ค๊ฐ ์ดํ ๋ฒ๋ค ํ์ผ์ด ๋ก๋๋๋ฉด React๊ฐ ํ์ด๋๋ ์ด์ ์ ํตํด ํ์ฑํํ๋ค.
์ ์ง์ ํ์ด๋๋ ์ด์
- ํด๋ผ์ด์ธํธ๋ ํ์ํ ๋ถ๋ถ๋ง ์ ์ง์ ์ผ๋ก ํ์ด๋๋ ์ด์ (Hydration)์ ์ํํ๋ค.
- ์ฌ์ฉ์ ์ํธ์์ฉ์ด ์๋ ๋ถ๋ถ์ ๋ฏธ๋ค์ง ์ ์์ด ์ฑ๋ฅ ์ต์ ํ๊ฐ ๊ฐ๋ฅํ๋ค.
5. ์๋ฒ ์ปดํฌ๋ํธ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ๊ฐ์ ์กฐํฉ
์๋ฒ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ์ฌ์ฉ
- ์๋ฒ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋๋ฉด Client Component๋ ํด๋ผ์ด์ธํธ์์ ์คํ๋ ์ ๋ณด๋ง ํฌํจ๋ ์ํ๋ก ์ ์ก๋๋ค.
// JSX
import ClientComponent from './ClientComponent.client';
export default function ServerComponent() {
return (
<div>
<h1>Server Rendered Content</h1>
<ClientComponent /> {/* ํด๋ผ์ด์ธํธ์์๋ง ์คํ๋จ */}
</div>
);
}
6. RSC์ ํน์ ํ๋กํ ์ฝ
React๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ ๋ฐ์ดํฐ ๊ตํ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด, ์์ฒด์ ์ธ ํ๋กํ ์ฝ ์ฌ์ฉ.
- ์ด ํ๋กํ ์ฝ์ ์๋ฒ์์ JSON ํํ์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ฉด์ ํด๋ผ์ด์ธํธ์์ ํ์ํ ๋๋ง React ์์๋ฅผ ์ฌ์กฐํฉํ๋ค.
- ์ด ๊ณผ์ ์์ ์ปดํฌ๋ํธ๊ฐ ์๋ก ๋ค๋ฅธ ํ๊ฒฝ์์ ์คํ๋๋ ๊ฒ์ ํจ์จ์ ์ผ๋ก ๋ถ๋ฆฌํ๊ณ ๊ฒฐํฉํ๋ค.
- React Server Components์ ํน์ ํ๋กํ ์ฝ์ JSON ์ง๋ ฌํ, ์ปดํฌ๋ํธ ์ฐธ์กฐ ํ ํฐ, ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ์ญํ ์ ์ต์ ํํ๊ธฐ ๋๋ฌธ์ RSC๋ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ , ์ด๊ธฐ ๋ก๋ฉ ์๋๋ฅผ ๋์ด๋ฉฐ, ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์๋ค.
7. RSC์ Lazy Loading + Suspense์์ ์กฐํฉ
- ์๋ฒ์์ ๋ ๋๋ง ๋ ๋ฐ์ดํฐ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ํจ์จ์ ์ผ๋ก ๋ก๋ํ๊ณ ๋ ๋๋ง ํ ์ ์๋ค. ์ด ๋ ๊ฐ์ง ๊ธฐ๋ฅ์ด RSC์ ๊ฒฐํฉ๋๋ฉด, ์ปดํฌ๋ํธ๋ฅผ ํ์ํ ์์ ์ ์ง์ฐ๋ก๋(lazy load)ํ์ฌ, ๋คํธ์ํฌ ํธ๋ํฝ์ ์ต์ํํ๊ณ , ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์ํ ์ ์๋ค.
// JSX
import React, { Suspense } from 'react';
const LazyServerComponent = React.lazy(() => import('./ServerComponent.server'));
export default function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<LazyServerComponent />
</Suspense>
);
}
- React.lazy๋ ๋์ ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ก๋(์ฝ๋ ์คํ๋ฆฌํ )ํ๋ ๊ธฐ๋ฅ์ผ๋ก, ํ์ํ ๋๋ง ํด๋น ์ปดํฌ๋ํธ์ ์ฝ๋๋ฅผ ๋คํธ์ํฌ๋ฅผ ํตํด ๊ฐ์ ธ์์ ๋ ๋๋ง ํ๋ค. (์ด๊ธฐ ๋ฒ๋ค ํฌ๊ธฐ ์ถ์ ๋ฐ ์ฑ์ ์ด๊ธฐ ๋ก๋ฉ ์๋ ํฅ์)
- Suspense๋ React.lazy์ ํจ๊ป ์ฌ์ฉ๋๋ฉฐ, ์ปดํฌ๋ํธ๊ฐ ๋ก๋๋๋ ๋์ ๋ก๋ฉ์ํ(Placeholder)๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ญํ ์ ํ์ฌ ๊ฒฐ๊ณผ์ ์ผ๋ก React๋ ๋น๋๊ธฐ์ ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ก๋ํ๊ณ , ์ปดํฌ๋ํธ ๋ก๋๊ฐ ์๋ฃ๋ ๋๊น์ง Suspense๊ฐ ๋์ฒด UI๋ฅผ ๋ ๋๋ง ํ๋ค.
RSC ํ๋ฆ ์ ๋ฆฌ
1. ์๋ฒ ์ปดํฌ๋ํธ๋ ์๋ฒ์์ ์คํ๋๊ณ , ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ ํ์ํ ๋๋ง ๋ก๋๋จ.
2. React.lazy๋ฅผ ์ฌ์ฉํด ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ๋์ ์ผ๋ก ๊ฐ์ ธ์ด.
3. Suspense๋ฅผ ํตํด ์ปดํฌ๋ํธ ๋ก๋๊ฐ ์๋ฃ๋ ๋๊น์ง ๋ก๋ฉ ์ํ๋ฅผ ์ ๊ณต.
4. React๋ ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ์ Suspense๋ฅผ ๊ฒฐํฉํ์ฌ UI๋ฅผ ์ ์ง์ ์ผ๋ก ๋ ๋๋ง ํจ.
RSC ์ฅ์
์ฑ๋ฅ ์ต์ ํ
- JavaScript ๋ฒ๋ค ํฌ๊ธฐ ๊ฐ์ : ์๋ฒ ์ปดํฌ๋ํธ๋ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋์ง ์์ผ๋ฏ๋ก, ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌ๋๋ JavaScript ๋ฒ๋ค ํ์ผ์์ ์์ ํ ์ ์ธ๋๊ณ , ์ด์ ๋ฐ๋ผ ์ด๊ธฐ ๋ก๋ฉ์๋๊ฐ ๋นจ๋ผ์ง๋ค.
- ์ฌ์ฉ์ ๊ฒฝํ ํฅ์ : ์๋ฒ์์ HTML์ ์คํธ๋ฆฌ๋ฐ ๋ฐฉ์์ผ๋ก ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ์ฌ ์ด๊ธฐ ๋ก๋ฉ ์๋๋ฅผ ํฌ๊ฒ ๊ฐ์ ํ๊ณ , ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์์๋ ํ๋ฉด์ ์ผ๋ถ๋ฅผ ๋จผ์ ๋ณผ ์ ์์ด ์ฌ์ฉ์ ๊ฒฝํ์ด ํฌ๊ฒ ํฅ์๋๋ค.
- ๋ณด์ ๊ฐํ : ์๋ฒ์์๋ง ์คํ๋๊ธฐ ๋๋ฌธ์ ๋ฏผ๊ฐํ ๋ก์ง์ด๋ API ํค ๊ฐ์ ์ ๋ณด๋ ์๋ฒ์์๋ง ์คํ๋๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ์ ๋ ธ์ถ๋์ง ์์.
- ํจ์จ์ ์ธ ๋ ๋๋ง : ์๋ฒ์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ก ์ฒ๋ฆฌํ๊ณ , UI๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์, ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ๋ ๋๋ง ํ๋ ๋ถ๋ด์ด ์ค์ด๋ ๋ค.
๊ฐ๋ฐ์ ๊ฒฝํ(DX) ๊ฐ์
- ์๋ฒ์ ํด๋ผ์ด์ธํธ์ ๋ช ํํ ์ญํ ๋ถ๋ฆฌ : ์๋ฒ ์ปดํฌ๋ํธ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ๋ถํ์ฌ ์ ์ง๋ณด์๊ฐ ์ฌ์์ง๊ณ , ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ UI๋ก์ง์ด ๋ช ํํ ๋ถ๋ฆฌ๋์ด ์ฝ๋๊ฐ ๋ ๊ฐ๊ฒฐํด์ง๋ค.
- ๋ฐ์ดํฐ ํ์นญ ๋ก์ง ๊ฐ์ํ : ๋ฐ์ดํฐ๋ ์๋ฒ ์ปดํฌ๋ํธ์์ ์ง์ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ์์ ๋ณ๋์ ๋ฐ์ดํฐ ์์ฒญ ๋ก์ง์ด๋ ์ํ ๊ด๋ฆฌ๊ฐ ํ์ํ์ง ์๋ค.
- SEO ์นํ์ : ์๋ฒ์์ HTML์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๊ฒ์ ์์ง์ด ์ฝ๊ฒ ์ฝํ ์ธ ๋ฅผ ํฌ๋กค๋งํ ์ ์์ด SEO ์ต์ ํ์ ์ ๋ฆฌํ๋ค.
- ๋ฆฌํฉํ ๋ง ์ฉ์ด : ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์ญํ ์ด ๋ช ํํ ๋๋์ด ์ฝ๋ ๋ณ๊ฒฝ ์ ์ํฅ ๋ฒ์๊ฐ ์ค์ด๋ ๋ค.
์ ์ฐํ UI ๊ฐ๋ฐ
- ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์กฐํฉ : ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ํผํฉํ์ฌ ์ฌ์ฉํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ ๋๋ง ํ๊ณ ํด๋ผ์ด์ธํธ์์ ์ํธ์์ฉ์ ์ถ๊ฐํ๋ ๋ฐฉ์์ด ๊ฐ๋ฅํด์ง๋ค.
- ์ ์ง์ ์ ๊ทธ๋ ์ด๋ ๊ฐ๋ฅ : ๊ธฐ์กด React ์ฑ์์๋ ์ผ๋ถ ์ปดํฌ๋ํธ๋ฅผ RSC๋ก ์ ํํ๋ฉฐ ์ ์ง์ ์ผ๋ก ์ ์ฉํ ์ ์๊ณ , ์ ์ฒด ๋ฆฌํฉํ ๋ง์ด ํ์ํ์ง ์์ ๊ธฐ์กด ํ๋ก์ ํธ์ ์ฝ๊ฒ ๋์ ์ด ๊ฐ๋ฅํ๋ค.
์ต์ ์น ์ํคํ ์ฒ์์ ๋ถ๋๋ฌ์ด ํตํฉ
- RSC๋ ์ต์ ์น ์ํคํ ์ฒ(Edge Computing, CDN, Serverless ๋ฑ)์ ์ ๋ง๋๋ค.
- Vercel์ด๋, Netlify ๊ฐ์ ์๋ฒ๋ฆฌ์ค ํ๋ซํผ๊ณผ์ ์ฐ๋์์ ์ต์ ํ๋ ์ฑ๋ฅ ์ ๊ณต
๊ธฐ์กด React์ RSC์ ๊ฐ์ ์ ์ ๋ฆฌ
๊ธฐ์กด React | RSC ๊ฐ์ ์ |
ํด๋ผ์ด์ธํธ์์ ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ์คํ | ์๋ฒ์์ HTML์ ์์ฑ, ํด๋ผ์ด์ธํธ์ ๊ฒฐ๊ณผ๋ง ์ ์ก |
์ด๊ธฐ ๋ก๋ฉ ์๋๊ฐ ๋๋ฆผ | ์คํธ๋ฆฌ๋ฐ ๋ ๋๋ง์ผ๋ก ์ด๊ธฐ ํ๋ฉด์ ๋น ๋ฅด๊ฒ ํ์ |
๋ฐ์ดํฐ ํ์นญ๊ณผ UI ๊ฒฐํฉ | ๋ฐ์ดํฐ๋ ์๋ฒ ์ปดํฌ๋ํธ์์๋ง ์ฒ๋ฆฌ, ํด๋ผ์ด์ธํธ์ ๋ถํ์ํ ๋ก์ง ์ ๊ฑฐ |
JavaScript ๋ฒ๋ค ํฌ๊ธฐ ํผ | ํด๋ผ์ด์ธํธ์ ํ์ํ JavaScript๋ง ์ ์ก |
SEO์ ๋ถ๋ฆฌํจ | ์๋ฒ์์ ์์ฑ๋ HTML๋ก SEO ์ต์ ํ |
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ Next.js ] Next15์ ๋ํด ์์๋ณด๊ธฐ. (9) | 2024.11.10 |
---|---|
React 18 ๋ณ๊ฒฝ์ ์ ๋ฆฌ (0) | 2024.11.03 |
[ React ] React 19 RC์ ๋ํด์ ์์๋ณด์ (0) | 2024.09.23 |
[ React ] React์ export์ export default ์ฐจ์ด์ ์์๋ณด๊ธฐ (0) | 2024.08.18 |
[ React ] Chart UI ๊ตฌํ์ ์ํ React ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋ฆฌ (0) | 2024.06.23 |