frontEnd/Next.js

Next.js ์ด๋ž€?

kim_genius_ 2024. 3. 7. 16:52

๐ŸŒˆ  ๋“ค์–ด๊ฐ€๋ฉฐ...

๋‚˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ฃผ๋กœ react + node.js ๋กœ ๊ตฌ์„ฑํ•ด์„œ ์ง„ํ–‰ํ–ˆ๋‹ค. ํ„ฐ๋ฏธ๋„์—์„œ ๋‘๊ฐœ๋ฅผ ์—ด์–ด์„œ ๊ฐ๊ฐ ์…‹ํŒ…์„ ํ•ด์คฌ๋Š”๋ฐ ๋ฒˆ๊ฑฐ๋กญ๊ธฐ๋„ ํ•˜๊ณ  ์ถฉ๋Œ๋„ ์ž์ฃผ ๋‚˜๋”๋ผ... ๊ทธ๋Ÿฐ๋ฐ Next๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ ์•ˆ์—์„œ ๋‹ค ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค! ๊ทธ๋ž˜์„œ ์‚ฌ์šฉํ•ด๋ณผ ๊ฒธ ์…‹ํŒ…๊ณผ Next์˜ ์žฅ์ ์„ ์•Œ์•„๋ณผ๊นŒํ•œ๋‹ค.

โ˜€๏ธ  Next.js  ๋ž€?

Next.js๋Š” Vercel์ด ๊ฐœ๋ฐœํ•œ ์˜คํ”ˆ์†Œ์Šค react ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ํ’€์Šคํƒ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋œ๋‹ค.
์›น์‚ฌ์ดํŠธ ๊ฐœ๋ฐœ ์‹œ ํ”„๋ ˆ์ž„์›Œํฌ ์—†์ด React ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ฝ”๋“œ ๋ถ„ํ• , ๋ผ์šฐํŒ…, ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋“ฑ๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€์ ์ธ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.(์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด์„œ ๋”๋”์šฑ) Next๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ.
์ถœ์ฒ˜ : https://nextjs.org/docs#what-is-nextjs (๊ณต์‹๋ฌธ์„œ)

 

โœจ  Next.js์˜ ํŠน์ง•?

โ—‹ ServerSide Rendering(SSR)

Html์„ ์„œ๋ฒ„์—์„œ ๋งŒ๋“ค์–ด์ค€๋‹ค. 

์ถœ์ฒ˜ https://dri.es/album/blog/universal-javascript

  • ์ปจํ…์ธ ์— ๋„๋‹ฌํ•˜๋Š” ์‹œ๊ฐ„ ๋‹จ์ถ•: ์ธํ„ฐ๋„ท ์†๋„๊ฐ€ ๋А๋ฆฌ๊ฑฐ๋‚˜ ๊ธฐ๊ธฐ๊ฐ€ ๋А๋ฆฐ ๊ฒฝ์šฐ ๋” ๋‘๋“œ๋Ÿฌ์ง€๋Š”๋ฐ ์„œ๋ฒ„ ๋ Œ๋”๋ง ๋งˆํฌ์—…์€ ๋ชจ๋“  JavaScript๊ฐ€ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์‹คํ–‰๋˜์–ด ํ‘œ์‹œ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์™„์ „ํžˆ ๋ Œ๋”๋ง๋œ ํŽ˜์ด์ง€๋ฅผ ๋” ๋นจ๋ฆฌ ๋ณผ ์ˆ˜ ์žˆ์Œ.
  • ํ†ตํ•ฉ ์œ ์ง€๋ณด์ˆ˜ ๋ชจ๋ธ: ๋ฐฑ์—”๋“œ ํ…œํ”Œ๋ฆฟ ์‹œ์Šคํ…œ๊ณผ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ ์‚ฌ์ด๋ฅผ ์™”๋‹ค ๊ฐ”๋‹ค ํ•˜๋Š” ๋Œ€์‹ , ์ „์ฒด ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด ๋™์ผํ•œ ์–ธ์–ด์™€ ์„ ์–ธ์  ์ปดํฌ๋„ŒํŠธ ์ง€ํ–ฅ์˜ ์œ ์ง€๋ณด์ˆ˜ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋” ๋‚˜์€ SEO: CSR์—์„œ๋Š” HTML์— JavaScript๋ฅผ ์‹คํ–‰ํ•œ ํ›„์— ํŽ˜์ด์ง€๊ฐ€ ๋žœ๋”๋ง๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒ€์ƒ‰์—”์ง„์ด ํŽ˜์ด์ง€๋ฅผ ์ธ์‹ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ํ•˜์ง€๋งŒ SSR์€ ๋กœ๋”ฉ ์‹œ ์„œ๋ฒ„์—์„œ ์™„์ „ํ•œ HTML์„ ์ƒ์„ฑํ•˜์—ฌ ๋ณด๋‚ด์ฃผ๋‹ˆ ์ธ์‹ํ•˜๊ธฐ ์‰ฝ๋‹ค.

 

