Next.js ์ด๋?
๐ ๋ค์ด๊ฐ๋ฉฐ...
๋๋ ํ๋ก์ ํธ๋ฅผ ์ฃผ๋ก 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์ ์๋ฒ์์ ๋ง๋ค์ด์ค๋ค.
- ์ปจํ ์ธ ์ ๋๋ฌํ๋ ์๊ฐ ๋จ์ถ: ์ธํฐ๋ท ์๋๊ฐ ๋๋ฆฌ๊ฑฐ๋ ๊ธฐ๊ธฐ๊ฐ ๋๋ฆฐ ๊ฒฝ์ฐ ๋ ๋๋๋ฌ์ง๋๋ฐ ์๋ฒ ๋ ๋๋ง ๋งํฌ์ ์ ๋ชจ๋ 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>
}