NextJS

NextJS ์ •๋ฆฌ(v13 ์ด์ „)

MoZZANG 2023. 1. 30. 09:09
NextJS๊ฐ€ ๋ญ์ฃ ?

๐Ÿ‘‰ https://nextjs.org/

 

Next.js by Vercel - The React Framework

Production grade React applications that scale. The world’s leading companies use Next.js by Vercel to build static and dynamic websites and web applications.

nextjs.org

 

The React Framework for the Web

NextJS๋Š” React ํ”„๋ ˆ์ž„์›Œํฌ(Framework)์ด๋‹ค.

 

 

ํ”„๋ ˆ์ž„์›Œํฌ vs ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

 

React๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ณ , NextJS๋Š” ๊ทธ React์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๊ณ  ํ•œ๋‹ค. 

 

ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฐจ์ด๋Š” ๋ญ์ง€?

 

ํ”„๋ ˆ์ž„์›Œํฌ vs ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ธฐ๋ฐ˜๊ตฌ์กฐ vs ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ฐœ๋ฐœ ํŽธ์˜ ๋„๊ตฌ๋“ค
  • ์ œ์–ด ์ฃผ๋„๊ถŒ์„ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ฐ€์ง vs ์ œ์–ด ์ฃผ๋„๊ถŒ์„ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€์ง
  • ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ธฐ๊ณ„(ex. ๊ตด์‚ญ๊ธฐ) vs  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ณต๊ตฌ(ex. ์‚ฝ, ๋ง์น˜)
  • ํ”„๋ ˆ์ž„์›Œํฌ ์ž์œ ๋„๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ์ ์Œ vs ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์œ ๋„๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ํผ

 

ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์žฅ์ 

  • ๊ฐœ์ธ์ด ํ•ด์•ผํ•  ๊ณ ๋ฏผ๋“ค์„ ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฏธ๋ฆฌ ํ•˜๊ณ  ๋ฐ˜์˜
  • ํŠน์ • ๋””์ž์ธ ํŒจํ„ด์ด๋‚˜ ๋™์ž‘๊ณผ ๊ธฐ๋Šฅ๋“ค์„ ์œ„ํ•œ ์ •์˜์™€ ๋ฐฉ์‹์„ ์ •๋ฆฌํ•ด๋‘ 
  • ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•จ๊ป˜ ํ˜‘์—…ํ•  ๋•Œ ๊ธฐ์ค€์ ์ด ๋จ

 

 

Why NextJS

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ฐ€์ง„ ๊ณ ๋ฏผ์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ œ๊ณต

  • ๊ทœ๋ชจ๊ฐ€ ์žˆ๋Š” ์„œ๋น„์Šค ๊ตฌ์กฐ ์„ค๊ณ„๋ฅผ ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€?
  • ๊ฐœ๋ฐœํ™˜๊ฒฝ / ์ฝ”๋“œ ๋ถ„ํ•  / ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ
  • SEO(๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”)
  • ํ”„๋ก ํŠธ์—”๋“œ์— ํ•„์š”ํ•œ ๊ฐ„๋‹จํ•œ API ๊ตฌ์„ฑ
  • ์†์‰ฌ์šด ๋ฐฐํฌ ์‹œ์Šคํ…œ Vercel

 

 

 

 

NextJS ์‹œ์ž‘ํ•ด๋ณด๊ธฐ

 

๊ธฐ๋ณธ์ ์œผ๋กœ nodejs๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค!

 

create-react-app๊ณผ ๋™์ผํ•œ ํ˜•์‹์œผ๋กœ create-next-app์„ ํ•˜๊ฒŒ๋˜๋ฉด ํ™˜๊ฒฝ์„ค์ •์ด ์ž˜ ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

npx create-next-app nextjs-blog

 

 

 

 

 

NexJS Data Fetching

 

NextJS๊ฐ€ ์ œ์‹œํ•˜๋Š” 3 + 1๊ฐ€์ง€ Data Fetching ๋ฐฉ๋ฒ•

  • SSR
  • CSR
  • SSG
  • ISR

 