โ—‹ ๊ฐ„ํŽธํ•œ ๋ผ์šฐํŒ…

Next.js๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ธฐ๋ฐ˜์˜ ๋ผ์šฐํŒ…์„ ์ง€์›ํ•˜์—ฌ ํŽ˜์ด์ง€์™€ ๊ฒฝ๋กœ๋ฅผ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋ฅผ ํ†ตํ•ด ๋ณ„๋„์˜ ๋ผ์šฐํŒ… ์„ค์ • ์—†์ด๋„ ๊ฐ„ํŽธํ•˜๊ฒŒ ํŽ˜์ด์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

App
L cart
  L page.jsx
  L layout.jsx
L list
L mypage
L login

public
node_modules
package.json
...

 

์œ„์™€ ๊ฐ™์ด ํŒŒ์ผ๊ตฌ์กฐ๊ฐ€ ๋งŒ๋“ค์–ด์กŒ์„ ๋•Œ cart ํŽ˜์ด์ง€์— ์ ‘์†ํ•˜๊ณ  ์‹ถ์„ ๋•Œ์˜ url์€(localhost:3000 ๊ธฐ์ค€)

http://localhost:3000/cart

์ฆ‰, cart ํด๋” ์ด๋ฆ„ ์ž์ฒด๊ฐ€ url์ด ๋œ๋‹ค.(๋‹จ, ํŽ˜์ด์ง€ ์ด๋ฆ„์€ page ๋กœ ๊ณ ์ •)

 

โ—‹ CSR ๊ณผ SSR ์˜ ์ฐจ์ด์ ?

SSR

์žฅ์  : ํŽ˜์ด์ง€ ๋กœ๋“œ์‹œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ณ„๋กœ ํ•„์š”๊ฐ€ ์—†์–ด์„œ ๋น ๋ฆ„

๋‹จ์  : html ์•ˆ์—  JavaScript ๋ชป๋„ฃ๋Š”๋‹ค. onClick ์ด๋ฒคํŠธ, useState ๊น‰์€๊ฑฐ ๋ชป ์”€.

CSR

์žฅ์  : html ์•ˆ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ง˜๋Œ€๋กœ ๋„ฃ์–ด์„œ ๊ธฐ๋Šฅ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ

๋‹จ์  : JavaScript๋กœ ์ธํ•ด ํŽ˜์ด์ง€ ์šฉ๋Ÿ‰๋„ ์ปค์ง€๊ณ  ํŽ˜์ด์ง€ ๋กœ๋”ฉ์†๋„๋„ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Œ.(hydration ๊ณผ์ • ๋•Œ๋ฌธ)

hydration ์ด๋ž€ ? ๋œป์€ '์ˆ˜๋ถ„์„ ๋ณด์ถฉํ•œ๋‹ค' ๋œป์ธ๋ฐ html(๋ชธ)์— JS(์ˆ˜๋ถ„)์„ ๋„ฃ์–ด์•ผ ํŽ˜์ด์ง€๊ฐ€ ๋žœ๋”๋ง ๋•Œ๋ฌธ์— ๋กœ๋”ฉ์ด ๋А๋ ค์ง„๋‹ค.

 

โ—‹ index.html์ด ์—†๋‹ค?

์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์€ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ ํ•ด๋‹น ํŽ˜์ด์ง€์˜ HTML์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์ด HTML์€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ง์ ‘ ์ „์†ก๋˜์–ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ Œ๋”๋ง๋œ๋‹ค.
๋”ฐ๋ผ์„œ ๋ฏธ๋ฆฌ ์ •์ ์ธ index.html ํŒŒ์ผ์„ ์„œ๋ฒ„์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์„œ๋ฒ„๋Š” ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ํŽ˜์ด์ง€์˜ HTML์„ ์ƒ์„ฑํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „์†กํ•˜๋‹ˆ๊นŒ index.html ํŒŒ์ผ์ด ์—†์Œ.

 

โ—‹ Next.js๊ฐ€ SSR์ด์ง€๋งŒ CSR์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

'use client' ๋ฅผ page.jsx ์ตœ์ƒ๋‹จ์— ๋„ฃ์œผ๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅ(์—†์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ server side rendering)
๊ทธ๋ž˜์„œ ํฐ page๋“ค์€ server component๋กœ ๋งŒ๋“ค๊ณ  JS  ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ ํŽ˜์ด์ง€๋Š” client component ๋กœ ๋งŒ๋“ค์–ด์„œ ์ง„ํ–‰

 

//cart/page.jsx

'use client'

  function Cartitem ({){
    return(
        <div>
          <h2>Products</h2>
	    </div>
  }