๋ค์ด๊ฐ๋ฉฐ
์ด ๊ธ์ Next.js์์ ํ์ด์ง ๋ ๋๋ง ๋ฐฉ์์ ์ดํดํ๊ธฐ ์ํด์ ํผ์ playground์์ ์คํ ํด๋ณด๋ค ๋ฐฐ์ฐ๊ฒ ๋ ๋ถ๋ถ์ ๊ธฐ๋ก ํ์์ต๋๋ค. ๋ค์ ๊ธ์ด ์ ๋ฌธ์ ์ด์ง ์์ ์๋ ์๊ณ ํ๋ฆฐ ๋ถ๋ถ๋ ์์ต๋๋ค.
๋ CSR์ด๋ SSR์ด๋ ๋๋ SSG์ด๋?
Next.jsํ์ด์ง์์ getServerSideProps getStaticProps ์ค ์๋ฌด๊ฒ๋ ์ง์ ํ์ง ์์ ์ํ์์ ํ์ด์ง ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ํ์ฌ ์ปดํฌ๋ํธ๊ฐ window ๊ฐ์ฒด๊ฐ ์๋ค๋ฉด client ์ผ ๊ฒ์ด๊ณ , ์๋ค๋ฉด server ์์ ๋์ํ๋ค๊ณ ์์ํ์ฌ log๋ฅผ ํ๋ ๋จ๊ฒผ์ต๋๋ค.
useEffect๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ csr๋์์์ ํ์ธํด ๋ณด๊ธฐ ์ํด ๋ฐ์ดํฐ๋ ๋ ๋๋ง ํด๋ณด์์ต๋๋ค.
export default function Test() {
const [data, setData] = useState()
console.log(typeof window === 'undefined' ? 'serverrrr' : 'client')
useEffect(() => {
fetch('https://api.github.com/repos/vercel/next.js')
.then((res) => res.json())
.then((data) => setData(data?.description))
}, [])
return (
<>
<h1>Test Page</h1>
<main>
{' '}
<h2>{data}</h2>
</main>
</>
)
}
getServerSideProps
๋๋ getStaticProps
๊ฐ ๋ช
์์ ์ผ๋ก ์ ์๋์ง ์์์์๋ ๋ถ๊ตฌํ๊ณ , ์๋ฒ์ ํด๋ผ์ด์ธํธ ์์ชฝ์์ ๋ก๊ทธ๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ ๊ด์ฐฐํ์ต๋๋ค.
์ด ํ์์ Next.js์ ๊ธฐ๋ณธ ๋์ ์๋ฆฌ์ ๊ด๋ จ์ด ์๋๋ฐ์.
์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง (SSR):
- ๊ธฐ๋ณธ์ ์ผ๋ก, Next.js ํ์ด์ง๋ ์๋ฒ์์ ๋ ๋๋ง๋ฉ๋๋ค. ํ์ด์ง์
getServerSideProps
๋๋getStaticProps
๊ฐ ์ ์๋์ด ์์ง ์๋๋ผ๋, ์๋ฒ๋ ์ด๊ธฐ HTML์ ์์ฑํ๊ณ ํด๋ผ์ด์ธํธ์ ์ ์กํฉ๋๋ค. - ์ด ๊ณผ์ ์์ ํ์ด์ง์ JavaScript ์ฝ๋๋ ์๋ฒ์์ ์คํ๋๋ฉฐ, ๋ฐ๋ผ์
console.log
์์ "serverrrr"๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง (CSR):
- ์๋ฒ์์ ์์ฑ๋ HTML์ด ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์ ๋๋ฌํ๋ฉด, ํ์ด์ง์ ํฌํจ๋ JavaScript๊ฐ ํด๋ผ์ด์ธํธ ์ธก์์ ์คํ๋ฉ๋๋ค.
- ์ด๋, React ์ปดํฌ๋ํธ๊ฐ ๋ธ๋ผ์ฐ์ ์์ ๋ค์ ์คํ๋๊ณ ,
console.log
์์ "client"๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค. - CSR์์ ๋ฐ์ดํฐ ํ์นญ์ ํด๋ผ์ด์ธํธ ์ธก์์ ์ด๋ฃจ์ด์ง๋๋ค. ์ฌ๊ธฐ์
useSWR
ํ ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๋ถ๋ถ์ด CSR์ ํด๋นํฉ๋๋ค.
์ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋๊ฐ?
OrderChangeListPage
์ปดํฌ๋ํธ๋ ์๋ฒ์์ ๋จผ์ ๋ ๋๋ง๋๊ณ , ๊ทธ ํ์ ํด๋ผ์ด์ธํธ ์ธก์์๋ ๋ ๋๋ง๋ฉ๋๋ค.- ์๋ฒ์์ ๋ ๋๋ง๋ ๋,
typeof window === 'object'
๋false
๊ฐ ๋ฉ๋๋ค. ์๋ํ๋ฉด ์๋ฒ ํ๊ฒฝ์์๋window
๊ฐ์ฒด๊ฐ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋์ "serverrrr"๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค. - ํด๋ผ์ด์ธํธ์์ ๋ ๋๋ง๋ ๋๋
window
๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ฏ๋กtypeof window === 'object'
๋true
๊ฐ ๋๊ณ , "client"๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
์ฌํ๊น์ง๋ ๋ก์ปฌ์์ ์ด๋ฃจ์ด์ง ์ผ๋ค์ ๋๋ค.
๊ทธ๋ผ ์ด ํ์ด์ง๋ฅผ ๋น๋ํ์ ๋ Next.js๋ ์ด๋ค ํ์ด์ง๋ก ๋ฐ์ ๋ค์ผ๊น์?
ํ์ด์ง์ getStaticProps
, getServerSideProps
, ๋๋ getInitialProps
๊ฐ ๋ช
์์ ์ผ๋ก ์ ์๋์ง ์์ ๊ฒฝ์ฐ, ํ์ด์ง๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋ผ์ด์ธํธ ์ฌ์ด๋์์ ๋ ๋๋ง๋ฉ๋๋ค.๋น๋ ์์๋ ๊ฐ๋จํ HTML ํ๋ง ์์ฑ๋๊ณ , ์ค์ ์ฝํ
์ธ ๋ ๋ธ๋ผ์ฐ์ ์์ JavaScript๊ฐ ์คํ๋ ๋ ์ฑ์์ง๋๋ค. ์ด๋ SSR์ด ์๋ CSR (Client-Side Rendering) ๋ฐฉ์์
๋๋ค.๋ฐ๋ผ์ ์ด ๊ฒฝ์ฐ ํ์ด์ง๋ ์ ์ ํ์ด์ง๋ก ๋น๋๋์ง ์์ผ๋ฉฐ, ์ ํต์ ์ธ SSR ํ์ด์ง๋ก ๋น๋๋๋ ๊ฒ๋ ์๋๋๋ค. ๋์ , ํ์ด์ง ๋ก๋ฉ ์ดํ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ ์ฌ์ด๋์์ ๋ถ๋ฌ์ค๋ CSR ๋ฐฉ์์ด ์ ์ฉ๋ฉ๋๋ค.
- order-changeํ์ด์ง๋ ๋ก์ปฌ์์ ServerSideRendering ๋ฐฉ์์ฒ๋ผ ํํด ์ก๋๋ฐ, ์ค์ ๋น๋ ํ์๋ Static ํ์ด์ง๊ฐ ๋์๊ณ , ๊ทธ๋ ๋ค๊ณ ์ดํ์ด์ง๋ SSG ๋ ์๋๋ค์.
๋ถ๋ช Next.js์์ ๋ ๋๋ง ๋ฐฉ์์ ์ค๋ช ํ ๋ SSG, SSR, CSR์ด ์๋๋ฐ์. ์ ๋ ์ดํด๊ฐ ์กฐ๊ธ ์ด๋ ค์ ์ต๋๋ค. ์ด๋ค ์ํฉ์ธ์ง ์ค๋ช ์ด ์ ์๋์๊ธฐ ๋๋ฌธ์ด์ฃ .
์ฌ๊ธฐ์ ๋ฑ์ฅํ ๊ฐ๋
์ด Prerendering
์
๋๋ค.
๋น๋ ๊ณผ์ ์์ ํ์ด์ง์ ๋ํ ๊ธฐ๋ณธ HTMLํ์ ์์ฑ๋์ง๋ง, ํ์ด์ง์ ์ค์ ์ฝํ ์ธ ๋ ๋ธ๋ผ์ฐ์ ์์ JavaScript๊ฐ ์คํ ๋ ๋ ์ฑ์์ง๋๋ค.
์ดํ๋ฆฌ์ผ์ด์ ์ ํ๋ก๋์ ๋ชจ๋์์ ์คํํ๋ฉด, Next.js๋ ๋น๋๊ณผ์ ์์ ์ ์ฅํ ์ ์ ์ธ HTML์ pre-renderํ๊ฒ ๋ฉ๋๋ค.
์ด๋ ๋ฆฌ์กํธ์ CSR๊ณผ๋ ๋ค๋ฆ ๋๋ค. CSR๋ HTML์ ์๋ฌด๊ฒ๋ ๋ด๊ฒจ ์์ง ์์ง๋ง, ์๋ ์ด๋ฏธ์ง ์ฒ๋ผ Next.js์์๋
h1
ํ๊ทธ์ ํจ๊ป ๋ณด์ฌ์ค๋๋ค.ํด๋นํ์ด์ง๋ ํด๋ผ์ด์ธํธ์์ ์ ์ ์ผ๋ก ๋ ๋๋ง ๋๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
์๋์ ์ด๋ฏธ์ง๋ ๋น๋ ๊ณผ์ ์์ ๋ง๋ค์ด์ง HTMLํ ์ ๋๋ค.
์ค์ ํ์ด์ง๋ฅผ ๋ ๋๋งํ ๋ ๋ณด์ฌ์ง HTML๊ณผ , HTML์ด ๋ธ๋ผ์ฐ์ ๋ก ์ ๋ฌ ๋ ํ ๋์ ํ์ด์ง๋ฅผ ์ฑ์ฐ๋ ๊ณผ์ ์ ๋ด์ ์์์ ์๋์ ๊ฐ์ต๋๋ค.
- ํ์ด์ง์ ๋ฐ์ดํฐ๋ ๋ธ๋ผ์ฐ์ ์์ JavaScript๊ฐ ์คํ๋๋ฉด์ API ํธ์ถ ๋ฑ์ ํตํด ๋์ ์ผ๋ก ๋ถ๋ฌ์ค๊ฒ ๋ฉ๋๋ค. ์ด๊ฒ์ CSR์ ์ ํ์ ์ธ ํน์ง์ ๋๋ค.
- ์ด๋ ๊ฒ ๋์ ์ผ๋ก ๋ถ๋ฌ์จ ๋ฐ์ดํฐ๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋์์๋ง ์ฌ์ฉ๋๋ฉฐ, ๋น๋๋ ์๋ฒ ์ฌ์ด๋ ํ์ผ์๋ ํฌํจ๋์ง ์์ต๋๋ค.
- ๋น๋ ํด๋(
.next
ํด๋) ๋ด์์๋ ํด๋น ํ์ด์ง์ ๋ํ ํ์ผ์ ์ฐพ์ ์ ์์ต๋๋ค. ํ์ง๋ง ์ด ํ์ผ์ ์ฃผ๋ก ๊ธฐ๋ณธ HTML ํ๊ณผ ํ์ด์ง๋ฅผ ๋ ๋๋งํ๋ ๋ฐ ํ์ํ JavaScript ์ฝ๋๋ฅผ ํฌํจํ๊ณ ์์ต๋๋ค.
๋ฐฐ์ด ์ :
๊ฒฐ๋ก ์ ์ผ๋ก, getStaticProps
๋ getServerSideProps
๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ์ด์ง๋ ๋น๋ ํด๋์๋ ์กด์ฌํ์ง๋ง, ๊ทธ ๋ด์ฉ์ ์ฃผ๋ก ๊ธฐ๋ณธ์ ์ธ HTML๊ณผ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง์ ์ํ JavaScript ์ฝ๋๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ํ์ด์ง์ ์ค์ ์ฝํ
์ธ ๋ ๋ฐ์ดํฐ๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋์์ ๋์ ์ผ๋ก ๋ก๋๋๊ณ ๋ ๋๋ง๋๋ฉฐ, ๋น๋ ํ์ผ ์์ฒด์๋ ํฌํจ๋์ง ์์ต๋๋ค.
์ Next.js๊ฐ ์๋ฒ์ฌ์ด๋์ ํด๋ผ์ด์ธํธ ์ฌ์ดํธ์ ์ด์ ์ ๋ชจ๋ ๊ฐ์ง ์์๋ค๋ ๊ฑด์ง์ ๋ํด ์กฐ๊ธ ์๊ฒ ๋์์ต๋๋ค. ์ด๋ฐ ๋์๋ฐฉ์์ ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง์ ์ด๊ธฐ ๋ก๋ฉ ์ฑ๋ฅ์ ๊ฐ์ ธ์ฌ ์ ์๊ณ , ๋์์ ํด๋ผ์ด์ธํธ ์ฌ์ด๋์์์ ๋์ ์ธ ์ธํฐ๋ํฐ๋ธํ ๊ธฐ๋ฅ์ ๊ฒฐํฉํ์ฌ ์ฌ์ฉ์์๊ฒ ์ข ๋์ ๊ฒฝํ์ ์ ์ฌํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์ค์ํ ๊ฑด ์ด๋ฐ ํน์ ์ ์ ์ดํดํ๊ณ ํ์ฉํ๋ ๊ฒ ์ ๋๋ค.
์ฐธ๊ณ
https://nextjs.org/ Nextjs ๊ณต์๋ฌธ์