1. SSR(Server Side Render)

 

: ์„œ๋ฒ„๊ฐ€ ๊ทธ๋ฆฐ๋‹ค

๐Ÿ‘‰ ๊ทธ๋ฆฐ๋‹ค : ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๊ทธ๋ฆฐ๋‹ค

๐Ÿ‘‰ ์„œ๋ฒ„๊ฐ€ ๊ทธ๋ฆฐ๋‹ค : ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๊ทธ๋ฆฐ๋‹ค

 

SSR์„ ๋‹ด๋‹นํ•˜๋Š” ํ•จ์ˆ˜

: getServerSideProps

 

 

 

์•„๊นŒ๋งŒ๋“  CNA์˜ pages/index.js์—์„œ Component ํ•จ์ˆ˜ ๋ฐ”๊นฅ์ชฝ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด getServerSidePropsํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์ค€๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ  props๋กœ key๋ฅผ time์œผ๋กœ value๋ฅผ ํ˜„์žฌ ์‹œ๊ฐ„์œผ๋กœํ•ด์„œ return ํ•ด์ฃผ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด return ํ•ด์ค€ Props๋“ค์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ž๋™์œผ๋กœ props๋กœ component์—๊ฒŒ ์ „๋‹ฌ๋œ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ๋ง์ด๋‹ค.

 

 

props๋กœ ๋‚ด๋ ค์˜จ time์€ ํ•ด๋‹น component๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

 

 

์ž ๊ทธ๋Ÿฌ๋ฉด getServerSideProps๊ฐ€ ์ง„์งœ ์„œ๋ฒ„์—์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด  console.log('server')์„ ์ฐ์–ด๋‘์—ˆ์œผ๋‹ˆ ํ™•์ธํ•˜๋Ÿฌ ๊ฐ€๋ณด์ž

 

โœ”๏ธ yarn dev๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ Local ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰์‹œํ‚ค๊ณ  ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์—ฐ ํ›„ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•ด๋ณด๋ฉด console์ฐฝ์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ฐํžˆ์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๋Œ€์‹  vscode์˜ ํ„ฐ๋ฏธ๋„์„ ๋ณด๊ฒŒ ๋˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด server๊ฐ€ ์ฐํžŒ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค!

 

 

์ƒˆ๋กœ๊ณ ์นจ์„ ๋ช‡๋ฒˆ ํ•ด๋ณด์•„๋„ terminal์—์„œ๋งŒ console์ด ์ฐํžˆ๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ์„ ํ…๋ฐ ์ด๊ฒƒ์ด ๋ฐ”๋กœ getServerSideProps๋ผ๋Š” ํ•จ์ˆ˜๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋Š” ์„œ๋ฒ„์—์„œ๋งŒ ๋™์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค!

 

 


 

2. CSR(Client Side Render)

 

: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ทธ๋ฆฐ๋‹ค.

๐Ÿ‘‰ ๊ทธ๋ฆฐ๋‹ค : ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๊ทธ๋ฆฐ๋‹ค.

๐Ÿ‘‰ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ทธ๋ฆฐ๋‹ค : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๊ทธ๋ฆฐ๋‹ค.

 

์ฆ‰, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์œ ์ €๊ฐ€ ๋ณด๋Š” UI๋ฅผ ๋งŒ๋“œ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

 

CSR์„ ๋‹ด๋‹นํ•˜๋Š” ํ•จ์ˆ˜๋Š” ๋”ฐ๋กœ ์—†๋‹ค. ๊ธฐ์กด React์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๊ฒƒ์ด ๊ณง CSR!! (ex. useEffect ๋“ฑ)

 

 


3. SSG(Static-Site Generation)

 

: ์ •์ ์ธ ์‚ฌ์ดํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

๐Ÿ‘‰ ์ƒ์„ฑํ•œ๋‹ค : ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๊ทธ๋ ค๋‘”๋‹ค

