๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ, ํ๋ฉด์ ๋ฌด์์ธ๊ฐ๋ฅผ ๊ทธ๋ฆฌ๋ ค๋ฉด ์ด๋์ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
1. SSR (Server Side Render)
ํ์ด์ง์ ๋ํ ์์ฒญ์ด ์์ ๋๋ง๋ค ์๋ฒ์์ ํ์ด์ง๋ฅผ ๋ง๋ค์ด ๋ฐํ ํฉ๋๋ค.
์๋ฒ์์ ๋งค๋ฒ ์ฐ์ฐ์ ํด์ผํ๋ฉฐ ์บ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋์ ์ผ๋ก ์ด๋ ต๊ธฐ ๋๋ฌธ์ SSG์ ๋นํด ๋๋ฆฝ๋๋ค.
ํ์ง๋ง ํญ์ ์ต์ ์ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ์ด์ผํ๋ ๊ฒฝ์ฐ, SSR๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
(ํ๋ก ํธ)์๋ฒ์์ HTML ํ์ผ์ ๋ง๋ค์ด์ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ CSR์ ๋นํด ์ฌ์ฉ์๊ฐ ๋ ๋น ๋ฅด๊ฒ ํ๋ฉด์ ์ธ์ํ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ด๋ฒคํธ ๋ฑ ํ์ด์ง์ ๋์์ ์ํด์๋ hydrate๋ผ๋ ๊ณผ์ ์ ํตํด์ JS ์ฝ๋๊ฐ ์คํ๋์ด์ผ ํฉ๋๋ค.
- ์๋ฒ ๊ฐ ๊ทธ๋ฆฝ๋๋ค.
- ๊ทธ๋ฆฐ๋ค : ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ๋ํ๋ธ๋ค.
์ฆ, ์๋ฒ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ๊ทธ๋ฆฐ๋ค.
1.2 SSR ์ ๋ด๋นํ๋ ํจ์
getServerSideProps()
Next.js์์ SSR์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ํ์ด์ง์์ getServerSideProps() ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์์ผ ํฉ๋๋ค.
- ๋น๋ํ์์๋ง ์คํ๋๋ getStaticProps()์๋ ๋ฌ๋ฆฌ
- getServerSideProps()๋ ํ์ด์ง์ ๋ํ ์์ฒญ์ด ์์ ๋๋ง๋ค ์คํ ๋ฉ๋๋ค.
์์ 1
function Page({ data }) {
// ๋ฐ์ดํฐ๋ฅผ ํตํด ํ์ด์ง ๋ ๋๋ง...
}
export async function getServerSideProps() {
// ํ์ด์ง๋ฅผ ์์ฒญํ ๋๋ง๋ค ๋งค๋ฒ ์คํ๋๋ค.
// ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์จ๋ค.
const res = await fetch(`https://.../data`)
const data = await res.json()
// Pass data to the page via props
return { props: { data } }
}
export default Page
์์ 2
export async function getServerSideProps(){
console.log('server')
return {
props : {time : new Date().toISOString()}
}
}
export default function Home({time}) {
return (
<div className={styles.container}>
{time}
</div>
)
}
- ์ ์ฝ๋๋ฅผ ์คํ์ํค๋ฉด ํฐ๋ฏธ๋์์ server ๋ผ๋ ๋ก๊ทธ๊ฐ ์ง์์ ์ผ๋ก ๋ฐ์ํฉ๋๋ค.
- ์ด์ ๋ ์๋ฒ์์ ๊ทธ๋ฆฌ๊ธฐ ๋๋ฌธ ์ ๋๋ค.
- ํ๋ฉด ์ฝ์์ฐฝ์๋ ์ฐํ์ง ์์ต๋๋ค!!
- ํ์ด์ง์์ props ๋ฅผ ๋ฐ์์ ์์ ๋กญ๊ฒ ์ฌ์ฉ ํ ์ ์์ต๋๋ค.
์ฆ, getServerSideProps ๋ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์๊ณ , ๊ทธ๊ฒ์ ํ์ด์ง์๋ค๊ฐ props ๋ก ์ ๋ฌํ ๊ฒ ์ ๋๋ค.
2. CSR ( Client Side Render )
Next.js ์์ CSR์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๋๊ฐ์ง๋ก ๋๋์ด๋ณผ ์ ์๋ค.
- url์ ์ ๋ ฅ์ ํตํด pre-rendering ๋ ํ์ด์ง๋ฅผ ๋ฐ๊ณ useEffect()๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ๋ก ๋ถ๋ฌ์ค๋ ๊ฒฝ์ฐ
<Link/>
๋ router.push()๋ฅผ ํตํด ํ์ด์ง ์ ํ์ด ์ผ์ด๋๋ ๊ฒฝ์ฐ์ด๋ค.
- SSR ๊ณผ ์ ๋ฐ๋๋ก ํด๋ผ์ด์ธํธ ๊ฐ ๊ทธ๋ฆฝ๋๋ค.
์ฆ, ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ๊ทธ๋ฆฝ๋๋ค.
2.1 CSR ์ ๊ถ์ฅํ๋ ๊ฒฝ์ฐ
ํ์ด์ง๋ฅผ pre-rendering ํ ํ์๊ฐ ์๊ฑฐ๋, ๋ฐ์ดํฐ์ ์ ๋ฐ์ดํธ๊ฐ ์์ฃผ ์ผ์ด๋๋ค๋ฉด CSR์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์ ์ ๋์๋ณด๋ ํ์ด์ง๋ ํด๋น ์ ์ ๋ง์ ์ํ ๋น๋ฐ ํ์ด์ง์ด๊ธฐ ๋๋ฌธ์ SEO๊ฐ ํ์ํ์ง ์์ผ๋ฉฐ
๋ฐ๋ผ์ pre-renderingํ ํ์๋ ์์ต๋๋ค. ๋ํ ๋ฐ์ดํฐ๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋๊ธฐ๋๋ฌธ์ CSR์ด ์ ํฉ ํฉ๋๋ค.
2.2 CSR ์ ๋ด๋นํ๋ ํจ์
- ๋ฐ๋ก ์กด์ฌํ์ง ์์ต๋๋ค.
- ๊ธฐ์กด React ์ฌ์ฉ๋ฒ๊ณผ ๋์ผ ํฉ๋๋ค.
- next.js ์ Link ๋ฑ...
3. SSG ( Static-Site Generation )
๋น๋์ HTML ํ์ผ์ ๋ฏธ๋ฆฌ ๋ ๋๋งํ๋ ๊ฒ์ด SSG ์ ๋๋ค. ์ ์ ์ธ ํ์ด์ง์ ์ฃผ๋ก ์ฐ์ด๋ฉฐ,
HTML ํ์ผ์ ๋ฏธ๋ฆฌ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์๋ฒ์์ ๋งค๋ฒ ์ฐ์ฐ์ ํ์ง ์์๋ ๋ ๋ฟ ์๋๋ผ,
๋ณ๋ค๋ฅธ ์ค์ ์์ด CDN ์บ์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ SSR ๋ณด๋ค๋ ํจ์ฌ ๋น ๋ฅธ ์๋๋ฅผ ๋ณด์ฌ์ค๋๋ค.
SSG๋ Next.js ์ ๊ธฐ๋ณธ์ ์ธ ๋ ๋๋ง ๋ฐฉ์ ์ ๋๋ค. ํ์ง๋ง ๋ฐฑ์๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ๋ ๋๋งํ๋ ๊ฒฝ์ฐ,
ํ์ด์ง์์ useEffect()๋ฅผ ์ฌ์ฉํ๋ค๋ฉด url์ ํตํ ํ์ด์ง ์ ๊ทผ์ SSG๋ก๋ ๋ฐ์ดํฐ๊ฐ ํ์์๋ ๋ถ๋ถ๋ง ๊ตฌ์ฑํ๊ณ ,
๋ฐ์ดํฐ๋ฅผ ํ์๋กํ๋ ๋ถ๋ถ์ CSR๋ก ๋ ๋๋งํ๊ฒ ๋ฉ๋๋ค.
ํ์ด์ง์์ ๋ฐ์ดํฐ๋ฅผ ํ์๋ก ํ๋ ๋ถ๋ถ์ด ํด์๋ก ์ฌ์ฉ์๊ฐ ํ๋ฉด์ ์ธ์ํ๋๋ฐ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฌ๋ฉฐ
์ด๋ SSG์ ์ฅ์ ์ ์ ํ ํ์ฉํ์ง ๋ชปํ๊ฒ ๋๋ ๊ฒ์ ์๋ฏธ ํฉ๋๋ค.
์ด๋ Next.js ์์ ์ ๊ณตํ๋ ํ์ด์ง ๋จ์ ํจ์ getStaticProps()๋ฅผ ํตํด ํด๊ฒฐํ ์ ์์ต๋๋ค.
3.1 SSG ๋ฅผ ๋ด๋นํ๋ ํจ์
getStaticProps()
- yarn dev ๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐํ๊ฒฝ์์๋ ์ ๋๋ก ๋์ํ์ง ์์ต๋๋ค. (SSG ๊ฐ SSR ์ฒ๋ผ ๋์ ํฉ๋๋ค!)
- ์ ํํ๊ฒ ํ์ธํ๋ ค๋ฉด ๋น๋๋ฅผ ํ ํ yarn start ๋ฅผ ํด์ผ ํฉ๋๋ค.
- SSG ์์๋ ์๋ก๊ณ ์นจ์ ํด๋ ํ์ด์ง๊ฐ ๋ณํจ์์ด ๋์ผ ํฉ๋๋ค. ( ์ฝ์์กฐ์ฐจ ์ฐํ์ง ์์ต๋๋ค. )
yarn build ๋ฅผ ํ ๋ ํ์ด์ง๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์๋ค๋ ๋ป ์ ๋๋ค.
์ฆ, ๋น๋ํ๋ ํ์ด๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ค ๊ฐ์ ธ์์ ๋ณด์ฌ์ค ํ์ด์ง๋ฅผ static ํ ํ์ด์ง๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํ ๊ฒ์ ๋๋ค.
์์ 1
function Blog({ posts }) {
return (
<ul>
{posts.map((post) => (
<li>{post.title}</li>
))}
</ul>
)
}
// getStaticProps ํจ์๋ server-side์์ build ํ์์๋ง ์คํ๋๋ค.
export async function getStaticProps() {
// build ํ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์จ๋ค.
const res = await fetch('https://.../posts')
const posts = await res.json()
// { props: { posts } }๋ฅผ ๋ฐํํจ์ผ๋ก์จ,
// Blog ์ปดํฌ๋ํธ๋ ๋น๋ํ์์ props ๋ก posts๋ฅผ ๋ฐ์ ์ ์๋ค.
return {
props: {
posts,
},
}
}
export default Blog
- ๋ณด์ด๋ ๋ฐ์ ๊ฐ์ด getStaticProps๋ ๋น๋ํ์์ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ๋ฐํํ๊ณ
- getStaticProps๋ฅผ ์ฌ์ฉํ๋ ํ์ด์ง๋ ๋น๋ํ์์ getStaticProps ๋ก๋ถํฐ props๋ฅผ ๋ฐ์์ฌ ์ ์์ต๋๋ค.
- ๋ฐ๋ผ์ ๋น๋ํ์์ ๋ฐ์ดํฐ์ ๋ฐ๋ฅธ ํ๋ฉด ๊ตฌ์ฑ์ด ๊ฐ๋ฅ
์์ 2
export async function getStaticProps(){
console.log('server')
return {
props : {time : new Date().toISOString()}
}
}
export default function ssg({time}) {
return (
<div>
<h1>{time}</h1>
</div>
)
}
- ์์ ์์์ฒ๋ผ dev ํ๊ฒฝ์์๋ ์๋ก๊ณ ์นจํ๋ฉด ์๊ฐ์ด ๊ณ์ ๋ณํ์ง๋ง (SSR ์ฒ๋ผ node์ ๋ก๊ทธ๊ฐ ์ฐํ๋๋ค.)
- ๋น๋ํ๊ณ ๋ฐฐํฌํ ํ ์คํํ๋ฉด ์ ์ ์ธ ํ์ด์ง๊ฐ ๋ง๋ค์ด์ง๋๋ค. (์๋ก๊ณ ์นจํด๋ ์๊ฐ์ด ํ๋ฉด์ ์๊ฐ์ด ๋ณํ์ง ์์ต๋๋ค.)
3.2 ๋์ ์ด์ง๋ ์๊ณ ์ ์ ์ธ๋ฐ ํ์ํ ์ด์ ๋ ?
- SSR ์ ํญ์ ์ ๊ทผ ํ ๋ ๋ง๋ค, ์ฆ ์๋ก๊ณ ์นจ ํ ๋ ๋ง๋ค ์๋ฒ๊ฐ ๋์ ํฉ๋๋ค
์ฆ, ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฆด ๋ ๋ง๋ค ์๋ฒ๊ฐ ๋์ํ๊ณ ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ์ ๊ทผํ๋ค๊ณ ํ๋ฉด ์๋ฒ์ ๋ถํ๊ฐ ๋ง์์ง๋๋ค.
ํ์ง๋ง SSG ๋ฅผ ์ฌ์ฉํ๋ฉด
์ ์ ์ธ ํ์ด์ง ํ์ ์ด์ง๋ง, ๊ทธ ํ์ด์ง๋ ๋๊ฐ ์ ๊ทผํด๋ ๋น๋ํ ๋ ์ด๋ฏธ ๋ง๋ค์ด์ ธ์๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ ์๋ฒ์ ๋ถํ ์์ด ์๋น์ค๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๋ค.
3.3 SSG ํ์ด์ง์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ? : revalidate
๋น๋ ํ์์ ์ ์ ํ์ผ์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ดํ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ ํ์ด์ง์ ๋ฐ์์ด ๋์ง ์์ต๋๋ค.
์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด getStaticProps() ์๋ revalidate๋ผ๋ ์ต์ ์ด ์กด์ฌํ๋ฉฐ ์ด ๋จ์๋ก ์ ๋ ฅํ ์ ์๋ค.
๋น๋๋ฅผ ํตํด ํ์ด์ง๊ฐ ์์ฑ๋ ํ revalidate ๊ฐ(์ด)์ด ์ง๋๊ธฐ ์ ๋ค์ด์ค๋ ์์ฒญ์ ๋ํด์๋ ๊ธฐ์กด์ ํ์ด์ง๋ฅผ ๋ฐํ ํฉ๋๋ค. revalidate ๊ฐ์ด ์ง๋๊ณ ๋ค์ด์ค๋ ์ต์ด ์์ฒญ์ ๋ํด์๋ ๊ธฐ์กด ํ์ด์ง๋ฅผ ๋ฐํํ๊ณ ํ์ด์ง๋ฅผ ์๋ก ๋น๋ ํฉ๋๋ค. ์ดํ ๋ค์ด์ค๋ ์์ฒญ์ ๋ํด์๋ ์๋ก ๋น๋๋ ํ์ด์ง๋ฅผ ๋ฐํ.(๋ฐ๋ณต)
์ฆ revalidate์ 10์ ์ ๋ ฅํ๋ค๋ฉด 10์ด๋ง๋ค ์ฌ๋น๋ ๋๋ ๊ฒ์ด ์๋๋ผ, 10์ด ์ดํ ์์ฒญ์ด ์๋ก ๋ค์ด์์ ๋ ์ฌ๋น๋ ํ์ฌ ์๋ก์ด ํ์ด์ง๋ฅผ ๋ง๋๋ ๊ฒ ์ ๋๋ค.
export async function getStaticProps() {
const res = await fetch('https://.../posts')
const posts = await res.json()
return {
props: {
posts,
},
// Next.js will attempt to re-generate the page:
// - When a request comes in
// - At most once every 10 seconds
revalidate: 10, // ์ด ๋จ์
}
}
- ์๋ ISR ์์ ํ๋ฒ ๋ ๋์ต๋๋ค.
4. ISR ( Incremental Static Regeneration )
- ์ฆ๋ถ ์ ์ ์ฌ์ดํธ ๋ฅผ ์ฌ์์ฑ ํฉ๋๋ค.
- ์ฌ์์ฑํ๋ค : (ํน์ ์ฃผ๊ธฐ๋ก) ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ๋ค์ ๊ทธ๋ฆฝ๋๋ค.
์ฆ, (ํน์ ์ฃผ๊ธฐ๋ก) ์ ์ ์ธ ์ฌ์ดํธ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ๋ค์ ๊ทธ๋ฆฐ๋ค.
4.1 getStaticProps ( with revalidate )
- revalidate ์ ์ผ๋ง ์ฃผ๊ธฐ๋ก ์ฌ์์ฑ ๋ ์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
- SSG ์ฒ๋ผ ๊ฐ๋ฐํ๊ฒฝ์ด ์๋ ๋น๋ ํ ๋ฐฐํฌํด์ ํ์ธ ํฉ๋๋ค.
isr.js
export async function getStaticProps(){
console.log('server')
return {
props : {time : new Date().toISOString()},
revalidate : 1, // 1 ์ด
}
}
export default function isr({time}) {
return (
<div>
<h1>{time}</h1>
</div>
)
}
- ๊ธฐ์กด SSG ๋ ์๋ก๊ณ ์นจํด๋ ํ์ด์ง์ ์ซ์๋ ๊ฐ์ด ๋์ ์ผ๋ก ๋ณํ์ง ์์ต๋๋ค.
- ํ์ง๋ง ISR ์ ์ค์ ํ ํน์ ์ฃผ๊ธฐ๋๋ก ํ๋ฉด์ ๋์ ์ผ๋ก ๋ณํ์ํฌ ์ ์์ต๋๋ค.
- ์๋ก๊ณ ์นจ์ ์๋ฌด๋ฆฌํด๋ 1์ด ๊ฐ๊ฒฉ์ผ๋ก ์คํ์ด ๋ฉ๋๋ค.
์ ๋ฆฌ ( Data Fetching )
- ํ์ด์ง๋ฅผ ๊ทธ๋ฆฌ๋ ๋ฐฉ์ -> ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ๊ทธ๋ฆฐ๋ค.
- 3 + 1 -> SSR / CSR / SSG / ISR
- SSG -> yarn dev ๋ก๋ SSR ์ฒ๋ผ ๋์
- ํ์์ ๋ง์ถฐ์ -> SSR์ ์๋ฒ ๋ถํ / SSG + ISR
์ฐธ๊ณ
'๐ Front-End > Next.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Next.js - Link (0) | 2022.10.26 |
---|---|
Next.js - Routing (0) | 2022.10.26 |
Next.js - Pre Rendering (0) | 2022.10.26 |
React์ ๋ฌธ์ ์ ๊ณผ NextJS์ ๋์ (0) | 2022.10.26 |
Next.js ์ ์ (0) | 2022.10.26 |