์๋ก
Next๋ฅผ ์ฌ์ฉํ๊ฒ ๋์์ ๋์ ๋ ๋๋ง ๊ณผ์ ์ ๊ณต๋ถํ๋ ์ค ์ข์ ๊ธ์ ๋ฐ๊ฒฌํด์ ๊ทธ ๊ธ์ ๋ณด๋ฉฐ ์ ๋ฆฌํ๊ฒ ๋์๋ค
=> ์๋ณธ ๊ธ์ ์ฝ๊ฐ์ ์ด๋ง ๋ถ์ฌ ์ ๋ฆฌํ๋ ๊ฒ์์ ๋ฏธ๋ฆฌ ๋ฐํ๋๋ค
(์ ๊ฐ ์ฐธ๊ณ ํ๋ ๊ธ์ ๋ํด์๋ ๊ฒ์๋ฌผ ํ๋จ์ ๋งํฌ๋ฅผ ๋ฌ์๋์์ต๋๋ค)
์ฐ๋ฆฌ๊ฐ ํํ React์ Next์ ๊ฐ์ฅ ํฐ ์ฐจ์ด๋ผ๊ณ ํ๋ฉด,
CSR(Client Side Render)๊ณผ SSR(Server Side Render) ๋ผ๊ณ ๋ตํ ๊ฒ์ด๋ค.
SSR์ ์๋ฒ์ธก์์ ์์ฑ๋ HTML์ ๋ณด๋ด์ฃผ๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ๋ ๊ทธ๊ฑธ ๋ฐ์์ ๊ณง๋ฐ๋ก ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๊ธฐ์ ์ฌ์ฉ์๊ฐ ๋น ํ๋ฉด์ ๋ณด๋ ์๊ฐ์ ์ค์ฌ์ค ์ ์๋ค.
์ด์ ๋์ ๊ฐ๋
์ ๊ฐ์ง๊ณ ์์์ง๋ง, ์กฐ๊ธ ๋ ์์ธํ๊ฒ ์ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํ๋ค.
Server Component
Next์๋ Server Component์ Client Component์ ๊ฐ๋ ์ด ์กด์ฌํ๋ค
- Next 13๋ฒ์ ์ด ๋ฑ์ฅํ๋ฉด์ ๊ต์ฅํ ๋ง์ ๋ณํ๊ฐ ์์์ง๋ง, ๊ทธ ์ค์์ ๊ฐ์ฅ ํฐ ๋ณํ๋ app router ์ด๋ค.
- app router ๋ฐฉ์์์๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฒ ์ปดํฌ๋ํธ๋ก ๋์ํ๋ค๋ ์ฌ์ค์ ์ฃผ๋ชฉํด์ผ ํ๋ค.
- ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, ํ์ผ์ ์ต์๋จ์
'use client'
๋ผ๊ณ ๋ช ์ํด์ฃผ์ด์ผ ํ๋ค.
"use client";
import {useState} from "react";
const ClientComponent =() => {
const [state,setState] = useState()
return <div>Test</div>
}
export default ClientComponent
RSC vs RCC
React Server Component์ React Client Component
์ฌ์ค ๋ฆฌ์กํธ์๋ ์๋ฒ ์ปดํฌ๋ํธ์ ๊ฐ๋ ์ ์กด์ฌํ๋ค
React Server Component๋ React 18๋ถํฐ ๋์
๋ ๊ฐ๋
์ผ๋ก, ์๋ฒ์์ ๋์ํ๋ ์ปดํฌ๋ํธ๋ฅผ ์ง์นญํ๋ค.
์๋ฒ ์ปดํฌ๋ํธ๊ฐ ์์ผ๋๊น ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ ์๊ฒ ์ง?
๊ทธ๋ ๋ค. ์๋ฒ ์ปดํฌ๋ํธ์ ๊ฐ๋
์ด ๋์
๋๊ธฐ ์ ๊น์ง ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๋ ๋ชจ๋ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ด๋ค.
์๋ฒ ์ปดํฌ๋ํธ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๋ ์ฅ์๊ฐ ์๋ฒ๋ ํด๋ผ์ด์ธํธ๋์ ์ฐจ์ด ๋ค.
์๋ฒ ์ปดํฌ๋ํธ๋ ์๋ฒ์์ ํ์ฐจ๋ก ํด์๋ ํ์ ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌ๋๊ณ , ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ ํด๋ผ์ด์ธํธ๊ฐ js ๋ฒ๋ค์ ๋ค์ด๋ก๋ ๋ฐ์ ํ์ ํด์ํ๊ฒ ๋๋ค.
- RSC์ RCC๋ ๋ ๋๋ง๋๋ ์์น๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฐ ํ ์ ์๋ ์ญํ ์ด ๊ตฌ๋ถ๋๋ค
- RSC๊ฐ ์ต๊ทผ์ ๋์จ ๊ฐ๋ ์ด๋๊น ๋ฌด์กฐ๊ฑด RCC๋ณด๋ค ์ข๊ฒ ์ง? ๋ผ๋ ์๊ฐ์ ์๋ชป๋ ์๊ฐ์ด๋ค
- RSC์ RCC๋ฅผ ์ ์ฌ์ ์์ ๋ฐฐ์นํด์ฌ ๊ฐ๋ฐํ๋ ค๋ ์ ๊ทผ์ด ํ์์ ์ด๋ค
RSC์ ๋์ ๋ฐฉ์
RSC๋ ์๋ฒ์์ ์ด๋ค ์์ผ๋ก ๋ ๋๋ง์ด ๋๋ ๊ฒ์ผ๊น?
RSC์ RCC๋ฅผ ์ ์ฌ์ ์์ ๋ฐฐ์นํ๊ธฐ ์ํด์๋ RSC๊ฐ ์ด๋ค ์์ผ๋ก ๋ ๋๋ง๋๋์ง ์ดํดํ ํ์๊ฐ ์๋ค
์๋์ ๊ฐ์ด RSC์ RCC๋ฅผ ์ ์ ํ๊ฒ ํผํฉํ์ฌ ๊ตฌ์ฑํ ํ๋ฉด์ด ์๋ค๊ณ ๊ฐ์ ํ์
- ๋ ธ๋์ ๋ ธ๋๋ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ, ํ๋์ ๋ ธ๋๋ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ์๋ฏธํ๋ค
- ์ฌ์ฉ์(๋ธ๋ผ์ฐ์ )๋ ํด๋น ํ์ด์ง๋ฅผ ๋ ๋ํ๊ธฐ ์ํด์ ์๋ฒ๋ก ์์ฒญ์ ๋ ๋ฆฐ๋ค
- ๊ทธ๋ฌ๋ฉด ์๋ฒ๋ ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ Root๋ก๋ถํฐ ์คํํ๋ฉฐ ์ง๋ ฌํ๋ JSON์ ํํ๋ก ์ฌ๊ตฌ์ฑํ๊ธฐ ์์ํ๋ค
์ง๋ ฌํ?
์ง๋ ฌํ๋ ๋ฐ์ดํฐ ์คํ ๋ฆฌ์ง ๋ฌธ๋งฅ์์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์ค๋ธ์ ํธ ์ํ๋ฅผ ๋์ผํ๊ฑฐ๋ ๋ค๋ฅธ ์ปดํจํฐ ํ๊ฒฝ์ ์ ์ฅ(์ด๋ฅผํ ๋ฉด ํ์ผ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ์์, ๋๋ ๋คํธ์ํฌ ์ฐ๊ฒฐ ๋งํฌ ๊ฐ ์ ์ก)ํ๊ณ ๋์ค์ ์ฌ๊ตฌ์ฑํ ์ ์๋ ํฌ๋งท์ผ๋ก ๋ณํํ๋ ๊ณผ์
์ฝ๊ฒ ๋งํด์ ํน์ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ์ปดํจํฐ ํ๊ฒฝ์ผ๋ก ์ ์กํ๊ณ ์ฌ๊ตฌ์ฑํ ์ ์๋ ํํ๋ก ๋ฐ๊พธ๋ ๊ณผ์ ์ด๋ผ๊ณ ํ ์ ์๋ค.
์ฐ๋ฆฌ๊ฐ ํํ ์ฌ์ฉํ๋ JSON.stringify()
ํจ์๊ฐ ์ง๋ ฌํ๋ฅผ ์ํํ๋ ํจ์์ด๋ฉฐ,
๋ฐ๋๋ก JSON.parse()
ํจ์๊ฐ ์ญ์ง๋ ฌํ๋ฅผ ์ํํ๋ ํจ์์ด๋ค.
์ฃผ์ํ ์ ์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํํ ์๋ ์๋ค๋ ๊ฒ ์ด๋ค.
๋ํ์ ์ผ๋ก function(ํจ์)๋ ์ง๋ ฌํ๊ฐ ๋ถ๊ฐ๋ฅํ ๊ฐ์ฒด ์ด๋ค.
function์ด ์คํ ์ฝ๋์ ์คํ ์ปจํ
์คํธ๋ฅผ ๋ชจ๋ ํฌํจํ๋ ๊ฐ๋
์ด๊ธฐ ๋๋ฌธ์ธ๋ฐ, ํจ์๋ ์์ ์ด ์ ์ธ๋ ์ค์ฝํ์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์งํ๊ณ , ๊ทธ ์์ ์ ์ธ๋ถ ๋ณ์์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ธฐ์ตํ๊ณ ์๋ค.
js์ ํด๋ก์ ๊ฐ ๋ฐ๋ก ์ด๋ฐ ํ์์ ๊ฐ๋ฆฌํค๋ ์ฉ์ด์ด๊ธฐ๋ ํ๋ค.
const a = 100;
const sample = ()=>{
console.log(a)
}
sample() //100
์ด์ฒ๋ผ ํจ์์ ์คํ ์ปจํ ์คํธ, ์ค์ฝํ, ํด๋ก์ ๊น์ง ๋ชจ๋ ์ง๋ ฌํํ ์๋ ์๊ธฐ ๋๋ฌธ์ function์ ์ง๋ ฌํ๊ฐ ๋ถ๊ฐ๋ฅํ ๊ฐ์ฒด๋ก ๋ถ๋ฅ๋๋ ๊ฒ์ด๋ค
์ง๋ ฌํ ๊ณผ์ ์ ๋ชจ๋ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์คํํด์ JSON ๊ฐ์ฒด ํํ์ ํธ๋ฆฌ๋ก ์ฌ๊ตฌ์ฑํ ๋๊น์ง ์งํ๋๋ค.
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
<div style={{backgroundColor:'green'}}>hello world</div> //JSX ์ฝ๋๋ createElement์ syntax sugar๋ค.
> React.createElement(div,{style:{backgroundColor:'green'}},"hello world")
> {
$$typeof: Symbol(react.element),
type: "div",
props: { style:{backgroundColor:"green"}, children:"hello world" },
...
} //์ด๋ฐ ํํ๋ก ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ์์ฐจ์ ์ผ๋ก ์คํํ๋ค.
- ๋ค๋ง ์ด ๊ณผ์ ์ ๋ชจ๋ ์ปดํฌ๋ํธ์ ๋ํด ์งํํ๋ ๊ฒ์ด ์๋๋ผ RCC์ผ ๊ฒฝ์ฐ์๋ ๊ฑด๋๋ฐ๊ฒ ๋๋ค
- RCC์ ๋ ๋๋ง์ ํด๋ผ์ด์ธํธ์๊ฒ ๋๊ธฐ๋ ๊ฒ์ด๋ค
- ํ์ง๋ง RCC๋ฅผ ์๋ฒ์์ ํด์ํ์ง ์๊ณ ๊ฑด๋ ๋ด๋ค๊ณ ํด์ ๋น์๋๋ค๋ฉด ์ค์ ์ปดํฌ๋ํธ ํธ๋ฆฌ์์ ๊ดด๋ฆฌ๊ฐ ๋ฐ์ํ๋ค
- ๋ฐ๋ผ์ RCC์ ๊ฒฝ์ฐ ์ง์ ํด์ํ๋ ๊ฒ์ด ์๋๋ผ, "์ด๊ณณ์ RCC๊ฐ ๋ ๋๋ง๋๋ ์์น์
๋๋ค" ๋ผ๋
placeholder
๋ฅผ ๋์ ๋ฐฐ์นํ๊ฒ ๋๋ค
{
$$typeof: Symbol(react.element),
type: {
$$typeof: Symbol(react.module.reference),
name: "default", //export default๋ฅผ ์๋ฏธ
filename: "./src/ClientComponent.js" //ํ์ผ ๊ฒฝ๋ก
},
props: { children: "some children" },
}
RCC๋ ๊ณง ํจ์์ด๊ธฐ ๋๋ฌธ์, ์ง๋ ฌํ๋ฅผ ํ ์ ์๋ค
๋ฐ๋ผ์ ํจ์๋ฅผ ์ง์ ์ฐธ์กฐํ๋ ๊ฒ์ด ์๋๋ผ, module reference
๋ผ๋ ์๋ก์ด ํ์
์ ์ ์ฉํ๊ณ , ํด๋น ์ปดํฌ๋ํธ์ ๊ฒฝ๋ก๋ฅผ ๋ช
์ํจ์ผ๋ก์จ ์ง๋ ฌํ๋ฅผ ๋์ ํ๊ณ ์๋ค
์ด๋ฌํ ์ง๋ ฌํ ์์
์ ๋ง์น ํ ์์ฑ๋ JSON Tree๋ฅผ ๋์ํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํํ์ด๋ค
- ์ด๋ ๊ฒ ๋์ถ๋ ๊ฒฐ๊ณผ๋ฌผ์
Stream
ํํ๋ก ํด๋ผ์ด์ธํธ๊ฐ ์ ๋ฌ์ ๋ฐ๊ฒ ๋๋ค. - ํจ๊ป ๋ค์ด๋ก๋ํ js bundle์ ์ฐธ์กฐํ์ฌ module reference ํ์ ์ด ๋ฑ์ฅํ ๋๋ง๋ค RCC๋ฅผ ๋ ๋๋งํด์ ๋น ๊ณต๊ฐ์ ์ฑ์๋๋๋ค.
- ๊ทธ๋ฐ ๋ค์ DOM์ ๋ฐ์ํ๋ฉด ์ค์ ํ๋ฉด์ ์คํฌ๋ฆฐ์ด ๋ณด์ฌ์ง๊ฒ ๋๋ ๊ฒ์ด๋ค.
- placeholder๋ก ํ์๋์ด ์๋ ๋ ธ๋๋ค์ด ์ค์ ์ปดํฌ๋ํธ๋ก ๋์ฒด๊ฐ ๋์ด ํ๋ฉด์ ๋ณด์ฌ์ง๊ฒ ๋๋ค
RSC์ ์ ์ฝ์ฌํญ
์ฐ๋ฆฌ๋ RSC, RCC๋ฅผ ํจ๊ป ์ฌ์ฉํ ๋ ๋ช๊ฐ์ง ์ ์ฝ์ฌํญ์ ๋์ถํด๋ผ ์ ์๋ค
- RSC์์ RCC๋ก function๊ณผ ๊ฐ์ด ์ง๋ ฌํ๊ฐ ๋ถ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ props๋ก ๋๊ฒจ์ค ์ ์๋ค
{
$$typeof: Symbol(react.element),
type: "div",
props: {
children: {
$$typeof: Symbol(react.element),
type: {
$$typeof: Symbol(react.module.reference),
name: "default",
filename: "./src/ClientComponent.js"
},
props: {callback:function}, // ์ด์ฒ๋ผ JSON์ function์ด ๋ช
์๋์ด์ผ๋ง ํ๋ค.
...
}
},
...
}
- RSC๋ ์๋ฒ์์ ํด์๋์ด ์ง๋ ฌํ๋ JSON ํํ๋ก ๋ณํ๋๋ค๊ณ ํ๋ค
- ๋๋ฌธ์ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์ค๋ช ํ๋ ๋ชจ๋ ์์๋ ์ง๋ ฌํ๊ฐ ๊ฐ๋ฅํด์ผ ํ๋ค๋ ์ ์ ์กฐ๊ฑด์ด ๋ถ๋๋ค
- ๋ง์ฝ RSC๊ฐ Child์๊ฒ function์ props๋ก ๋๊ฒจ์ฃผ๊ฒ ๋๋ฉด, JSON์ ์ด ์ฌ์ค์ด ๋ช ์๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๋ค
ํ์ง๋ง RSC์์ ๋ค๋ฅธ RSC๋ก function์ ๋๊ฒจ์ฃผ๋ ๊ฒ์๋ ๋ฌธ์ ๊ฐ ์์ด ๊ฐ๋ฅํ๋ค
์๋ฒ์์ ๋ ๋๋ง๋๋ RSC๊ฐ์ ํจ์ ์ ๋ฌ์ ๊ตณ์ด client๋ฅผ ๋๊ธฐ๋ Stream์ ์์ ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์๋ตํ๊ฑฐ๋ placeholder๋ก ๋์ฒดํ ๊ฒ ์๋๊น๋ผ๊ณ ๊ธ์ ์์๋ ์์ธกํ๊ณ ์๋ค
๋ํ, next์ server action์ ์ฌ์ฉํ๋ฉด, RSC์์ RCC๋ก ํจ์๋ฅผ ์ ๋ฌํ ์๋ ์๋๋ฐ, ์๋์ ๊ฐ์ด RSC์์ 'use server
directive์ ํจ๊ป ํจ์๋ฅผ ์ ์ํ๋ฉด RCC๋ก ๋๊ฒจ์ค ์ ์๋ค
const ServerComponent = ()=>{
const add = async (a:number,b:number) =>{
'use server'
return a+b
}
return <div>
<ClientComponent addFunc={add}/>
</div>
}
- ๋ค๋ง ํด๋น function์ params์ return์ ๋ชจ๋ ์ง๋ ฌํ๊ฐ ๊ฐ๋ฅํด์ผ ํ๋ค๋ ์กฐ๊ฑด์ด ๋ถ๋๋ค
- server action์ผ๋ก ์ ์ธํ ํจ์๋ฅผ RSC์์ RCC๋ก ๋๊ฒจ์ค ๋๋ function ์์ฒด๋ฅผ ๋๊ฒจ์ค๋ค๊ธฐ ๋ณด๋ค๋, api์ ๋ช ์ธ๋ฅผ ๋๊ฒจ์ฃผ๊ณ , ํจ์๋ฅผ ํธ์ถํ๋ฉด ๊ทธ๋ ์๋ฒ์ api๋ฅผ ํธ์ถํ๊ณ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ์์ค๋ ๊ฒ์ฒ๋ผ ๋์ํ์ฌ ์ ์ฝ์ฌํญ์ ์ฐํํ๋ ๊ฒ์ด๋ผ ์์ํ๋ค
- ์์ธํ ๋ด์ฉ์ Next ๊ณต์๋ฌธ์์ server action ๋ถ๋ถ์ ์ฐธ์กฐํ๋ฉด ์ข์ ๊ฒ์ด๋ค
- RCC๋ RSC๋ฅผ ์ง์ return ํด์ค ์ ์์ผ๋ฉฐ, ๋ฐ๋์ children prop์ ํํ๋ก ๋๊ฒจ์ฃผ์ด์ผ ํ๋ค
- ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์๋ฒ์์ ๋ชจ๋ RSC๊ฐ ์์ฐจ์ ์ผ๋ก ์คํ๋๋ฉฐ, ์ค๊ฐ์ RCC๋ฅผ ๋ง๋๋ฉด placeholder๋ก ํ์ํด๋๊ณ ๋์ด๊ฐ๋ค๊ณ ํ๋ค
- ์ฆ, RCC๋ ์คํ์ด ๋์ง ์๊ธฐ ๋๋ฌธ์ RCC ๋ด๋ถ์์ ๋ฐํ๋๋ RSC ๋ํ ์๋ฒ ํด๋ผ์ด์ธํธ์์๋ ์๋ฒ์์ ์คํ๋์ง ๋ชปํ๋ค
- ์ด๋ฌํ ๊ฒฝ์ฐ ํด๋น RSC๋ RCC์ ๋์ผํ๊ฒ ํด๋ผ์ด์ธํธ์์ ๋์ํ๊ฒ ๋๋ค
- ํ์ง๋ง children prop์ ํตํด์ RSC๋ฅผ ๋๊ธฐ๊ฒ ๋๋ฉด, ์ฌ์ค์ ๊ณตํต ๋ถ๋ชจ๊ฐ ๋ ๋๋ง๋๋ ์์ ์ RSC๊ฐ ์คํ์ด ๋๊ณ , ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ children์ผ๋ก ์ ๋ฌํ ์ ์๋ค
function ParentClientComponent({children}) {
...
return <div onChange={...}>{children}</div>;
}
function ChildServerComponent() {
...
return <div>server component</div>;
}
function ContainerServerComponent() {
return <ParentClientComponent>
<ChildServerComponent/>
</ParentClientComponent>;
}
- ์์ ๊ฐ์ด
ChildServerComponent
๋ParentClientComponent
์ ์์ ์ปดํฌ๋ํธ์ด๋ค - ํ์ง๋ง ์ฌ์ค์
ContainerServerComponent
๋ฅผ ๊ณตํต ๋ถ๋ชจ๋ก ๊ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ContainerServerComponent
๊ฐ ๋ ๋๋ง๋๋ ์์ ์ChildServerComponent
๋ ํจ๊ป ๋ ๋๋ง๋์ด ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ดParentChildComponent
์ ๋๊ฒจ์ง๊ณ ์๋ค
{
// The ClientComponent element placeholder with "module reference"
$$typeof: Symbol(react.element),
type: {
$$typeof: Symbol(react.module.reference),
name: "default",
filename: "./src/ParentClientComponent.js"
},
props: {
children: {
$$typeof: Symbol(react.element),
type: "div",
props: {
children: "server component"
}
}
}
}
RSC vs SSR
๋๋ ์ด ๊ธ์ ์ฝ์ผ๋ฉด์ RSC์ SSR์ด ๋ค๋ฅธ ๊ฐ๋ ์ด๋ผ๋ ๊ฒ์ ์๊ฒ ๋์๋ค
์ง๊ธ๊น์ง ๊ธ์ ์ฝ์ ์ฐ๋ฆฌ๋ ์ด๋ฌํ ์๊ฐ์ ํ ์ ์๋ค
์ปดํฌ๋ํธ๊ฐ ์๋ฒ์์ ํด์๋ผ์ ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌ๋๋ ๊ฒ SSR ์๋์ผ?
์ค์ ๋ก RSC์ SSR์ ์๋ฒ์์ ์ฒ๋ฆฌํ๋ค๋ ๊ณตํต์ ์ธ์๋ ํด๊ฒฐํ๊ณ ์ ํ๋ ๋ชฉํ๋ ๋ค๋ฅด๊ณ , ์ผ์ด๋๋ ์์ ๊ณผ ์ต์ข
์ฐ์ถ๋ฌผ๋ ๋ค๋ฅธ ์์ ํ ๋ณ๊ฐ์ ๊ฐ๋
์ด๋ผ๊ณ ํ๋ค
๋ฐ๋ผ์ ๋ฐ๋์ ๋ ์ค ํ๋๋ฅผ ์ ํํ ํ์๋ ์๊ณ , ํ์์ ๋ฐ๋ผ RSC์ SSR์ ํจ๊ป ์ฌ์ฉํ๋ฉด ํฐ ์๋์ง๋ฅผ ๋ผ ์๋ ์๋ค
์ฐ๋ฆฌ๊ฐ ์์ฑํ ์์ค์ฝ๋๊ฐ ๋ธ๋ผ์ฐ์ ์ ๋ณด์ฌ์ง๊ธฐ ์ํด์๋ ์ฐ์ ์ปดํฌ๋ํธ๊ฐ ์คํ๋์ด ๋ฐ์ดํฐ๊ฐ ํด์๋์ด์ผ ํ๊ณ ,
ํด์๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ HTML๋ก ๋ณํ๋๋ ๊ณผ์ ์ ๊ฑฐ์ ธ์ผ ํ๋ค
RSC๋ ์ด ์ค ์ ์(ํด์)์ ํด๋นํ๋ ๋จ๊ณ์ ๊ด์ฌํ๊ณ , SSR์ ํ์(HTML๋ก ๋ณํ)์ ๊ด์ฌํ๋ค
๊ทธ๋ ๋ค๋ฉด, ๋ ์ด๋ฌํ ์๊ฐ์ ํ ์ ์๋ค
RSC๋ฅผ ์ฐ๋ , RCC๋ฅผ ์ฐ๋ SSR์ ์ฌ์ฉํ๋ฉด ์ด์งํผ ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ๊ฒ ๋๋ ์ต์ข
์ฐ์ถ๋ฌผ์ HTML๋ก ๋์ผํ ๊ฒ ์๋๊ฐ?
๊ทธ๋ ๋ค๋ฉด RSC์ SSR์ ํจ๊ป ์ฌ์ฉํ์ ๋์ ์ด์ ์ ๋ฌด์์ธ๊ฐ?
Next์ SSR
Next์์๋ SSR์ ์ด๋ป๊ฒ ์ฌ์ฉํ๊ณ ์์๊น?
์ด๊ฑธ ์ดํดํ๊ธฐ ์ํด์ CSR๊ณผ SSR์ ๊ฐ๋ ์ ๋ํด์ ๋จผ์ ์ ๋ฆฌ๋ฅผ ํด๋ณด์
CSR vs SSR
CSR๊ณผ SSR์ ์ฐจ์ด
- Client Side Rendering(CSR)์ ๋ง ๊ทธ๋๋ก ํด๋ผ์ด์ธํธ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ ๊ฒ์ ์๋ฏธํ๋ค
- ์๋ฒ์์ ๋น HTML๊ณผ js bundle์ ๋ค์ด๋ฐ๊ณ , ์ด js ์์ค ์ฝ๋๋ฅผ ํด๋ผ์ด์ธํธ์์ ํด์ํด์ ์ฒ์๋ถํฐ ๊ทธ๋ ค๋๊ฐ๊ฒ ๋๋ค
- ๋๋ฌธ์ ์ด๊ธฐ ๋ก๋ฉ ์๋๊ฐ ๋๋ฆฌ์ง๋ง, ์คํฌ๋ฆฐ๊ฐ ์ด๋์ด๋ ์ธํฐ๋์
์ ๊ฐ์ ์ด ์๋ค
- ๋น HTML์ ๋ฐ์์์, js๋ฅผ ํด๋ผ์ด์ธํธ ์ธก์์ ์คํ์์ผ์ ์คํฌ๋ฆฐ์ ๊ตฌ์ฑํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์๋๊ฐ ๋๋ฆฌ๋ค
- Server Side Rendering(SSR)์ ์๋ฒ์์ ์ปดํฌ๋ํธ๋ฅผ ํด์ํด์ ์ต์ข ๊ฒฐ๊ณผ๋ฌผ์ธ HTML ํ์ผ์ ๋ด๋ ค์ฃผ๋ ๊ฒ ์ ์๋ฏธํ๋ค
- CSR๊ณผ๋ ๋ฐ๋๋ก ์ด๊ธฐ ๋ก๋ฉ ์๋๊ฐ ๋น ๋ฅด์ง๋ง, ํ์ด์ง๋ฅผ ์ด๋ํ ๋๋ง๋ค ์๋ก์ด HTML์ ์์ฒญํด์ ๋ฐ๋ ์๊ฐ์ด ํ์ํ๊ณ , ํ์ฌ ํ๋ฉด์์๋ ์์ ๋ณ๊ฒฝ์ฌํญ์ด ๋ฐ์ํ๋ฉด ์ฒ์๋ถํฐ HTML์ ๋ก๋ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์คํฌ๋ฆฐ๊ฐ ์ด๋์ด๋ ์ธํฐ๋์
์ ์ฝ์ ์ด ์๋ค
- ์ด๋ฏธ ์์ฑ๋ HTML์ ๋ด๋ ค์คฌ๊ธฐ ๋๋ฌธ์, ์ฌ์ฉ์์์ ์ธํฐ๋์ ์ ํ๊ฒ ๋๋ฉด ์ฌ์ฉ์์ ์ ๋ ฅ์ ๋ฐ๋ผ ์๋กญ๊ฒ ๋๋ค์ HTML์ ๋ฐ์์์ผ ํ๋ค
- ๋ฆฌ์กํธ๋ SPA(Single Page Application)์ด๊ธฐ ๋๋ฌธ์ ํ์ด์ง ์ด๋์ ํ๊ฒ ๋๋ฉด ๊ต์ฅํ ์ค๋ฌด์ค ํ์ง๋ง, Next์์๋ ํ์ด์ง ์ด๋์ ํ๊ฒ ๋๋ฉด ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฌ๊ณ ๊น๋นก์์ด ๋ฐ์ํ๋ค
- ์ฌ์ค Next์์ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ SSR์ ์ ํต์ ์ธ ์๋ฏธ์ SSR์ ์๋๋ค
- SSR๊ณผ CSR์ ์ฅ์ ๋ง์ ์ทจํ๊ธฐ ์ํด์ ์ผ์ข ์ ์ ์ถฉ์ ์ ์ฐพ์ ํํ๋ผ๊ณ ํ ์ ์๋ค
- ์ด๊ธฐ ๋ก๋ฉ ์๋๊ฐ ๋๋ฆฌ๋ค๋ CSR์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด์ ์ด๊ธฐ ๋ก๋ฉ์์๋ HTML ํ์ผ์ SSR์ ํตํด ๋น ๋ฅด๊ฒ ๋ฐ์์ค๊ณ , ์ด์ ๋ณ๋ ฌ์ ์ผ๋ก js ๋ฒ๋ค๋ ํจ๊ป ๋ฐ์์์ ๋ฏธ๋ฆฌ ๋ฐ์์จ HTML๊ณผ ๋ณํฉํ๋ Hydration ๊ณผ์ ์ ๊ฑฐ์น๋ ๊ฒ์ด๋ค
- ๊ทธ ๊ฒฐ๊ณผ ๋น ๋ฅธ ๋ก๋ฉ์ ๊ฐ์ ์ด ์๋ SSR๊ณผ ์ธํฐ๋์ ์ ๊ฐ์ ์ด ์๋ CSR์ ์ฅ์ ์ ๋ชจ๋ ์ทจํ ์ ์๊ฒ ๋๋ค
- ์ฆ, Next์ SSR ๋ฟ๋ง ์๋๋ผ CSR์ ํน์ง๋ ๋ง์ด ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก RSC๋ฅผ ํจ๊ป ์ฌ์ฉํ์ ๋, ๊ทธ ์ด์ ์ด ๋์ฑ ํฌ๊ฒ ๊ทน๋ํ ๋ ์ ์๋ค
SSR + RSC ์์
Next๋ฅผ ์ฌ์ฉํด์ ๋ง๋ค์ด์ง ๊ฒ์ผ๋ก ์๋ ค์ง ๋ทํ๋ฆญ์ค ํ์ด์ง๋ฅผ ์์๋ก ๋ณด์
- ๋ทํ๋ฆญ์ค ํ์ด์ง์ ์ฒ์ ๋ก๋ฉํ๊ฒ ๋๋ฉด, ์๋ฒ์์ ์ด๋ฏธ ์ด๋์ ๋ ์์ฑ๋ HTML์ ๋ฐ์์ค๋ ๊ฒ์ ์ ์ ์๋ค
- ์์ ์์๋ ๋์ฑ ํ์คํ ํ๊ธฐ ์ํด์ JS๋ฅผ Disabled ์ํค๊ณ ์์ฒญ์ ๋ณด๋ธ ๊ฒ์ด๋ค
- React๋ฅผ ์ฌ์ฉํ๋ค๊ณ ์๋ ค์ง ํ์ฌ ๋ด๊ฐ ๊ธ์ ์์ฑํ๊ณ ์๋ ํฐ์คํ ๋ฆฌ์ ํํ์ด์ง
- ํฐ์คํ ๋ฆฌ ํ์ด์ง์์ JS๋ฅผ Disabled ์์ผ๋ฒ๋ฆฌ๋ฉด ์ด์ฒ๋ผ ๋น ํ๋ฉด๋ง ๋ณด๊ฒ ๋๋ค
- ๊ธฐ๋ณธ์ ์ธ ๋ถ๋ถ(header, meta, ...)๋ง ์ฑ์์ ธ ์๋ค
- CSR์์๋ ๋น HTML์ ๋ณด๋ด์ค ๋ค์ js ๋ฒ๋ค์ ํด๋ผ์ด์ธํธ ์ธก์์ ํด์ํด์ ํ๋ฉด์ ๊ตฌ์ฑํ๋ค๊ณ ํ๋๋ฐ, js๋ฅผ ๋ง์๋ฒ๋ฆฌ๋ ์ด์ ๊ฐ์ด ๋น ํ๋ฉด๋ง ๋ณด๊ฒ ๋๋ ๊ฒ์ด๋ค
RSC์ ์ฅ์
RSC๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ๋ชจ๋ ์ดํดํ์ผ๋, RSC์ ์ฅ์ ์ ์ฝ๊ฒ ๋ฉ๋ํ ์ ์์ ๊ฒ์ด๋ค
Zero Bundle Size
์๋ฒ ์ธก์์ ๋ฏธ๋ฆฌ ๋ชจ๋ ํด์์ ํด์ ์ง๋ ฌํ๋ JSON ํํ๋ก ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ์ด๋ ํ Bundle๋ ํ์ํ์ง ์๋ค
RSC์ ์์ค ํ์ผ ๋ฟ๋ง ์๋๋ผ, RSC์์๋ง ์ฌ์ฉํ๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฝ์ฐ์๋ ๋ฒ๋ค์ ํฌํจ๋ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฒ๋ค ์ฌ์ด์ฆ๋ฅผ ํ๊ธฐ์ ์ผ๋ก ๊ฐ๋ํ ์ ์๋ค
์ด๋ฌํ ๋ถ๋ถ์ Next์ TTI(Time To Interactive) ๊ฐ์ ์๋ ํฌ๊ฒ ๊ธฐ์ฌํ ์ ์๋๋ฐ, ์ด์ ์ ์ดํด๋ดค๋ฏ์ด Next์์ SSR์ ์ฌ์ฉํ๋ค๊ณ ํ๋๋ผ๋ ์ด๊ธฐ ๋ก๋ฉ์๋์ ์ด์ ์ด ์์ ๋ฟ CSR๊ณผ ๋์ผํ ์ฌ์ด์ฆ์ js ๋ฒ๋ค์ ๋ค์ด๋ฐ์์ผ ํ๊ธฐ ๋๋ฌธ์ TTI๋ ์ฌ์ ํ CSR ๋๋น ํฐ ๋ฉ๋ฆฌํธ๊ฐ ์์๊ธฐ ๋๋ฌธ์ด๋ค
ํ์ง๋ง RSC๋ฅผ ๋์ ํ๋ฉด ๋ค์ด๋ฐ์์ผ ํ๋ ๋ฒ๋ค ์ฌ์ด์ฆ๊ฐ ์ค์ด๋ค๊ฒ ๋๋ฏ๋ก, TTI ๊ฐ์ ์ ๊ธฐ์ฌํ ์ ์๋ค
No More getServerSideProps / getStaticProps
Next 13 ๋ฒ์ ์ผ๋ก ๋ณ๊ฒฝ๋๋ฉด์ ๋์ด์ getServerProps / getStaticProps๋ผ๋ ํจ์๋ฅผ ์ด์ฉํ์ง ์๊ฒ ๋์๋ค
์ฌ์ค ๋๋ Next 12 ๋ฒ์ ์ ์ฌ์ฉํด๋ณธ ์ ์ด ์๊ธฐ ๋๋ฌธ์ ํผ๋ถ๋ก ์๋ฟ์ง๋ ์์ง๋ง, ์ด์ ์ด ํจ์ฌ ๋ถํธํ์ ๊ฒ์ด๋ ๊ฑด ์์ํด๋ณผ ์ ์์๋ค
๊ธฐ์กด์๋ Data fetch ๋ฑ์ ์ํํ ๋๋ ๋ฐ๋์ getServerSideProps
๋๋ getStaticProps
ํจ์๋ฅผ page ์ต์๋จ์์ ์ํํ๊ณ , ์ด๋ฅผ page์ props๋ก ๋๊ฒจ์ ์ฌ์ฉํด์ผ ํ๋ค
์ด ๊ณผ์ ์ ์์ React์๋ ๊ดด๋ฆฌ๊ฐ ์์ด์ ์ฒ์ Next๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์๊ฒ ๋ฏ์ค ๋ฟ๋ง ์๋๋ผ, ๋ฌด์กฐ๊ฑด ์ต์๋จ์์ fetchํ ํ์ page์ props๋ก ๋๊ฒจ์ค ์ ๋ฐ์ ์๋ ๊ตฌ์กฐ ๋๋ฌธ์ data๋ฅผ ํ์ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ ค๋ฉด props drilling
์ด ๋ถ๊ฐํผํ๋ค.
๋ฐ๋ฉด RSC๋ ๊ทธ ์์ฒด๊ฐ ์๋ฒ์์ ๋ ๋๋ง๋๊ธฐ ๋๋ฌธ์, ์ปดํฌ๋ํธ ๋ด๋ถ์์ Data Fetch๋ฅผ ์๋ํด๋ ๊ด์ฐฎ๋ค
์ฆ, data๊ฐ ํ์ํ ์ปดํฌ๋ํธ์์ ์ง์ data fetch๊ฐ ๊ฐ๋ฅํด์ก๊ณ , Next 13์ app router์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ RSC์ด๊ธฐ ๋๋ฌธ์, ๋ ์ด์ getServerSideProps
๋๋ getStaticProps
๋ ๋ถํ์ํ ํจ์๊ฐ ๋์๋ค
Automatic Code Splitting
์๋๋ Code Splitting์ ํ๊ธฐ ์ํด์๋ React.Lazy๋ dynamic import๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค
import dynamic from 'next/dynamic'
const DynamicComponent = dynamic(() => import('../components/hello'))
- ํ์ง๋ง RSC์์ RCC๋ฅผ importํ๋ ์ผ์ด์ค์์๋ ์๋์ ์ผ๋ก RCC๋ฅผ dynamic importํ๊ฒ ๋๋ค
- RCC๋ ์๋ฒ์์ ํด์ํ์ง ์๊ณ , placeholder๋ง ๋จ๊ฒจ๋๋ค๊ณ ํ๋๋ฐ, ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ตณ์ด RSC๊ฐ ๋ ๋๋ง๋ ๋ RCC๋ฅผ ์ฆ์ importํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค
Progressive Rendering
Next 13๋ถํฐ๋ ์ปดํฌ๋ํธ๊ฐ ์๋ฒ์์ ํ์ฐจ๋ก ๋ ๋๋ง๋๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ๋ฌผ๋ก ์ง๋ ฌํ๋ JSON์ด ์์ฑ๋๋ค๊ณ ํ๋ค
- ๊ทธ๋ฆฌ๊ณ ํด๋ผ์ด์ธํธ๋ ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์ Stream์ ํํ๋ก ์์ ํ๊ฒ ๋๋ค
// 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 (
<ul>
{tweets.slice(0, 2).map((tweet) => (
<li>
<Tweet tweet={tweet} />
</li>
))}
</ul>
)
}
// Tweet.client.js
export default function Tweet({ tweet }) {
return <div onClick={() => alert(`Written by ${tweet.username}`)}>{tweet.body}</div>
}
// OuterServerComponent.server.js
export default function OuterServerComponent() {
return (
<ClientComponent>
<ServerComponent />
<Suspense fallback={'Loading tweets...'}>
<Tweets />
</Suspense>
</ClientComponent>
)
}
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":{...}}}]}]]}]
- ์ ๋ฌธ์์ด์ ํด๋ผ์ด์ธํธ๊ฐ ์์ ํ๋ ์คํธ๋ฆผ์ ํ ์์๋ฅผ ๋ํ๋ธ ๊ฒ์ด๋ค.
- ์ฌ๊ธฐ์ ์ง๊ณ ๋์ด๊ฐ ๋ถ๋ถ์ ๋ฐ์ดํฐ๊ฐ ‘์คํธ๋ฆผ’ ํํ๋ก ์ ๋ฌ๋๋ค๋ ์ฌ์ค์ด๋ค.
- ์ฆ, ์คํฌ๋ฆฐ์ ๋ชจ๋ ํ๋ฉด์ ๋ณด๋ฅผ ์์ ํ ๋๊น์ง ๊ธฐ๋ค๋ฆด ํ์ ์์ด, ํด๋ผ์ด์ธํธ๋ ๋จผ์ ์์ ๋ ๋ถ๋ถ๋ถํฐ ๋ฐ์ํ๊ธฐ ์์ํ์ฌ ํ๋ฉด์ ๋์์ค ์ ์๊ฒ ๋๋ค.
- ์ ์คํธ๋ฆผ ๋ฌธ์์ด์ ๋ณด๋ฉด S2 ์ง์ ์ suspense๊ฐ ์์ ๋์ด ์๋ค.
- ๊ทธ๋ฆฌ๊ณ J0๋ฅผ ๋ณด๋ฉด ๋ค์ชฝ์ children์ผ๋ก “@3”์ด ์ฐธ์กฐ๋์ด ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
- ํ์ง๋ง ์คํธ๋ฆผ์ ์ด๋๋ฅผ ๋ด๋ “@3”์ ๋ํ ์ ์๋ ๋์์์ง ์๋ค.
- ์ด๋, ์์ง data fetch๊ฐ ์๋ฃ๋์ง ์์๊ธฐ ๋๋ฌธ์ fallback์ด ๋ณด์ฌ์ง๋ ์ํฉ์ด๊ธฐ ๋๋ฌธ์ @3๋ฅผ placehoder๋ก ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋ง์ฝ data fetch๊ฐ ์๋ฃ๋๋ฉด “@3”์ด “J3”๋ก ๋์ฒด๋๊ณ , “J3”๋ ์ฐธ์กฐํ๊ณ ์๋ “M4”์ ํด๋นํ๋ client component์ data๋ฅผ ๋๊ฒจ์ฃผ๋ฉด์ ํ๋ฉด์ ๋ณด์ฌ์ง๊ฒ ๋๋ค.
- ๋ฐ๋ผ์ RSC๋ฅผ React.Suspense์ ํจ๊ป ์ฌ์ฉํ๋ค๋ฉด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ค๋ฆด ํ์ ์์ด ๋จผ์ ๊ทธ๋ฆด ์ ์๋ ๋ถ๋ถ์ ๋ฐ์ํ์ฌ ๋ทฐ๋ฅผ ๋ก๋ํ ๋ค, data fetch๊ฐ ์๋ฃ๋๋ฉด ๊ทธ ๊ฒฐ๊ณผ๊ฐ ์ฆ๊ฐ์ ์ผ๋ก ์คํธ๋ฆผ์ ๋ฐ์๋จ์ ์ ์ ์๋ค.
์ปดํฌ๋ํธ ๋จ์ refetch
์ ํต์ ์ธ SSR์ ๊ฒฝ์ฐ์๋ ์์ฑ๋ HTML์ ๋ด๋ ค์ฃผ๊ธฐ ๋๋ฌธ์, ์์ ๋ณ๊ฒฝ์ฌํญ์ด ๋ฐ์ํ๋๋ผ๋ ์ ์ฒด ํ์ด์ง๋ฅผ ์ ๋ถ ์๋ก ๊ทธ๋ ค์ ๋ฐ์์์ผ ํ๋ค
- ๋ฐ๋ฉด RSC๋ ์ต์ข ๊ฒฐ๊ณผ๋ฌผ์ด ์์ฑ๋ HTML์ด ์๋๋ผ, ์ง๋ ฌํ๋ ์คํธ๋ฆผ์ ํํ๋ก ๋ฐ์์ค๊ธฐ ๋๋ฌธ์, ํด๋ผ์ด์ธํธ์์ ์คํธ๋ฆผ์ ํด์ํ์ฌ virtualDOM์ ํ์ฑํ๊ณ , Reconciliation์ ํตํด ๋ทฐ๋ฅผ ๊ฐฑ์ ํ๋ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋ค
- ํ๋ฉด์ ๋ณ๊ฒฝ์ฌํญ์ด ์๊ฒจ์ ์๋ฒ์์ ์๋ก์ด ์ ๋ณด๋ฅผ ๋ฐ์์์ผ ํ๋ ์ํฉ์ด ์๊ธฐ๋๋ผ๋, ์๋ก์ด ์คํฌ๋ฆฐ์ผ๋ก ๊ฐ์๋ผ์ฐ๋ ๊ฒ์ด ์๋๋ผ ๊ธฐ์กด ํ๋ฉด์ State ๋ฑ Context๋ฅผ ์ ์งํ ์ฑ๋ก ๋ณ๊ฒฝ๋ ์ฌํญ๋ง์ ์ ํ์ ์ผ๋ก ๋ฐ์ํ ์ ์๊ฒ ๋๋ค
๋๋์
Next์ ๋ ๋๋ง ๊ณผ์ ์ ์กฐ๊ธ ๋ ๊น๊ฒ ๊ณต๋ถํด๋ณด๋ฉด์ ๋๋ ์
- RSC์ SSR์ด ์์ ํ ๊ตฌ๋ถ๋๋ ๊ฐ๋
์ด๋ผ๋ ๊ฒ์ด ๊ฐ์ฅ ์๋กญ๊ฒ ์๊ฒ ๋ ๊ฐ๋
์ด์๋ค
- Next๋ ์ด ๋์ ์ ์ ํ ์กฐํ์์ผ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ ํฐ ์๋์ง๋ฅผ ๋ง๋ค์ด๋ธ๋ค
- ๋จ์ํ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ๋๋ child props๋ก ์ ๋ฌํ๋ผ๋ ์๊ธฐ๋ง ์๊ณ ์ฌ์ฉํ๊ณ ์์๋๋ฐ, ์ด์ ๋ ๊ทธ ์ด์ ๋ฅผ ์๊ฒ ๋์๋ค
๊ฒฐ๋ก : Next ์ธ์์?
Reference
'๊ฐ๋ฐ > NextJS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๊ณต์๋ฌธ์ ๋ฒ์ญ] Composition Pattern (2) | 2024.03.22 |
---|---|
[๊ณต์๋ฌธ์ ๋ฒ์ญ] NextJS ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ (0) | 2024.03.21 |
[๊ณต์๋ฌธ์ ๋ฒ์ญ] NextJS ์๋ฒ ์ปดํฌ๋ํธ (1) | 2024.03.20 |