๐Ÿ‘‰ ์ •์ ์ธ ์‚ฌ์ดํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค : ์ •์ ์ธ ์‚ฌ์ดํŠธ๋ฅผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๊ทธ๋ ค๋‘”๋‹ค.

 

SSG๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ํ•จ์ˆ˜

: getStaticProps(with getStaticPaths)

 

 

index.js์— nextjs์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” Link ํƒœ๊ทธ๋กœ ๊ฐ๊ฐ์˜ ํ•จ์ˆ˜๋ฅผ ํ…Œ์ŠคํŠธ ํ•ด๋ณผ ์ˆ˜ ์žˆ๋„๋ก ๋ผ์šฐํŒ…์„ ํ–ˆ๋‹ค.(CSR๋„ ํ•ด๋ณด๋ ค๊ณ )

 

 

 

NextJS๋Š” React์ฒ˜๋Ÿผ react-router-dom์œผ๋กœ ๋ผ์šฐํŒ…์„ ํ•ด์ค„ ํ•„์š” ์—†์ด ํด๋”๊ตฌ์กฐ๋กœ ์ž๋™์œผ๋กœ ๋ผ์šฐํŒ…์ด ๋œ๋‹ค.(์ด๊ฒŒ ๋ฐ”๋กœ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์žฅ์ ์ด์ง€)

 

๋”ฐ๋ผ์„œ pages๋ผ๋Š” ํด๋” ํ•˜์œ„์— ํŒŒ์ผ๋“ค์„ ๋งŒ๋“ค๋ฉด ์ž๋™์œผ๋กœ ๋ผ์šฐํŒ…์‹œ์Šคํ…œ์ด ์ ์šฉ๋œ๋‹ค. ์ง€๊ธˆ ๊ฐ™์€ ๊ฒฝ์šฐ /csr๊ณผ /ssg๋ฅผ ๋ผ์šฐํŒ…ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํด๋”๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

 

์ž ๊ทธ๋ฆฌ๊ณ  ssg.js์— ๊ฐ€์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด getStaticPropsํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด data fetching ํ•˜๋Š” ์ฒ™์„ ํ•ด๋ณด์ž.

 

 

 

โš ๏ธ ๊ทผ๋ฐ ์—ฌ๊ธฐ์„œ ํ•˜๋‚˜ ์ฃผ์˜ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ด ์žˆ๋Š”๋ฐ npm run dev ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ nextjs dev ๋กœ ๋กœ์ปฌ์—์„œ ์‹คํ–‰์„ ์‹œํ‚ค๋ฉด ๋งˆ์น˜ SSR์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

๋•Œ๋ฌธ์— npm run build๋ฅผ ํ•˜๊ณ  npm run dev๊ฐ€ ์•„๋‹Œ npm run start๋ฅผ ํ†ตํ•ด ์‹คํ–‰์‹œ์ผœ์•ผ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค.

 

์•„๋ฌดํŠผ build ํ›„ start๋กœ ์‹คํ–‰์„ ์‹œํ‚จ ํ›„ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•ด๋ณด๋ฉด sever์™€ client์ชฝ์—์„œ ๋ชจ๋‘ ์•„๋ฌด๋Ÿฐ ๋กœ๊ทธ๊ฐ€ ์ฐํžˆ์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

์ด๋Š” getStaticProps๋Š” ํŒŒ์ผ์„ buildํ•  ๋•Œ ์‹คํ–‰์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

์ด์ฒ˜๋Ÿผ getStaticProps๋Š” build์‹œ ๋ฐ์ดํ„ฐ๋ฅผ fetching๋ฐ›์•„์™€ ์ •์  ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ getStaticPath๋Š” build์‹œ ์–ด๋–ค ์–ด๋–ค ๊ฒƒ๋“ค์„ SSGํ•  ๊ฑด์ง€๋ฅผ ์ •ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

 


4. ISR(Incremental Static Regeneration)

 

