diff --git a/July/article/How-React-Server-Components-work:an-in-depth-guide.md b/July/article/How-React-Server-Components-work:an-in-depth-guide.md
new file mode 100644
index 0000000..e789dce
--- /dev/null
+++ b/July/article/How-React-Server-Components-work:an-in-depth-guide.md
@@ -0,0 +1,572 @@
+## ๐ [How React server components work: an in-depth guide](https://www.plasmic.app/blog/how-react-server-components-work)
+
+### ๐๏ธ ๋ฒ์ญ ๋ ์ง: 2024.07.08
+
+### ๐ง ๋ฒ์ญํ ํฌ๋ฃจ: ๋ฒ๊ฑด๋(์ ํํ)
+
+---
+
+React ์๋ฒ ์ปดํฌ๋ํธ(RSC)๋ React 18์์ ์คํ์ ์ผ๋ก ๋์
๋ ์๋ก์ด ๊ธฐ๋ฅ์ผ๋ก, ํ์ด์ง ๋ก๋ ์ฑ๋ฅ, ๋ฒ๋ค ํฌ๊ธฐ, ๊ทธ๋ฆฌ๊ณ React ์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ ๋ฐฉ์์ ์์ฒญ๋ ์ํฅ์ ๋ฏธ์น ๊ฒ์ผ๋ก ๊ธฐ๋๋ฉ๋๋ค.
+
+์ ํฌ Plasmic์ React์ฉ ์๊ฐ์ ๋น๋๋ฅผ ์ ๊ณตํ๋ฉฐ, ํนํ ์ฑ๋ฅ ์ค์ํ ๋ง์ผํ
๋ฐ ์ ์์๊ฑฐ๋ ์ฌ์ดํธ๋ฅผ ๊ตฌ์ถํ๋ ๊ณ ๊ฐ๋ค์๊ฒ ๋งค์ฐ ์ค์ํ React ์ฑ๋ฅ ๊ฐ์ ์ ํฐ ๊ด์ฌ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
+
+์ด์ React ์๋ฒ ์ปดํฌ๋ํธ์ ๋ํด ๊น์ด ํํค์ณ๋ณด์์ผ๋ฉฐ, ๊ทธ ๋์ ์๋ฆฌ์ ๋ํด ์์๋ณด๊ณ ๊ณต์ ํ๋ ค๊ณ ํฉ๋๋ค.
+
+๋ํ [ํธ์ ์์ฝ](https://www.reddit.com/r/reactjs/comments/s8r0ve/how_react_server_components_work_an_indepth_guide/)์ ๋ณด์ค ์ ์์ต๋๋ค.
+
+## ๋ฆฌ์กํธ ์๋ฒ ์ปดํฌ๋ํธ๋ ๋ฌด์์ผ๊น์ ?
+
+๋ฆฌ์กํธ ์๋ฒ ์ปดํฌ๋ํธ (RSC)๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )๊ฐ ํ๋ ฅํ์ฌ React ์ ํ๋ฆฌ์ผ์ด์
์ ๋ ๋๋งํ ์ ์๊ฒ ํด์ค๋๋ค.
+
+์ผ๋ฐ์ ์ผ๋ก React ์์ ํธ๋ฆฌ๋ ์ฌ๋ฌ ๊ฐ์ React ์ปดํฌ๋ํธ๋ก ๊ตฌ์ฑ๋์ด ํ์ด์ง๋ฅผ ๋ ๋๋งํ๋๋ฐ, RSC๋ ์ด ํธ๋ฆฌ์ ์ผ๋ถ ์ปดํฌ๋ํธ๋ฅผ ์๋ฒ์์ ๋ ๋๋งํ๊ณ , ์ผ๋ถ ์ปดํฌ๋ํธ๋ฅผ ํด๋ผ์ด์ธํธ์์ ๋ ๋๋งํ ์ ์๊ฒ ๋ง๋ญ๋๋ค.
+
+์ด๋ ๊ธฐ์กด์ React ๊ฐ๋ฐ ๋ฐฉ์์ ํฌ๊ฒ ๋ฐ๊พธ๊ฒ ๋ฉ๋๋ค.
+
+React ํ์ด ์ ์ํ ๊ฐ๋ตํ ๊ทธ๋ฆผ์์๋ ์ด ๋ชฉํ๊ฐ ์ ๋ํ๋ฉ๋๋ค: ์๋ฒ์์ ๋ ๋๋ง๋๋ ์ฃผํฉ์ ์ปดํฌ๋ํธ์ ํด๋ผ์ด์ธํธ์์ ๋ ๋๋ง๋๋ ํ๋์ ์ปดํฌ๋ํธ๊ฐ ํผํฉ๋ React ํธ๋ฆฌ์
๋๋ค.
+
+![](https://www.plasmic.app/blog/static/images/react-server-components.png)
+
+### ์ด๊ฑด ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR) ์๋๊ฐ์ ?
+
+**๋ฆฌ์กํธ ์๋ฒ ์ปดํฌ๋ํธ๋ SSR์ด ์๋๋๋ค!**
+
+๋ ๊ธฐ์ ๋ชจ๋ "์๋ฒ"๋ผ๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํ๋ฉฐ ์๋ฒ์์ ์์
์ ์ํํ์ง๋ง, ๋ณ๋์ ๊ฐ๋
์ด๋ฉฐ ์๋ก ๋
๋ฆฝ์ ์ผ๋ก ์๋ํฉ๋๋ค.
+
+SSR์ React ํธ๋ฆฌ๋ฅผ ์์ HTML๋ก ๋ ๋๋งํ๊ธฐ ์ํ ํ๊ฒฝ์ ์๋ฎฌ๋ ์ด์
ํ๋ ๋ฐ๋ฉด, RSC๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ํ๋ ฅํ์ฌ ํน์ ์ปดํฌ๋ํธ๋ฅผ ์๋ฒ ๋๋ ํด๋ผ์ด์ธํธ์์ ๋ ๋๋งํ ์ ์๊ฒ ํฉ๋๋ค.
+
+SSR์ ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ๋ถํ์ง ์๊ณ ๋์ผํ๊ฒ ๋ ๋๋งํ์ง๋ง, RSC๋ ์๋ฒ์์ ์ผ๋ถ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๊ณ , ๋๋จธ์ง๋ ํด๋ผ์ด์ธํธ์์ ๋ ๋๋งํ๋ ์ ์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
+
+RSC๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ SSR์ ์ฌ์ฉํ ํ์๋ ์์ผ๋ฉฐ, ๊ทธ ๋ฐ๋๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
+
+๋ฌผ๋ก SSR๊ณผ RSC๋ฅผ ๊ฒฐํฉํ์ฌ ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง๊ณผ ํจ๊ป ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ์ ์ ํ๊ฒ ๋ ๋๋งํ ์๋ ์์ต๋๋ค.
+
+ํฅํ ํฌ์คํธ์์๋ ์ด ๋ ๊ธฐ์ ์ด ์ด๋ป๊ฒ ํจ๊ป ์๋ํ๋์ง์ ๋ํด ๋ ์์ธํ ๋ค๋ฃฐ ์์ ์
๋๋ค.
+
+ํ์ง๋ง ํ์ฌ๋ SSR์ ๋ฌด์ํ๊ณ RSC์๋ง ์ง์คํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
+
+## ์ฐ๋ฆฌ๋ ์ด๊ฑธ ์ ์ํ๊ฒ ๋ ๊น์ ?
+
+๋ฆฌ์กํธ ์๋ฒ ์ปดํฌ๋ํธ๊ฐ ๋์
๋๊ธฐ ์ ์๋ ๋ชจ๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๊ฐ "ํด๋ผ์ด์ธํธ" ์ปดํฌ๋ํธ๋ก, ๋ธ๋ผ์ฐ์ ์์ ์คํ๋์์ต๋๋ค.
+
+๋ธ๋ผ์ฐ์ ๊ฐ ๋ฆฌ์กํธ ํ์ด์ง๋ฅผ ๋ฐฉ๋ฌธํ๋ฉด ํ์ํ ๋ชจ๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ ์ฝ๋๋ฅผ ๋ค์ด๋ก๋ํ๊ณ , ๋ฆฌ์กํธ ์๋ฆฌ๋จผํธ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ์ฌ DOM์ ๋ ๋๋งํ๊ฑฐ๋(SSR์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ DOM์ ํ์ด๋๋ ์ด์
) ํฉ๋๋ค.
+
+๋ธ๋ผ์ฐ์ ์์ ์ด ์์
์ ์ํํ๋ ๊ฒ์ด ์ข์ ์ด์ ๋ ๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ํธ์์ฉํ ์ ์๊ฒ ํด์ฃผ๊ธฐ ๋๋ฌธ์
๋๋ค.
+
+์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ค์นํ๊ณ , ์ํ๋ฅผ ์ถ์ ํ๋ฉฐ, ์ด๋ฒคํธ์ ๋ฐ๋ผ ๋ฆฌ์กํธ ํธ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ๊ณ , ํจ์จ์ ์ผ๋ก DOM์ ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค.
+
+๊ทธ๋ ๋ค๋ฉด ์ ์๋ฒ์์ ๋ ๋๋ง์ ํด์ผ ํ ๊น์?
+
+๋ธ๋ผ์ฐ์ ๋ฅผ ๋์ด์์ ์๋ฒ์์ ๋ ๋๋ง ํ๋ ๊ฒ์ ๋ช๋ช ์ฅ์ ๋ค์ด ์์ต๋๋ค.
+
+- ์๋ฒ๋ ๋ฐ์ดํฐ ์์ค์ ์ง์ ์ ์ผ๋ก ์ ๊ทผํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค, GraphQL ์๋ํฌ์ธํธ, ํ์ผ ์์คํ
๋ฑ์ด ์์ต๋๋ค.
+ ์๋ฒ๋ ๊ณต์ฉ API ์๋ํฌ์ธํธ๋ฅผ ๊ฑฐ์น์ง ์๊ณ ๋ ์ง์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ผ๋ฉฐ, ๋ณดํต ๋ฐ์ดํฐ ์์ค์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ ๊ฐ๊น์ด ์์น์ ์์ด ๋ธ๋ผ์ฐ์ ๋ณด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ ๋น ๋ฅด๊ฒ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
+
+- ์๋ฒ๋ ๋งํฌ๋ค์ด์ HTML๋ก ๋ ๋๋งํ๋ npm ํจํค์ง์ ๊ฐ์ "๋ฌด๊ฑฐ์ด" ์ฝ๋ ๋ชจ๋์ ์ ๋ ดํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+ ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฌํ ์์กด์ฑ์ ์ฌ์ฉํ ๋๋ง๋ค ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค๋ก ๋ค์ด๋ก๋ํด์ผ ํ์ง๋ง, ์๋ฒ๋ ๋งค๋ฒ ์ด๋ฌํ ์์กด์ฑ์ ๋ค์ด๋ก๋ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
+
+๊ฐ๋จํ ๋งํด, **๋ฆฌ์กํธ ์๋ฒ ์ปดํฌ๋ํธ๋ ์๋ฒ์ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ฐ์์ ์ฅ์ ์ ์ต๋ํ ๋ฐํํ ์ ์๊ฒ ํด์ค๋๋ค.** ์๋ฒ ์ปดํฌ๋ํธ๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ์ ์ฝํ
์ธ ๋ ๋๋ง์ ์ง์คํ๊ณ , ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ํธ์์ฉ์ฑ์ ์ ์งํ๋ ๋ฐ ์ง์คํ ์ ์์ต๋๋ค.
+๊ทธ ๊ฒฐ๊ณผ, ํ์ด์ง ๋ก๋ฉ ์๋๊ฐ ๋นจ๋ผ์ง๊ณ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ์์์ง๋ฉฐ, ์ฌ์ฉ์ ๊ฒฝํ์ด ๊ฐ์ ๋ฉ๋๋ค.
+
+## ์ ์ฒด์ ์ธ ๊ทธ๋ฆผ
+
+์ด ์์
์ด ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์ง ์ง๊ด์ ์ผ๋ก ์ดํดํด๋ด
์๋ค.
+
+์ ์์ด๋ค์ ์ปต์ผ์ดํฌ ์ฅ์์ ๋งค์ฐ ์ข์ํ์ง๋ง, ๊ตฝ๋ ๊ณผ์ ์๋ ๋ณ๋ก ํฅ๋ฏธ๊ฐ ์์ต๋๋ค.
+
+๋ง์ฝ ์์ด๋ค์๊ฒ ์ฒ์๋ถํฐ ์ปต์ผ์ดํฌ๋ฅผ ๋ง๋ค๊ณ ์ฅ์ํ๋ผ๊ณ ํ๋ค๋ฉด (๊ท์ฝ๊ธด ํ๊ฒ ์ง๋ง) ์ ๋ง ํฐ์ผ์ผ ๊ฒ์
๋๋ค.
+
+์ ๋ ์์ด๋ค์๊ฒ ๋ฐ๊ฐ๋ฃจ์ ์คํ, ๋ฒํฐ๋ฅผ ์ฃผ๊ณ ์ค๋ธ์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, ๋ง์ ์ค๋ช
์ ์ฝ์ด์ฃผ๊ณ ํ๋ฃจ ์ข
์ผ ๊ฑธ๋ฆด ๊ฒ์
๋๋ค.
+
+๊ทธ๋ฌ๋ ์ ๊ฐ ๋ฏธ๋ฆฌ ์ผ๋ถ ์์
์ ์ฒ๋ฆฌํด์ค๋ค๋ฉด, ์ฆ ์ปต์ผ์ดํฌ๋ฅผ ๊ตฝ๊ณ ์์ด์ฑ์ ๋ง๋ค์ด ์์ด๋ค์๊ฒ ์ฃผ๋ฉด, ์์ด๋ค์ ๋ ๋นจ๋ฆฌ ์ฌ๋ฏธ์๋ ์ฅ์ ์์
์ ์์ํ ์ ์์ต๋๋ค!
+
+๊ฒ๋ค๊ฐ ์ค๋ธ์ ์ฌ์ฉํ๋ ๊ฑฑ์ ๋ ํ์ง ์์๋ ๋์ฃ . ์ ๋ง ์ข์ ์ํฉ์ด์ฃ !
+
+![](https://www.plasmic.app/blog/static/images/cake.jpg)
+
+๋ฆฌ์กํธ ์๋ฒ ์ปดํฌ๋ํธ๋ ์ด๋ฌํ ์์
๋ถ๋ด์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
+
+์ฆ, ์๋ฒ๊ฐ ์ํ ์ ์๋ ์์
์ ๋ฏธ๋ฆฌ ์ฒ๋ฆฌํ ํ, ๋ธ๋ผ์ฐ์ ๊ฐ ๋๋จธ์ง ์์
์ ์๋ฃํ๋๋ก ๋๊ธฐ๋ ๊ฒ์
๋๋ค.
+
+์ด๋ ๊ฒ ํ๋ฉด ์๋ฒ๊ฐ ๋๊ฒจ์ค์ผ ํ ๊ฒ๋ค์ด ์ค์ด๋ญ๋๋ค.
+
+์๋ฅผ ๋ค์ด, ๋ฐ๊ฐ๋ฃจ ํ ๋ด์ง์ ์ค๋ธ ์ ์ฒด๋ฅผ ๋๊ธฐ๋ ๋์ , 12๊ฐ์ ์์ ์ปต์ผ์ดํฌ๋ฅผ ๋๊ธฐ๋ ๊ฒ์ด ํจ์ฌ ํจ์จ์ ์
๋๋ค!
+
+์ฌ๋ฌ๋ถ์ ํ์ด์ง์ ๋ํ ๋ฆฌ์กํธ ํธ๋ฆฌ๋ฅผ ์๊ฐํด๋ด
์๋ค.
+
+์ผ๋ถ ์ปดํฌ๋ํธ๋ ์๋ฒ์์ ๋ ๋๋ง๋๊ณ , ์ผ๋ถ๋ ํด๋ผ์ด์ธํธ์์ ๋ ๋๋ง๋ฉ๋๋ค.
+
+์ด๋ฌํ ๊ณ ์์ค์ด๋ผ๊ณ ํ ์ ์๋ ์ ๋ต์ ๋จ์ํํด์ ์๊ฐํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
+
+์๋ฒ๋ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ํ์์ฒ๋ผ "๋ ๋๋ง"ํ์ฌ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ `div`๋ `p` ๊ฐ์ ๋ค์ดํฐ๋ธ HTML ์์๋ก ๋ณํํฉ๋๋ค.
+
+๊ทธ๋ฌ๋ ๋ธ๋ผ์ฐ์ ์์ ๋ ๋๋งํด์ผ ํ๋ "ํด๋ผ์ด์ธํธ" ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ฉด, ์๋ฒ๋ ๊ทธ ์๋ฆฌ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ ์์ฑ(props)์ ์ฑ์ฐ๊ธฐ ์ํ ์ง์นจ๊ณผ ํจ๊ป `ํ๋ ์ด์คํ๋`๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
+
+๊ทธ ๋ค์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ด ์ถ๋ ฅ์ ๋ฐ์์, ๊ทธ ํ๋ ์ด์คํ๋๋ฅผ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก ์ฑ์ฐ๋ฉด ๋๋ฉ๋๋ค!
+
+**์ค์ ๋ก๋ ์ด๋ ๊ฒ ๊ฐ๋จํ์ง ์์ง๋ง,** ์ด์ ๊ณง ๋ณต์กํ ์ธ๋ถ ์ฌํญ์ ๋ค๋ฃฐ ์์ ์
๋๋ค.
+
+ํ์ง๋ง ์ด๋ฐ ๊ณ ์์ค์ ๊ทธ๋ฆผ์ ๋จธ๋ฆฟ์์ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ์ ์ฉํฉ๋๋ค!
+
+## ์๋ฒ-ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ๊ตฌ๋ถ
+
+๋จผ์ , ์๋ฒ ์ปดํฌ๋ํธ๋ ๋ฌด์์ผ๊น์? ๊ทธ๋ฆฌ๊ณ ์ด๋ค ์ปดํฌ๋ํธ๊ฐ "์๋ฒ์ฉ"์ด๊ณ ์ด๋ค ๊ฒ์ด "ํด๋ผ์ด์ธํธ์ฉ"์ธ์ง ์ด๋ป๊ฒ ๊ตฌ๋ถํ ์ ์์๊น์?
+
+๋ฆฌ์กํธ ํ์ ์ปดํฌ๋ํธ๊ฐ ์์ฑ๋ ํ์ผ์ ํ์ฅ์์ ๋ฐ๋ผ ์ด๋ฅผ ์ ์ํ์ต๋๋ค.
+
+ํ์ผ์ด `.server.jsx`๋ก ๋๋๋ฉด ๊ทธ ํ์ผ์๋ ์๋ฒ ์ปดํฌ๋ํธ๊ฐ ํฌํจ๋์ด ์๊ณ , `.client.jsx`๋ก ๋๋๋ฉด ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
+
+ํ์ฅ์๊ฐ ๋ ๋ค ์๋ ๊ฒฝ์ฐ, ๊ทธ ํ์ผ์๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๋ชจ๋์์ ์ฌ์ฉํ ์ ์๋ ์ปดํฌ๋ํธ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
+
+์ด ์ ์๋ ์ค์ฉ์ ์
๋๋ค.
+
+์ฌ๋๋ค๊ณผ ๋ฒ๋ค๋ฌ ๋ชจ๋๊ฐ ์๋ฒ ์ปดํฌ๋ํธ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ฒ ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
+
+ํนํ ๋ฒ๋ค๋ฌ๋ ํ์ผ ์ด๋ฆ์ ๊ฒ์ฌํ์ฌ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
+
+๊ณง ์๊ฒ ๋๊ฒ ์ง๋ง, ๋ฒ๋ค๋ฌ๋ ๋ฆฌ์กํธ ์๋ฒ ์ปดํฌ๋ํธ(RSC)๋ฅผ ์๋์ํค๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
+
+์๋ฒ ์ปดํฌ๋ํธ๋ ์๋ฒ์์ ์คํ๋๊ณ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ ํด๋ผ์ด์ธํธ์์ ์คํ๋๊ธฐ ๋๋ฌธ์, ๊ฐ ์ปดํฌ๋ํธ๊ฐ ํ ์ ์๋ ๊ฒ์๋ ๋ง์ ์ ํ์ด ์์ต๋๋ค.
+
+๊ฐ์ฅ ์ค์ํ ๊ฒ์ **ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๊ฐ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค๋ ์ **์
๋๋ค.
+
+์๋ฒ ์ปดํฌ๋ํธ๋ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋ ์ ์์ผ๋ฉฐ, ๋ธ๋ผ์ฐ์ ์์ ์๋ํ์ง ์๋ ์ฝ๋๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค.
+
+ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๊ฐ ์๋ฒ ์ปดํฌ๋ํธ์ ์์กดํ๊ฒ ๋๋ฉด, ๋ธ๋ผ์ฐ์ ๋ฒ๋ค์ ์ด๋ฌํ ํ์ฉ ๋์ง ์๋ ์์กด์ฑ์ ๋์ด์ค๊ฒ ๋ฉ๋๋ค.
+
+์ด ๋ง์ง๋ง ๋ถ๋ถ์ ํท๊ฐ๋ฆด ์ ์์ต๋๋ค.
+
+์ด๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ์ปดํฌ๋ํธ ํ์์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
+
+```tsx
+// ClientComponent.client.jsx
+// NOT OK:
+import ServerComponent from "./ServerComponent.server";
+export default function ClientComponent() {
+ return (
+
+
+
+ );
+}
+```
+
+ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๊ฐ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ importํ ์ ์๊ณ , ๋ฐ๋ผ์ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์ธ์คํด์คํํ ์ ์๋๋ฐ, ์ด๋ป๊ฒ ์๋ฒ ์ปดํฌ๋ํธ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๊ฐ ์์ฌ ์๋ React ํธ๋ฆฌ๊ฐ ์๊ธธ ์ ์๋์?
+
+์ด๋ป๊ฒ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ(ํ๋ ์ ) ์๋์ ์๋ฒ ์ปดํฌ๋ํธ(์ฃผํฉ ์ )๊ฐ ์์ ์ ์๋์?
+
+![](https://www.plasmic.app/blog/static/images/react-server-components.png)
+
+ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๊ฐ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ importํ๊ณ ๋ ๋๋งํ ์๋ ์์ง๋ง, ์ฌ์ ํ ์ปดํฌ์ง์
์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+์ฆ, ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ ๋ถํฌ๋ช
ํ `ReactNode` ํํ์ `props`๋ฅผ ๋ฐ์ ์ ์์ผ๋ฉฐ, ์ด ReactNode๋ ์๋ฒ ์ปดํฌ๋ํธ์ ์ํด ๋ ๋๋ง๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด:
+
+```tsx
+// ClientComponent.client.jsx
+export default function ClientComponent({ children }) {
+ return (
+
+
Hello from client land
+ {children}
+
+ );
+}
+
+// ServerComponent.server.jsx
+export default function ServerComponent() {
+ return Hello from server land;
+}
+
+// OuterServerComponent.server.jsx
+// OuterServerComponent๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ๋ชจ๋ ์ธ์คํด์คํํ ์ ์์ผ๋ฉฐ,
+// ๋ฅผ ClientComponent์ children prop์ผ๋ก ์ ๋ฌํ๊ณ ์์ต๋๋ค.
+
+import ClientComponent from "./ClientComponent.client";
+import ServerComponent from "./ServerComponent.server";
+export default function OuterServerComponent() {
+ return (
+
+
+
+ );
+}
+```
+
+์ด ์ ํ์ RSC๋ฅผ ๋ ์ ํ์ฉํ๊ธฐ ์ํด ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ์์ ํฐ ์ํฅ์ ๋ฏธ์น ๊ฒ์
๋๋ค.
+
+## - RSC ๋ ๋๋ง์ ๊ณผ์
+
+React ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ ค๊ณ ํ ๋ ์ค์ ๋ก ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
+
+์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ฌ๊ธฐ์ ๋ชจ๋ ๊ฒ์ ์ดํดํ ํ์๋ ์์ง๋ง, ์๋ ๋ฐฉ์์ ์ง๊ด์ ์ผ๋ก ์ดํดํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์
๋๋ค.
+
+## 1. ์๋ฒ๊ฐ ๋ ๋๋ง ์์ฒญ์ ๋ฐ์
+
+์๋ฒ๋ ์ผ๋ถ ๋ ๋๋ง์ ์ํํด์ผ ํ๋ฏ๋ก RSC๋ฅผ ์ฌ์ฉํ๋ ํ์ด์ง์ ์์์ ํญ์ ์๋ฒ์์ ์์๋ฉ๋๋ค.
+
+์ด๋ React ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๊ธฐ ์ํ API ํธ์ถ์ ๋ํ ์๋ต์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค.
+
+์ด "๋ฃจํธ" ์ปดํฌ๋ํธ๋ ํญ์ ์๋ฒ ์ปดํฌ๋ํธ์ด๋ฉฐ, ์ด๋ ๋ค๋ฅธ ์๋ฒ ๋๋ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ์ ์์ต๋๋ค.
+
+์๋ฒ๋ ์์ฒญ์ ์ ๋ฌ๋ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ค ์๋ฒ ์ปดํฌ๋ํธ์ ์ด๋ค props๋ฅผ ์ฌ์ฉํ ์ง ๊ฒฐ์ ํฉ๋๋ค.
+
+์ด ์์ฒญ์ ์ผ๋ฐ์ ์ผ๋ก ํน์ URL์ ํ์ด์ง ์์ฒญ ํํ๋ก ๋ค์ด์ค์ง๋ง, Shopify Hydrogen์ ๋ [์ธ๋ถํ๋ ๋ฐฉ๋ฒ](https://shopify.github.io/hydrogen-v1/tutorials/server-props)์ ์ ๊ณตํ๋ฉฐ, React ํ์ ๊ณต์ ๋ฐ๋ชจ์๋ [์์ ๊ตฌํ](https://github.com/reactjs/server-components-demo/blob/main/server/api.server.js)์ด ํฌํจ๋์ด ์์ต๋๋ค.
+
+## 2. ์๋ฒ๊ฐ ๋ฃจํธ ์ปดํฌ๋ํธ ์์๋ฅผ JSON์ผ๋ก ์ง๋ ฌํํจ
+
+์ฌ๊ธฐ์ ์ต์ข
๋ชฉํ๋ ์ด๊ธฐ ๋ฃจํธ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ๊ธฐ๋ณธ HTML ํ๊ทธ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ "ํ๋ ์ด์คํ๋"์ ํธ๋ฆฌ๋ก ๋ ๋๋งํ๋ ๊ฒ์
๋๋ค.
+
+๊ทธ๋ฐ ๋ค์ ์ด ํธ๋ฆฌ๋ฅผ ์ง๋ ฌํํ์ฌ ๋ธ๋ผ์ฐ์ ๋ก ๋ณด๋ด๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฅผ ์ญ์ง๋ ฌํํ๊ณ ํด๋ผ์ด์ธํธ ํ๋ ์ด์คํ๋๋ฅผ ์ค์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก ์ฑ์ ์ต์ข
๊ฒฐ๊ณผ๋ฅผ ๋ ๋๋งํฉ๋๋ค.
+
+๋ฐ๋ผ์, ์์ ์๋ฅผ ๋ฐ๋ฅด๋ฉด โ ``๋ฅผ ๋ ๋๋งํ๋ ค๊ณ ํ๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค.
+
+์ง๋ ฌํ๋ ์์ ํธ๋ฆฌ๋ฅผ ์ป๊ธฐ ์ํด ๋จ์ํ JSON.stringify(``)๋ฅผ ์ฌ์ฉํ ์ ์์๊น์?
+
+๊ฑฐ์ ๋ง์ง๋ง, ์์ ํ ๊ทธ๋ ์ง๋ ์์ต๋๋ค! ๐
React ์์๊ฐ ์ค์ ๋ก ๋ฌด์์ธ์ง ์๊ธฐํด ๋ด
์๋ค โ React ์์๋ ๊ฐ์ฒด๋ก, type ํ๋๋ ๊ธฐ๋ณธ HTML ํ๊ทธ๋ฅผ ์ํ ๋ฌธ์์ด("div"์ ๊ฐ์) ๋๋ React ์ปดํฌ๋ํธ ์ธ์คํด์ค๋ฅผ ์ํ ํจ์์
๋๋ค.
+
+```ts
+// React element for oh my
+> React.createElement("div", { title: "oh my" })
+{
+ $$typeof: Symbol(react.element),
+ type: "div",
+ props: { title: "oh my" },
+ ...
+}
+
+// React element for oh my
+> function MyComponent({children}) {
+ return {children}
;
+ }
+> React.createElement(MyComponent, { children: "oh my" });
+{
+ $$typeof: Symbol(react.element),
+ type: MyComponent // reference to the MyComponent function
+ props: { children: "oh my" },
+ ...
+}
+```
+
+์ฐ๋ฆฌ๊ฐ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ํจ์์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ง๋ ฌํ ๊ฐ๋ฅํ โ๋ชจ๋ ์ฐธ์กฐโ ๊ฐ์ฒด๋ก ๋ณํํ๋ ์ด ์์
์ ์ด๋์ ๋ฐ์ํ๊ณ ์์ต๋๊น?
+
+๊ฒฐ๊ตญ, ์ด ๋ง์ ์ ์ํํ๋ ๊ฒ์ ๋ฒ๋ค๋ฌ์
๋๋ค! React ํ์ `react-server-dom-webpack`์์ [webpack ๋ก๋](https://github.com/facebook/react/blob/main/packages/react-server-dom-webpack/src/ReactFlightWebpackNodeLoader.js) ๋๋ [node-register](https://github.com/facebook/react/blob/main/packages/react-server-dom-webpack/src/ReactFlightWebpackNodeRegister.js)๋ก ๊ณต์ RSC ์ง์์ ๋ฐํํ์ต๋๋ค.
+
+์๋ฒ ์ปดํฌ๋ํธ๊ฐ \*.client.jsx ํ์ผ์์ ๋ฌด์ธ๊ฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋ ์ค์ ๋ก ๊ทธ ํญ๋ชฉ์ ๊ฐ์ ธ์ค๋ ๋์ ํ์ผ ์ด๋ฆ๊ณผ ๋ด๋ณด๋ธ ์ด๋ฆ์ ํฌํจํ๋ ๋ชจ๋ ์ฐธ์กฐ ๊ฐ์ฒด๋ง ๊ฐ์ ธ์ต๋๋ค.
+
+ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ํจ์๋ ์๋ฒ์์ ๊ตฌ์ฑ๋ React ํธ๋ฆฌ์ ์ผ๋ถ๊ฐ ์๋๋๋ค!
+
+๋ค์ ์์ ์์ ๋ฅผ ๊ณ ๋ คํด๋ณด๋ฉด, ์ฐ๋ฆฌ๊ฐ ``๋ฅผ ์ง๋ ฌํํ๋ ค๊ณ ํ ๋, ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ JSON ํธ๋ฆฌ๋ฅผ ์ป๊ฒ ๋ฉ๋๋ค:
+
+```ts
+{
+ // "๋ชจ๋ ์ฐธ์กฐ"๊ฐ ์๋ ClientComponent ์์ ํ๋ ์ด์คํ๋
+
+ type: {
+ $$typeof: Symbol(react.module.reference),
+ name: 'default',
+ filename: './src/ClientComponent.client.js',
+ },
+ props: {
+ // ClientComponent์ ์ ๋ฌ๋ ์์, ์ฆ .
+ children: {
+ // ServerComponent๊ฐ ์ง์ html ํ๊ทธ๋ก ๋ ๋๋ง๋จ;
+ // ServerComponent์ ๋ํ ์ฐธ์กฐ๊ฐ ์ ํ ์์์ ์ฃผ๋ชฉํ์ธ์.
+ // ์ฐ๋ฆฌ๋ ์ง์ `span`์ ๋ ๋๋งํ๊ณ ์์ต๋๋ค.
+ $$typeof: Symbol(react.element),
+ type: 'span',
+ props: {
+ children: 'Hello from server land',
+ },
+ },
+ },
+};
+
+```
+
+### ์ง๋ ฌํ ๊ฐ๋ฅํ React ํธ๋ฆฌ
+
+์ด ๊ณผ์ ์ด ๋๋๋ฉด, ์๋ฒ์์ ๋ค์๊ณผ ๊ฐ์ React ํธ๋ฆฌ๋ฅผ ์ป๊ฒ ๋๊ณ , ์ด๋ฅผ ๋ธ๋ผ์ฐ์ ๋ก ๋ณด๋ด "๋ง๋ฌด๋ฆฌ"๋ฅผ ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค:
+
+![](https://www.plasmic.app/blog/static/images/react-server-components-placeholders.png)
+
+## ๋ชจ๋ props๋ ์ง๋ ฌํ๊ฐ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค
+
+์ ์ฒด React ํธ๋ฆฌ๋ฅผ JSON์ผ๋ก ์ง๋ ฌํํ๊ธฐ ๋๋ฌธ์, ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ ๊ธฐ๋ณธ html ํ๊ทธ์ ์ ๋ฌํ๋ ๋ชจ๋ props๋ ์ง๋ ฌํ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค.
+
+์ด๋ ์๋ฒ ์ปดํฌ๋ํธ์์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ prop์ผ๋ก ์ ๋ฌํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค!
+
+```ts
+// NOT OK: ํจ์๋ ์ง๋ ฌํ ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ฒ์ปดํฌ๋ํธ๋
+// ์์์๊ฒ ํจ์๋ฅผ props๋ก ๋๊ธธ ์ ์์ต๋๋ค.
+function SomeServerComponent() {
+ return ;
+}
+```
+
+ํ์ง๋ง ์ฌ๊ธฐ์ ์ฃผ๋ชฉํ ์ ์ RSC ๊ณผ์ ์ค์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ฉด, ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ํจ์๋ฅผ ํธ์ถํ๊ฑฐ๋ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ๋ด๋ถ๋ก ๋ค์ด๊ฐ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค.
+
+๋ฐ๋ผ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๊ฐ ๋ ๋ค๋ฅธ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ์ธ์คํด์คํํ๋ ๊ฒฝ์ฐ:
+
+```tsx
+function SomeServerComponent() {
+ return Hello world!;
+}
+
+function ClientComponent1({children}) {
+ // ํด๋ผ์ด์ธํธ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ props๋ก ํจ์๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ๊ฐ๋ฅํฉ๋๋ค.
+ return {children};
+}
+```
+
+ClientComponent2๋ ์ด RSC JSON ํธ๋ฆฌ์ ์ ํ ๋ํ๋์ง ์์ต๋๋ค.
+
+๋์ , ์ฐ๋ฆฌ๋ ClientComponent1์ ๋ํ ๋ชจ๋ ์ฐธ์กฐ์ props๊ฐ ์๋ ์์๋ง ๋ณด๊ฒ ๋ฉ๋๋ค.
+
+๋ฐ๋ผ์ ClientComponent1์ด ClientComponent2์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ prop์ผ๋ก ์ ๋ฌํ๋ ๊ฒ์ ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
+
+## 3. ๋ธ๋ผ์ฐ์ ์์ React ํธ๋ฆฌ ์ฌ๊ตฌ์ฑ
+
+๋ธ๋ผ์ฐ์ ๋ ์๋ฒ๋ก๋ถํฐ JSON ์ถ๋ ฅ์ ๋ฐ์, ์ด์ ๋ธ๋ผ์ฐ์ ์์ ๋ ๋๋ง๋ React ํธ๋ฆฌ๋ฅผ ์ฌ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
+
+`ํ์
`์ด ๋ชจ๋ ์ฐธ์กฐ์ธ ์์๋ฅผ ๋ง๋ ๋๋ง๋ค, ์ด๋ฅผ ์ค์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ํจ์์ ์ฐธ์กฐ๋ก ๊ต์ฒดํด์ผ ํฉ๋๋ค.
+
+์ด ์์
์๋ ๋ฒ๋ค๋ฌ์ ๋์์ด ๋ค์ ํ์ํฉ๋๋ค.
+
+๋ฒ๋ค๋ฌ๊ฐ ์๋ฒ์์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ํจ์๋ฅผ ๋ชจ๋ ์ฐธ์กฐ๋ก ๊ต์ฒดํ์ผ๋ฉฐ, ์ด์ ๋ธ๋ผ์ฐ์ ์์ ๋ชจ๋ ์ฐธ์กฐ๋ฅผ ์ค์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ํจ์๋ก ๊ต์ฒดํ๋ ๋ฐฉ๋ฒ์ ์๋ ๊ฒ๋ ๋ฒ๋ค๋ฌ์
๋๋ค.
+
+์ฌ๊ตฌ์ฑ๋ React ํธ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ๊ฒ์
๋๋ค โ ๋ค์ดํฐ๋ธ ํ๊ทธ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ง ๊ต์ฒด๋ ์ํ๋ก:
+
+![](https://www.plasmic.app/blog/static/images/react-server-components-client.png)
+
+๊ทธ๋ฐ ๋ค์ ์ฐ๋ฆฌ๋ ์ด ํธ๋ฆฌ๋ฅผ ํ์์ ๊ฐ์ด DOM์ ๋ ๋๋งํ๊ณ ์ปค๋ฐํ๋ฉด ๋ฉ๋๋ค!
+
+## ๊ทธ๋ฐ๋ฐ ์ด๊ฒ์ด Suspense์ ํจ๊ป ์๋ํ ๊น์?
+
+๋ค! Suspense๋ ์์ ๋ชจ๋ ๋จ๊ณ์์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
+
+์ด ๊ธ์์๋ Suspense์ ๋ํด ์๋์ ์ผ๋ก ์์ธํ ๋ค๋ฃจ์ง ์์์ต๋๋ค.
+
+Suspense ์์ฒด๊ฐ ๋งค์ฐ ํฐ ์ฃผ์ ์ด๋ฉฐ, ๋ณ๋์ ๋ธ๋ก๊ทธ ํฌ์คํธ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
+
+ํ์ง๋ง ๊ฐ๋จํ ๋งํ์๋ฉด โ Suspense๋ React ์ปดํฌ๋ํธ๊ฐ ์์ง ์ค๋น๋์ง ์์ ๋ฌด์ธ๊ฐ๋ฅผ ํ์๋ก ํ ๋(๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋, ์ปดํฌ๋ํธ๋ฅผ ์ง์ฐ ๋ก๋ํ๋ ๋ฑ) Promise๋ฅผ ๋์ง ์ ์๊ฒ ํด์ค๋๋ค.
+
+์ด๋ฌํ Promise๋ "Suspense ๊ฒฝ๊ณ"์์ ์กํ๋ฉฐ โ Suspense ํ์ ํธ๋ฆฌ์ ๋ ๋๋ง์์ Promise๊ฐ ๋์ ธ์ง๋ฉด, React๋ ํด๋น Promise๊ฐ ํด๊ฒฐ๋ ๋๊น์ง ํด๋น ํ์ ํธ๋ฆฌ์ ๋ ๋๋ง์ ์ค์งํ๊ณ , ์ดํ ๋ค์ ์๋ํฉ๋๋ค.
+
+์๋ฒ์์ RSC ์ถ๋ ฅ์ ์์ฑํ๊ธฐ ์ํด ์๋ฒ ์ปดํฌ๋ํธ ํจ์๋ฅผ ํธ์ถํ ๋, ํด๋น ํจ์๋ค์ด ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ฉด์ Promise๋ฅผ ๋์ง ์ ์์ต๋๋ค.
+
+์ด๋ฌํ [Promise๋ฅผ ๋ง๋ฌ์ ๋](https://github.com/facebook/react/blob/42c30e8b122841d7fe72e28e36848a6de1363b0c/packages/react-server/src/ReactFlightServer.js#L416)๋ ํ๋ ์ด์คํ๋๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
+
+Promise๊ฐ ํด๊ฒฐ๋๋ฉด ์๋ฒ ์ปดํฌ๋ํธ ํจ์๋ฅผ ๋ค์ ํธ์ถํ์ฌ ์๋ฃ๋ ์ฒญํฌ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
+
+์ฐ๋ฆฌ๋ ์ค์ ๋ก RSC ์ถ๋ ฅ์ ์คํธ๋ฆผ์ ์์ฑํ๊ณ ์์ผ๋ฉฐ, Promise๊ฐ ๋์ ธ์ง ๋ ๋ฉ์ถ๊ณ , ํด๊ฒฐ๋๋ฉด ์ถ๊ฐ ์ฒญํฌ๋ฅผ ์คํธ๋ฆฌ๋ฐํฉ๋๋ค.
+
+๋ง์ฐฌ๊ฐ์ง๋ก, ๋ธ๋ผ์ฐ์ ์์๋ ์์ `fetch()` ํธ์ถ๋ก๋ถํฐ RSC JSON ์ถ๋ ฅ์ ์คํธ๋ฆฌ๋ฐํฉ๋๋ค.
+
+์ด ๊ณผ์ ์์๋ ์ถ๋ ฅ์์ ์์คํ์ค ํ๋ ์ด์คํ๋(์๋ฒ์์ Promise๊ฐ ๋์ ธ์ง ๋ถ๋ถ)๋ฅผ ๋ง๋๊ณ , ์์ง ์คํธ๋ฆผ์์ ํด๋น ํ๋ ์ด์คํ๋ ๋ด์ฉ์ ๋ณด์ง ๋ชปํ ๊ฒฝ์ฐ Promise๋ฅผ ๋์ง ์ ์์ต๋๋ค(์ฌ๊ธฐ์๋ ์ฝ๊ฐ์ [์ธ๋ถ ์ฌํญ](https://github.com/facebook/react/blob/main/packages/react-client/src/ReactFlightClientStream.js)์ด ์์ต๋๋ค).
+
+๋ํ, ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ๋ชจ๋ ์ฐธ์กฐ๋ฅผ ๋ง๋์ง๋ง ๋ธ๋ผ์ฐ์ ์ ํด๋น ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ํจ์๊ฐ ์์ง ๋ก๋๋์ง ์์ ๊ฒฝ์ฐ์๋ Promise๋ฅผ ๋์ง ์ ์์ต๋๋ค.
+
+์ด ๊ฒฝ์ฐ ๋ฒ๋ค๋ฌ ๋ฐํ์์ด ํ์ํ [์ฒญํฌ๋ฅผ ๋์ ์ผ๋ก ๊ฐ์ ธ์์ผ ํฉ๋๋ค.](https://github.com/facebook/react/blob/main/packages/react-server-dom-webpack/src/ReactFlightClientWebpackBundlerConfig.js)
+
+Suspense ๋๋ถ์ ์๋ฒ๋ ์๋ฒ ์ปดํฌ๋ํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋์ RSC ์ถ๋ ฅ์ ์คํธ๋ฆฌ๋ฐํ ์ ์์ผ๋ฉฐ, ๋ธ๋ผ์ฐ์ ๋ ๋ฐ์ดํฐ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํด์ง ๋๋ง๋ค ์ ์ง์ ์ผ๋ก ๋ ๋๋งํ๊ณ , ํ์์ ๋ฐ๋ผ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ๋ฒ๋ค์ ๋์ ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
+
+# RSC ์์ด์ด ํฌ๋งท
+
+ํ์ง๋ง ์๋ฒ๊ฐ ์ ํํ ๋ฌด์์ ์ถ๋ ฅํ๋ ๊ฒ์ผ๊น์? "JSON"๊ณผ "์คํธ๋ฆผ"์ด๋ผ๋ ๋จ์ด๋ฅผ ์ฝ๊ณ ์์ํ๊ฒ ์ฌ๊ฒผ๋ค๋ฉด, ๋๋ฌด ๋น์ฐํฉ๋๋ค!
+
+๊ทธ๋ ๋ค๋ฉด ์๋ฒ๊ฐ ๋ธ๋ผ์ฐ์ ๋ก ์คํธ๋ฆฌ๋ฐํ๋ ๋ฐ์ดํฐ๋ ๋ฌด์์ผ๊น์?
+
+์ด๊ฒ์ ๊ฐ๋จํ ํฌ๋งท์ผ๋ก, ๊ฐ ์ค์ ID๊ฐ ํ๊ทธ๋ ํ๋์ JSON ๋ธ๋กญ์ด ์์ต๋๋ค.
+
+๋ค์์ ์์ ์ RSC ์ถ๋ ฅ์
๋๋ค:
+
+```
+M1:{"id":"./src/ClientComponent.client.js","chunks":["client1"],"name":""}
+J0:["$","@1",null,{"children":["$","span",null,{"children":"Hello from server land"}]}]
+```
+
+์์ ์ฝ๋ ์กฐ๊ฐ์์ `M`์ผ๋ก ์์ํ๋ ์ค์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ๋ชจ๋ ์ฐธ์กฐ๋ฅผ ์ ์ํ๋ฉฐ, ํด๋ผ์ด์ธํธ ๋ฒ๋ค์์ ์ปดํฌ๋ํธ ํจ์๋ฅผ ์ฐพ๋ ๋ฐ ํ์ํ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค.
+
+`J`๋ก ์์ํ๋ ์ค์ ์ค์ React ์์ ํธ๋ฆฌ๋ฅผ ์ ์ํ๋ฉฐ, `@1`๊ณผ ๊ฐ์ ์ฐธ์กฐ๋ `M` ์ค์์ ์ ์๋ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
+
+์ด ํฌ๋งท์ ๋งค์ฐ ์คํธ๋ฆฌ๋ฐ ๊ฐ๋ฅํ์ฌ, ํด๋ผ์ด์ธํธ๊ฐ ์ ์ฒด ํ์ ์ฝ๋ ์ฆ์ JSON ์กฐ๊ฐ์ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ์ผ๋ถ ์์
์ ์งํํ ์ ์์ต๋๋ค.
+
+์๋ฒ๊ฐ ๋ ๋๋ง ์ค์ ์์คํ์ค ๊ฒฝ๊ณ๋ฅผ ๋ง๋ฌ๋ค๋ฉด, ๊ฐ ์ฒญํฌ๊ฐ ํด๊ฒฐ๋ ๋๋ง๋ค ์ฌ๋ฌ `J` ์ค์ ๋ณผ ์ ์์ต๋๋ค.
+
+์๋ฅผ ๋ค์ด์, ๋์ฑ ๊ตฌ์ฒด์ ์ธ ์๋ฅผ ํ๋ ๋ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
+
+```tsx
+// Tweets.server.js
+import { fetch } from "react-fetch"; // React's Suspense-aware fetch()
+import Tweet from "./Tweet.client";
+export default function Tweets() {
+ const tweets = fetch(`/tweets`).json();
+ return (
+
+ {tweets.slice(0, 2).map((tweet) => (
+ -
+
+
+ ))}
+
+ );
+}
+
+// Tweet.client.js
+export default function Tweet({ tweet }) {
+ return (
+ alert(`Written by ${tweet.username}`)}>
+ {tweet.body}
+
+ );
+}
+
+// OuterServerComponent.server.js
+export default function OuterServerComponent() {
+ return (
+
+
+
+
+
+
+ );
+}
+```
+
+์ด ๊ฒฝ์ฐ์์ RSC ์คํธ๋ฆผ์ด ์ด๋ป๊ฒ ๋ ๊น์?
+
+```
+M1:{"id":"./src/ClientComponent.client.js","chunks":["client1"],"name":""}
+S2:"react.suspense"
+
+J0:["$","@1",null,{"children":[["$","span",null,{"children":"Hello from server land"}],["$","$2",null,{"fallback":"Loading tweets...","children":"@3"}]]}]
+
+M4:{"id":"./src/Tweet.client.js","chunks":["client8"],"name":""}
+
+J3:["$","ul",null,{"children":[["$","li",null,{"children":["$","@4",null,{"tweet":{...}}}]}],["$","li",null,{"children":["$","@4",null,{"tweet":{...}}}]}]]}]
+```
+
+`J0` ์ค์๋ ์ด์ ์ถ๊ฐ ์์์ด ์์ต๋๋ค โ ์๋ก์ด `Suspense` ๊ฒฝ๊ณ๋ก, `children`์ด ์ฐธ์กฐ @3์ ๊ฐ๋ฆฌํค๊ณ ์์ต๋๋ค.
+
+์ฌ๊ธฐ์ ํฅ๋ฏธ๋ก์ด ์ ์ `@3`์ด ์ด ์์ ์์๋ ์์ง ์ ์๋์ง ์์๋ค๋ ๊ฒ์
๋๋ค!
+
+์๋ฒ๊ฐ ํธ์์ ๋ก๋ํ๋ ์์
์ ์๋ฃํ๋ฉด, `M4` ์ค์ ์ถ๋ ฅํ์ฌ `Tweet.client.js` ์ปดํฌ๋ํธ์ ๋ํ ๋ชจ๋ ์ฐธ์กฐ๋ฅผ ์ ์ํ๊ณ , `J3` ์ค์ ์ถ๋ ฅํ์ฌ` @3`์ด ์๋ ์์น์ ๊ต์ฒด๋ ๋ ๋ค๋ฅธ React ์์ ํธ๋ฆฌ๋ฅผ ์ ์ํฉ๋๋ค.
+(๋ํ `J3`์ ์์์ด `M4`์์ ์ ์๋ `Tweet` ์ปดํฌ๋ํธ๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ค๋ ์ ์ ์ฃผ๋ชฉํ์ธ์).
+
+์ฌ๊ธฐ์ ์ฃผ๋ชฉํ ๋ ๋ค๋ฅธ ์ ์, ๋ฒ๋ค๋ฌ๊ฐ `ClientComponent`์ `Tweet`์ ์๋์ผ๋ก ๋ ๊ฐ์ ๋ณ๋ ๋ฒ๋ค๋ก ๋ถ๋ฆฌํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ `Tweet` ๋ฒ๋ค์ ๋์ค์ ๋ค์ด๋ก๋ํ ์ ์๋๋ก ํ๋ค๋ ๊ฒ์
๋๋ค!
+
+## RSC ํฌ๋งท ์๋นํ๊ธฐ
+
+์ด RSC ์คํธ๋ฆผ์ ๋ธ๋ผ์ฐ์ ์์ ์ค์ React ์์๋ก ์ด๋ป๊ฒ ๋ณํํ ์ ์์๊น์? `react-server-dom-webpack`์๋ RSC ์๋ต์ ๋ฐ์์ React ์์ ํธ๋ฆฌ๋ฅผ ์ฌ์์ฑํ๋ [์ง์
์ ](https://github.com/facebook/react/blob/main/packages/react-server-dom-webpack/src/ReactFlightDOMClient.js)์ด ํฌํจ๋์ด ์์ต๋๋ค.
+
+๋ค์์ ๋ฃจํธ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ ๋จ์ํ๋ ๋ฒ์ ์
๋๋ค:
+
+```ts
+import { createFromFetch } from 'react-server-dom-webpack'
+function ClientRootComponent() {
+ // ์ฐ๋ฆฌ์ RSC API ์๋ํฌ์ธํธ์์ fetch()๋ฅผ ํธ์ถํฉ๋๋ค. react-server-dom-webpack์
+ // fetch ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ React ์์ ํธ๋ฆฌ๋ฅผ ์ฌ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
+ const response = createFromFetch(fetch('/rsc?...'))
+ return {response.readRoot() /* React ์์๋ฅผ ๋ฐํํฉ๋๋ค! */}
+}
+```
+
+`react-server-dom-webpack`์๊ฒ API ์๋ํฌ์ธํธ์์ RSC ์๋ต์ ์ฝ๋๋ก ์์ฒญํฉ๋๋ค.
+
+๊ทธ๋ฐ ๋ค์, `response.readRoot()`๋ ์๋ต ์คํธ๋ฆผ์ด ์ฒ๋ฆฌ๋จ์ ๋ฐ๋ผ ์
๋ฐ์ดํธ๋๋ React ์์๋ฅผ ๋ฐํํฉ๋๋ค!
+
+์คํธ๋ฆผ์ด ์ ํ ์ฝํ์ง ์์ ์ํ์์๋ ๋ด์ฉ์ด ์ค๋น๋์ง ์์๊ธฐ ๋๋ฌธ์ ์ฆ์ Promise๋ฅผ ๋์ง๋๋ค.
+
+๊ทธ๋ฐ ๋ค์ ์ฒซ ๋ฒ์งธ `J0`๋ฅผ ์ฒ๋ฆฌํ๋ฉด์ ํด๋นํ๋ React ์์ ํธ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ๋์ ธ์ง Promise๋ฅผ ํด๊ฒฐํฉ๋๋ค.
+
+React๋ ๋ ๋๋ง์ ์ฌ๊ฐํ์ง๋ง ์์ง ์ค๋น๋์ง ์์ `@3` ์ฐธ์กฐ๋ฅผ ๋ง๋๋ฉด ๋ ๋ค๋ฅธ Promise๊ฐ ๋์ ธ์ง๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ `J3`์ ์ฝ์ผ๋ฉด ๊ทธ Promise๊ฐ ํด๊ฒฐ๋๊ณ , React๋ ๋ค์ ๋ ๋๋ง์ ์ฌ๊ฐํ์ฌ ์ด๋ฒ์๋ ์๋ฃ๋ฉ๋๋ค.
+
+๋ฐ๋ผ์ RSC ์๋ต์ ์คํธ๋ฆฌ๋ฐํ๋ ๋์ ์ฐ๋ฆฌ๋ Suspense ๊ฒฝ๊ณ๋ก ์ ์๋ ์ฒญํฌ์์ ์์ ํธ๋ฆฌ๋ฅผ ๊ณ์ ์
๋ฐ์ดํธํ๊ณ ๋ ๋๋งํ๊ฒ ๋๋ฉฐ, ๋๋ ๋๊น์ง ์ด ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค.
+
+## ์ ๋จ์ํ HTML์ ์ถ๋ ฅํ์ง ์์๊น์?
+
+์ ์๋ก์ด ์์ด์ด ํฌ๋งท์ ๋ฐ๋ช
ํ์๊น์? ํด๋ผ์ด์ธํธ์ ๋ชฉํ๋ React ์์ ํธ๋ฆฌ๋ฅผ ์ฌ๊ตฌ์ฑํ๋ ๊ฒ์
๋๋ค.
+
+HTML์ ๊ตฌ๋ฌธ ๋ถ์ํ์ฌ React ์์๋ฅผ ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ๋ณด๋ค ์ด ํฌ๋งท์ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ฝ์ต๋๋ค.
+
+React ์์ ํธ๋ฆฌ๋ฅผ ์ฌ๊ตฌ์ฑํ๋ ๊ฒ์ด ์ค์ํ ์ด์ ๋, ์ด๋ฅผ ํตํด React ํธ๋ฆฌ์ ๋ํ ํ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ต์ํ์ DOM ์ปค๋ฐ์ผ๋ก ๋ณํฉํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
+
+## ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ๋ณด๋ค ์ด๊ฒ์ด ๋ ๋์๊ฐ์?
+
+์ด์ฐจํผ ์ด ์ฝํ
์ธ ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์๋ฒ์ API ์์ฒญ์ ํด์ผ ํ๋ค๋ฉด, ์ค๋๋ ์ฒ๋ผ ๋จ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ํด๋ผ์ด์ธํธ์์ ๋ ๋๋ง์ ์์ ํ ์ํํ๋ ๊ฒ๋ณด๋ค ์ด ๋ฐฉ๋ฒ์ด ์ ๋ง ๋ ๋์๊ฐ์?
+
+๊ถ๊ทน์ ์ผ๋ก, ํ๋ฉด์ ๋ฌด์์ ๋ ๋๋งํ๋๋์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค.
+
+RSC๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค ๋ด์ฉ์ ์ง์ ์ ์ผ๋ก ๋งคํ๋๋ ๋น์ ๊ทํ๋ "์ฒ๋ฆฌ๋" ๋ฐ์ดํฐ๋ฅผ ์ป์ ์ ์์ผ๋ฏ๋ก, ๊ฐ์ ธ์ฌ ๋ฐ์ดํฐ์ ์์ ๋ถ๋ถ๋ง ๋ ๋๋งํ๊ฑฐ๋ ๋ ๋๋ง ์์ฒด์ ๋ง์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ํ์ํ์ฌ ๋ธ๋ผ์ฐ์ ๋ก ๋ค์ด๋ก๋ํ๋ ๊ฒ์ ํผํ๊ณ ์ถ์ ๊ฒฝ์ฐ์ ์ ๋ฆฌํฉ๋๋ค.
+
+๋ํ ๋ ๋๋ง์ด ์ฌ๋ฌ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ํ์๋ก ํ๊ณ , ์ด ๊ฐ์ ธ์ค๊ธฐ๊ฐ ๊ณ๋จ์์ผ๋ก ์๋ก ์์กดํ๋ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ ์ง์ฐ์ด ํจ์ฌ ๋ฎ์ ์๋ฒ์์ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ๋ธ๋ผ์ฐ์ ์์ ๊ฐ์ ธ์ค๋ ๊ฒ๋ณด๋ค ๋ ์ข์ต๋๋ค.
+
+## ํ์ง๋งโฆ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์์?
+
+์๊ณ ์์ต๋๋ค.
+
+React 18์ ์ฌ์ฉํ๋ฉด SSR๊ณผ RSC๋ฅผ ๊ฒฐํฉํ์ฌ ์๋ฒ์์ HTML์ ์์ฑํ๊ณ , ๋ธ๋ผ์ฐ์ ์์ RSC๋ก ๊ทธ HTML์ ํ์ด๋๋ ์ด์
ํ ์ ์์ต๋๋ค.
+
+์ด ์ฃผ์ ์ ๋ํ ๋ ๋ง์ ์ ๋ณด๋ฅผ ๊ธฐ๋ํด์ฃผ์ธ์!
+
+## ์๋ฒ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋งํ๋ ๋ด์ฉ์ ์
๋ฐ์ดํธํ๊ธฐ
+
+์๋ฒ ์ปดํฌ๋ํธ๊ฐ ์๋ก์ด ๋ด์ฉ์ ๋ ๋๋งํด์ผ ํ๋ค๋ฉด โ ์๋ฅผ ๋ค์ด, ํ ์ ํ ํ์ด์ง์์ ๋ค๋ฅธ ์ ํ ํ์ด์ง๋ก ์ ํํ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์ธ์.
+
+๋ค์ ๋งํด, ๋ ๋๋ง์ด ์๋ฒ์์ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์๋ก์ด RSC ์์ด์ด ํฌ๋งท์ ์ฝํ
์ธ ๋ฅผ ์ป๊ธฐ ์ํด ์๋ฒ์ ๋ ๋ค๋ฅธ API ํธ์ถ์ด ํ์ํฉ๋๋ค.
+
+์ข์ ์์์, ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ก์ด ์ฝํ
์ธ ๋ฅผ ๋ฐ์ผ๋ฉด ์๋ก์ด React ์์ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๊ณ , ์ด์ React ํธ๋ฆฌ์์ ์ฐจ์ด๋ฅผ ๋น๊ตํ์ฌ DOM์ ํ์ํ ์ต์ํ์ ์
๋ฐ์ดํธ๋ฅผ ์ํํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
+
+์ด ๊ณผ์ ์์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ ์ํ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค.
+
+ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ์
์ฅ์์๋ ์ด ์
๋ฐ์ดํธ๊ฐ ๋ธ๋ผ์ฐ์ ๋ด์์ ์ ์ ์ผ๋ก ๋ฐ์ํ ๊ฒ๊ณผ ๋ค๋ฅด์ง ์์ต๋๋ค.
+
+ํ์ฌ๋ ๋ฃจํธ ์๋ฒ ์ปดํฌ๋ํธ๋ถํฐ ์ ์ฒด React ํธ๋ฆฌ๋ฅผ ๋ค์ ๋ ๋๋งํด์ผ ํ์ง๋ง, ๋ฏธ๋์๋ ์๋ธ ํธ๋ฆฌ์ ๋ํด์๋ ์ด ์์
์ ์ํํ ์ ์๊ฒ ๋ ๊ฒ์
๋๋ค.
+
+## RSC์ ๋ฉํ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
+
+React ํ์ RSC๊ฐ ์ฒ์์๋ Next.js๋ Shopify Hydrogen ๊ฐ์ [๋ฉํ ํ๋ ์์ํฌ](https://github.com/josephsavona/rfcs/blob/server-components/text/0000-server-components.md#adoption-strategy)๋ฅผ ํตํด ๋์
๋๋๋ก ์๋ํ๋ค๊ณ ๋งํ์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ ๊ทธ๋ด๊น์? ๋ฉํ ํ๋ ์์ํฌ๋ ์ด๋ค ๋์์ ์ฃผ๋์?
+
+๊ผญ ์ฌ์ฉํ ํ์๋ ์์ง๋ง, ์ฌ์ฉํ๋ฉด ํจ์ฌ ํธ๋ฆฌํฉ๋๋ค.
+
+๋ฉํ ํ๋ ์์ํฌ๋ ์น์ํ ๋ํผ(Wrapper)์ ์ถ์ํ๋ฅผ ์ ๊ณตํ์ฌ ์๋ฒ์์ RSC ์คํธ๋ฆผ์ ์์ฑํ๊ณ ๋ธ๋ผ์ฐ์ ์์ ์ด๋ฅผ ์๋นํ๋ ๊ฒ์ ๋ํด ์ ๊ฒฝ ์ธ ํ์๊ฐ ์๋๋ก ํด์ค๋๋ค.
+
+๋ฉํ ํ๋ ์์ํฌ๋ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง๋ ์ง์ํ๋ฉฐ, ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์๋ฒ์์ ์์ฑ๋ HTML์ ์ ๋๋ก ํ์ด๋๋ ์ด์
ํ ์ ์๋๋ก [์์
](https://github.com/vercel/next.js/issues/30994)์ [์ํ](https://github.com/Shopify/hydrogen/pull/250)ํฉ๋๋ค.
+
+๋ณด์
จ๋ค์ํผ, ๋ธ๋ผ์ฐ์ ์์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๊ณตํ๊ณ ์ฌ์ฉํ๋ ๋ฐ์๋ ๋ฒ๋ค๋ฌ์ ํ๋ ฅ์ด ํ์ํฉ๋๋ค.
+
+์ด๋ฏธ webpack ํตํฉ์ด ์์ผ๋ฉฐ, Shopify๋ [vite ํตํฉ ์์
](https://github.com/facebook/react/pull/22952)์ ์งํ ์ค์
๋๋ค.
+
+์ด๋ฌํ ํ๋ฌ๊ทธ์ธ์ RSC์ ํ์ํ ๋ง์ ๋ถ๋ถ์ด ๊ณต๊ฐ npm ํจํค์ง๋ก ๊ฒ์๋์ง ์์๊ธฐ ๋๋ฌธ์ React ์ ์ฅ์์ ์ผ๋ถ๊ฐ ๋์ด์ผ ํฉ๋๋ค.
+
+๊ทธ๋ฌ๋ ๊ฐ๋ฐ์ด ์๋ฃ๋๋ฉด, ์ด๋ฌํ ๊ตฌ์ฑ ์์๋ ๋ฉํ ํ๋ ์์ํฌ ์์ด๋ ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค.
+
+## RSC๊ฐ ์ค๋น๋์๋์?
+
+๋ฆฌ์กํธ ์๋ฒ ์ปดํฌ๋ํธ๋ ํ์ฌ [Next.js์ ์คํ์ ๊ธฐ๋ฅ](https://nextjs.org/docs/app/building-your-application/rendering/server-components)๊ณผ [Shopify Hydrogen์](https://hydrogen.shopify.dev/) ํ์ฌ ๊ฐ๋ฐ์ ํ๋ฆฌ๋ทฐ๋ก ์ ๊ณต๋๊ณ ์์ง๋ง, ์ด๋ ๊ฒ๋ ์์ง ํ๋ก๋์
์์ ์ฌ์ฉํ๊ธฐ์๋ ์ค๋น๋์ง ์์์ต๋๋ค.
+
+์์ผ๋ก์ ๋ธ๋ก๊ทธ ํฌ์คํธ์์ ๊ฐ ํ๋ ์์ํฌ๊ฐ RSC๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง์ ๋ํด ์์ธํ ๋ค๋ฃฐ ์์ ์
๋๋ค.
+
+ํ์ง๋ง React Server Components๊ฐ React์ ๋ฏธ๋์ ํฐ ๋ถ๋ถ์ ์ฐจ์งํ ๊ฒ์ด๋ผ๋ ์ ์ ํ์คํฉ๋๋ค.
+
+์ด๋ ๋ ๋น ๋ฅธ ํ์ด์ง ๋ก๋, ๋ ์์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค, ๊ทธ๋ฆฌ๊ณ ๋ ์งง์ ์ธํฐ๋ํฐ๋ธ ์๊ฐ์ ๋ํ React์ ํด๋ต์
๋๋ค โ React๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉํฐ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ ํฌ๊ด์ ์ธ ๋
ผ์ ์
๋๋ค.
+
+์์ง ์ค๋น๋์ง ์์์ง๋ง, ๊ณง ์ฃผ๋ชฉํ ์๊ธฐ๊ฐ ์ฌ ๊ฒ์
๋๋ค.
+
+## Plasmic์ React Server Components ์ฌ์ฉ
+
+Plasmic์ ์ฝํ
์ธ ์ ์์๊ฐ ๋๋ฉ ํ์ด์ง ๋ฐ ๊ณ ์ฑ๋ฅ React ์น์ฌ์ดํธ์ ์คํ ์ดํ๋ก ํธ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๊ตฌ์ถํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, ๊ฐ๋ฐ์๋ ์ฝํ
์ธ ํ์ด์ง ์์
์์ ์์ ๋ก์์ง๊ฒ ํฉ๋๋ค.
+
+Plasmic์ ๊ธฐ์กด React ์ปดํฌ๋ํธ๋ฅผ ์บ๋ฒ์ค์ ๋๋๊ทธ ์ค ๋๋กญํ ์ ์๋๋ก ๊น์ด ์๋ React ์ง์์ ์ ๊ณตํฉ๋๋ค.
+
+React Server Components์ ๊ฐ์ ์ฑ๋ฅ ํฅ์ ๋๊ตฌ๋ ์ฐ๋ฆฌ์ ๊ณ ๊ฐ ๋ชจ๋์๊ฒ ๋งค์ฐ ์ค์ํฉ๋๋ค.
+
+๋์ ์ ์ธ ์ฌ์ฉ์๋ค์ ์ํด: [์ด์ Shopify Hydrogen๊ณผ ํจ๊ป ์๋ํ๋ Plasmic ๋ฐ๋ชจ](https://github.com/plasmicapp/hydrogen-demo)๊ฐ ์์ต๋๋ค.
+
+์ด๋ Shopify Hydrogen ์น์ฌ์ดํธ ๋ด์์ ์๊ฐ์ ์ผ๋ก ํ์ด์ง๋ฅผ ๊ตฌ์ถํ๊ณ , ํธ์ง๊ธฐ์์ ๊ธฐ์กด React ์ปดํฌ๋ํธ๋ฅผ ๋๋๊ทธ ์ค ๋๋กญํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
+
+๋๋ [Plasmic](https://studio.plasmic.app/)์ ์ฌ์ฉํ์ฌ ์์ ์ ์ฝ๋๋ฒ ์ด์ค์์ ์๊ฐ์ ์ผ๋ก ๊ตฌ์ถ์ ์์ํด๋ณด์ธ์!
+
+์ด ๊ธ์ ์ด๊ธฐ ์ด์์ ๊ฒํ ํด์ฃผ์ Hassan๊ณผ Josh์๊ฒ ๋ง์ ๊ฐ์ฌ๋ฅผ ๋๋ฆฝ๋๋ค!