: ์ฆ๋ถ„ ์ •์  ์‚ฌ์ดํŠธ๋ฅผ ์žฌ์ƒ์„ฑํ•œ๋‹ค.

๐Ÿ‘‰ ์žฌ์ƒ์„ฑํ•œ๋‹ค : (ํŠน์ • ์ฃผ๊ธฐ๋กœ) ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋‹ค์‹œ ๊ทธ๋ ค์ค€๋‹ค.

๐Ÿ‘‰ ์ฆ๋ถ„ ์ •์  ์‚ฌ์ดํŠธ๋ฅผ ์žฌ์ƒ์„ฑํ•œ๋‹ค. : (ํŠน์ • ์ฃผ๊ธฐ๋กœ) ์ •์ ์ธ ์‚ฌ์ดํŠธ๋ฅผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋‹ค์‹œ ๊ทธ๋ ค์ค€๋‹ค.

 

์‰ฝ๊ฒŒ ์–˜๊ธฐํ•ด์„œ ์ •์ ์œผ๋กœ ๋งŒ๋“ค์–ด ๋†“์€ ์‚ฌ์ดํŠธ๋“ค๋„ ์—…๋ฐ์ดํŠธ๊ฐ€  ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ์ด์šฉํ•œ๋‹ค๋ฉด ์ •์ ์ƒ์„ฑ์˜ ์žฅ์ ์„ ์ทจํ•˜๋˜ ๋‹จ์ ์„ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

ISR์„ ๋‹ด๋‹นํ•˜๋Š” ํ•จ์ˆ˜

: getStaticProps with revalidate

 

 

์œ„์—์„œ ํ–ˆ๋˜ ๋ฐฉ์‹๊ณผ ๋™์ผํ•˜๊ฒŒ isr์šฉ ํŒŒ์ผ์„ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  getStaticProps๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

 

 

์—ฌ๊ธฐ์„œ ISR์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” revalidate๋ฅผ ์„ค์ • ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ดˆ๋‹จ์œ„๋กœ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์œ„์™€ ๊ฐ™์ด revalidate๋ฅผ 5์ดˆ ์ฃผ์—ˆ๋‹ค๋Š” ์˜๋ฏธ๋Š” 

 

์ตœ์ดˆ ํŽ˜์ด์ง€๋กœ ์ง„์ž…ํ•˜๊ฒŒ ๋˜๋ฉด SSG์— ์˜ํ•ด ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋†“์€ ํŽ˜์ด์ง€๋ฅผ ์ œ๊ณตํ•ด์ค€๋‹ค. ์ดํ›„ 5์ดˆ๊ฐ€ ์ง€๋‚˜๋ฉด server์—์„œ ํ•ด๋‹นํŽ˜์ด์ง€์˜ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ณ  ์ด ์—…๋ฐ์ดํŠธ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์•ž์œผ๋กœ ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค. 

 

 

 

 

โ“ ์ž ์—ฌ๊ธฐ์„œ ํ—ท๊ฐˆ๋ฆฌ๊ณ  ์˜คํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด SSG, SSR ๊ฐœ๋…์ด ๋“ค์–ด๊ฐ€ ์žˆ์œผ๋‹ˆ ๋ชจ๋“  ํŽ˜์ด์ง€ ์ด๋™๋งˆ๋‹ค SSR์„ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

 

์ฒซ ์š”์ฒญํ•˜๋Š” ํŽ˜์ด์ง€์— ๋Œ€ํ•ด์„œ๋งŒ SSG ํ˜น์€ SSR๋กœ server side์—์„œ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋†“์€ ํŒŒ์ผ์„ ์‘๋‹ตํ•˜๋Š” ๊ฒƒ์ด๊ณ  ๊ทธ ์ดํ›„๋ถ€ํ„ฐ๋Š” router๋ฅผ ํ†ตํ•ด CSR๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 


 

Pre-render

 

 

Pre - rendering

๊ธฐ๋ณธ์ ์œผ๋กœ NextJS๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ pre-rendering ํ•œ๋‹ค.

 

https://nextjs.org/learn/basics/data-fetching/pre-rendering

 

https://nextjs.org/learn/basics/data-fetching/pre-rendering

 

 

 

 

 

 

 

Pre-rendering๊ณผ SEO์˜ ์ƒ๊ด€๊ด€๊ณ„

CSR๋งŒ ์ œ๊ณตํ•œ๋‹ค๋ฉด, Client(๋ธŒ๋ผ์šฐ์ €)์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒ€์ƒ‰์—”์ง„์˜ ๊ฒฝ์šฐ ์ฆ‰, JS๋ฅผ ํ•ด์„ํ•  ์ˆ˜ ์—†๋Š” ์—”์ง„์—์„œ๋Š” ์•„๋ฌด๋Ÿฐ ๋ฐ์ดํ„ฐ๋„ ์กฐํšŒํ•ด๊ฐˆ ์ˆ˜ ์—†๋‹ค.

 

Pre-render๋ฅผ ํ•ด๋‘๋ฉด Client ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒ€์ƒ‰์—”์ง„์—๊ฒŒ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

NextJS์˜ pre-rendering ๋ฐฉ์‹

SSG(recommended) & SSR

 

- SSG๋Š” build์‹œ pre-render

- SSR์€ ์š”์ฒญ ์‹œ pre render

 

์‚ฌ์‹ค NextJS์—์„œ ๋งํ•˜๋Š” SSG์™€ SSR์€ server side์—์„œ build์‹œ์ ์— ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด์ค„๊นŒ?(SSG) ์•„๋‹ˆ๋ฉด ์š”์ฒญ๋งˆ๋‹ค ๋งŒ๋“ค์–ด์ค„๊นŒ?(SSR)๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

 


 

Layouts

 

์—ฌ๋Ÿฌ page๋“ค์˜ ๊ณตํ†ต ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ component๋กœ์จ root์— components/Layout.js๋ผ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค๋ฉด NextJS๊ฐ€ ์ž๋™์œผ๋กœ ์ธ์‹ํ•˜๊ฒŒ ๋œ๋‹ค.

 

์ดํ›„ ์ปดํฌ๋„ŒํŠธ ํ•˜๋‚˜๋ฅผ pages/_app.js์—์„œ ํ™œ์šฉํ•˜๋ฉด ๋˜๋Š”๋ฐ ์—ฌ๊ธฐ์„œ์˜ _app.js ๋˜ํ•œ NextJS๊ฐ€ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋ชจ๋“  ํŒŒ์ผ์„ ํ’ˆ์„ ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ์ด๋ผ๊ณ  ๋ณด๋ฉด๋œ๋‹ค.

 

 

 

 

 

children์œผ๋กœ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋“ค์„ ์ž์‹์š”์†Œ๋กœ์„œ ํ’ˆ์„ ์ˆ˜ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. 

 

์ฐธ๊ณ ๋กœ Layout์—์„œ๋Š” SSR์ด ์•ˆ๋œ๋‹ค. Layout์€ ์ปดํฌ๋„ŒํŠธ์ด์ง€ ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

 

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋์ด๋‹ค.

 

 

 

 

 

props๋กœ ๋ฐ›๋Š” Component์—๋Š” pages์˜ ๋ชจ๋“  ํŒŒ์ผ์„์ด ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

SubLayout

 

 

Layout์ฒ˜๋Ÿผ ๋ชจ๋“  ํŽ˜์ด์ง€์—์„œ๊ฐ€ ์•„๋‹Œ ํŠน์ • ํŽ˜์ด์ง€์—์„œ๋งŒ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์€ ๋‚ด์šฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. 

 

๊ทธ๋Ÿด ๋•Œ๋Š” SubLayout์„ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š”๋ฐ

 

 

์ปดํฌ๋„ŒํŠธ์— SubLayout์ด๋ผ๊ณ  ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์ฃผ๊ณ 

 

ํ™ˆ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋งํฌ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์ค˜๋ณด์ž.

 

 

ํ™ˆ์œผ๋กœ ๊ฐ€๋Š” ๋งํฌ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์€ ํŠน์ • ํŽ˜์ด์ง€์— ๊ฐ€์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋งŒ๋“ค์–ด ์ฃผ์ž

 

 

 

 

 

๊ทธ๋ฆฌ๊ณ ๋Š” _app.js๋กœ ๊ฐ€์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ถ„๊ธฐ์ฒ˜๋ฆฌ(?)๋ฅผ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

 

์œ„ ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•ด๋ณด์ž๋ฉด getLayout์ด๋ผ๋Š” ๊ฒƒ์„ ๊ฐ€์ ธ์žˆ์œผ๋ฉด ๊ทธ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๊ณ , ์—†์œผ๋ฉด || ๋’ค์— ๊ฒƒ์„ ๋ณด์—ฌ์ค˜๋ผ ๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.

 

 


 

Images

 

NextJS๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ตœ์ ํ™” Image Component

 

  • ์„ฑ๋Šฅ ํ–ฅ์ƒ(Improved Preformance)
  • Visual Stability(CLS-Cumulative Layout Shift๋ฐฉ์ง€)
  • Faster Page Loads(viewport ์ง„์ž…์‹œ ๋กœ๋“œ / blur์ฒ˜๋ฆฌ)
  • Asset Flexibility(resizing)
  • lazy loading

 


 

routing

 

Nested routes

/settings/my/info ๋ผ๋Š” ๊ฒฝ๋กœ๋กœ routing์„ ํ•˜๊ณ  ์‹ถ์œผ๋ฉด pages/settings/my/info.js ์™€ ๊ฐ™์ด ํด๋”์™€ ํŒŒ์ผ๊ตฌ์กฐ๋งŒ ์ง€์ผœ์ฃผ๋ฉด ์ž๋™์œผ๋กœ routing์ด ๋œ๋‹ค.

 

 

Slug

 

ํŒŒ์ผ slugํ™”

 

/category/food๋‚˜ /category/item ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋ ๊นŒ? ๋ฌผ๋ก  pages/category/food.js ๊ทธ๋ฆฌ๊ณ  pags/category/item.js์™€ ๊ฐ™์ด ํ•„์š”ํ•œ ๋งŒํผ ํŒŒ์ผ์„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋งŒ์•ฝ ์ƒํ’ˆ์ด 1์–ต๊ฐœ๋ผ๋ฉด ํž˜๋“ค์ง€ ์•Š์„๊นŒ? 

 

๊ทธ๋Ÿด ๋•Œ๋Š” slug๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ›จ์”ฌ ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

pages/category/[slug].js ์ฒ˜๋Ÿผ ๋งŒ๋“ค๋ฉด category/ ๋’ค์— ๋ญ๊ฐ€ ์˜ค๋“  ๋‹ค ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

 

 

ํด๋” slugํ™”

 

pages/[slug]/info.js์™€ ๊ฐ™์ด ๋ง์ด๋‹ค. => /:username/info(ex. /jane/info)

 

 

 

๋ฌดํ•œ depth routing

 

pages/category/[...slug].js ์ฒ˜๋Ÿผ ๋งŒ๋“ค๋ฉด category/ ๋’ค์— depth๊ฐ€ ์•„๋ฌด๋ฆฌ ๋งŽ์•„๋„ ๋‹ค ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

NextJS 13๋ฒ„์ „์—์„œ ๋ฐ”๋€์  : https://velog.io/@hang_kem_0531/Next.js-13%EC%9D%B4-%EB%82%98%EC%99%80%EB%B2%84%EB%A0%B8%EB%8B%A4

 

 

'NextJS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[NextJS] Github ๋กœ๊ทธ์ธ ์—ฐ๊ฒฐํ•ด๋ณด๊ธฐ  (0) 2023.12.09
NextJS ๊ฐœ์ธ ๋ฉ”๋ชจ  (1) 2022.11.04