๐ Overview
ย Next.js ๋ฅผ ์ด์ฉํด ํ๋ก ํธ์๋ ์ค์ต์ ์งํ ์ค, ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ด ์๊ฒผ๋ค. ํ์๊ฐ ์๊ณ ์๋ SSR ๊ณผ CSR ์ ๊ฐ๋
์ด ์ค์ต ์ค ํผ๋์ ์ผ์ผํค๊ธฐ ์์ํ๋ค.
ย ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ ์๋ฒ ์ธก์์ ๋ ๋๋ง์ ํด์ ๋ณด์ฌ์ฃผ๋ ๊ฑฐ๊ณ , ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง์ ๋ธ๋ผ์ฐ์ ์์ ๋ ๋๋ง์ ํด์ ๋ณด์ฌ์ค๋ค ๋ผ๊ณ ๋ง ์ดํดํ๊ณ ์์๋ค.
๊ทธ๋ฌ๋ค๋ณด๋, ' Next.js ์์ JSX ์ JavaScript ๋ฅผ ์ฌ์ฉํด์ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด CSR ์ด๋ค' ๋ผ๊ณ ์๋ชป ์ดํดํ๊ณ ์์๋ค.
ย ์๋ชป๋ ์ ๋ณด์ ๋ํ ์ธ์์ ๊ฐ์ ํ ๊น์, ์ดํ์๋ ์ ๋ ํท๊ฐ๋ฆฌ์ง ์๋๋ก ๊ด๋ จ ๊ฐ๋
์ ๋ํ ๊ธฐ๋ก์ ๋จ๊ฒจ๋๊ธฐ๋ก ํ๋ค.
1๏ธโฃ SSR
- Server-Side Rendering - ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง
- ์๋ฒ์์ ์น ํ์ด์ง ๋ ๋๋ง์ ๋ด๋น
- ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ํ์ด์ง๋ฅผ ์์ฒญ๋ฐ์ผ๋ฉด ์์ฑ๋ ์ ์ + ๋์ HTML ํ์ผ์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํ
- ๊ธฐ๋ณธ์ ์ธ ์ ์ ๋ฐ์ดํฐ์ธ
HTML , JSX ํ์ผ์ ๊ทธ๋๋ก ๋ฐํ
- ์๋ฒ์ ๋์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๊ฒฝ์ฐ, ํด๋น
API ๋ฅผ ํธ์ถํ ํ์ ์๋ต๊ฐ(๋์ ๋ฐ์ดํฐ) ๋ํ HTML, JSX ํ์ผ์ ๋ด์์ ๋ฐํ
- ์ฆ, ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์ฑ์ ๋ฃ์ ์์ ํ
HTML ํ์ผ ๋ฐํ
- ์๋ฒ ๋ฐ์ดํฐ ๊ธฐ๋ฐ
UI ๊ตฌ์ฑ ๋ด๋น
โ ์ฅ์
- ๋น ๋ฅธ ์ด๊ธฐ ๋ก๋ฉ ์ฑ๋ฅ
HTML ํ์ผ ์์ฒด๊ฐ ๋ชจ๋ ์ปจํ
์ธ ๋ฅผ ์ด๋ฏธ ํฌํจ
- ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )๋ ์ด ํ์ด์ง๋ฅผ ๋ฐ๋ก ๋ ๋๋งํ๊ธฐ๋ง ํ๋ฉด ๋จ
- SEO ์ต์ ํ
- ๊ฒ์ ์์ง ํฌ๋กค๋ฌ๊ฐ ํ์ด์ง์ ๋ชจ๋ ์ฝํ
์ธ ๋ฅผ ์ฝ๊ฒ ์ฝ์ ์ ์์
- ํน์ ํค์๋์ ๋ํ ๊ฒ์ ๊ฒฐ๊ณผ ๋
ธ์ถ์ ์ ๋ฆฌ
โ ๋จ์
- ๋๋ฆฐ ํ์ด์ง ์ ํ ์๋
- ํ์ด์ง ์ด๋ ์๋ง๋ค, ์๋ฒ๋
HTML ์ ์๋ก ๋ ๋๋ง ํ ์ ์ก
- ๋ก์ง ์ฒ๋ฆฌ์ ์๊ฐ์ด ๋ค์ ์์๋๋ค๋ฉด, ์๋ต๋ฐ๊ธฐ ์ ๊น์ง ํ์ด์ง ๋ก๋ฉ
- ์ด๋ ๋ถ์พํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ด๋
- ์๋ฒ ๋ถํ์ ์ฆ๊ฐ
- ๋งค๋ฒ ์๋ฒ
API ๋ฅผ ํธ์ถํ๋ฏ๋ก, ์๋ฒ ํธ์ถ ํ์ ์ฆ๊ฐ
- ํธ๋ํฝ์ด ๋ง์์๋ก ์๋ฒ ์์์ ๋ง์ด ์๋ชจ
- ์๋ฒ ๋ถํ๋ก ์ธํ ์ฑ๋ฅ ์ ํ, ์ฌํ๋ฉด ์๋ฒ ๋ค์ด๊น์ง ์ด๋
2๏ธโฃ CSR
- Client-Side Rendering - ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง
- ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์์ ํ์ด์ง ๋ ๋๋ง์ ๋ด๋น
- ์น ํ์ด์ง์ ๋ชจ๋ ๊ตฌ์ฑ ์์๊ฐ
JavaScript ์ ์ํด ๋์ ์ผ๋ก ์์ฑ
UX ๋ฐ ์ฌ์ฉ์ ์ธํฐ๋ ์
๋ด๋น
โ ์ฅ์
- ๋น ๋ฅธ ํ์ด์ง ์ ํ
- ์๋ฒ
API ํธ์ถ ์ด์ ์ ํ์ด์ง๋ฅผ ๋จผ์ ๋ ๋๋ง
- ์ฆ, ์๋ฒ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๊ธฐ๋ ์ด์ ์, ๋ฐ๋ก
UI ์ ๋จผ์ ์ ์ฉ
- ๋๊ด์ ์
๋ฐ์ดํธ
- ํ๋ถํ ์ฌ์ฉ์ ๊ฒฝํ
- ์ฌ์ฉ์์๊ฒ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณต
- ์ฌ์ฉ์์
UX ๊ทน๋ํ
โ ๋จ์
- ์ด๊ธฐ ๋ก๋ฉ ์๋ ์ ํ
CSR ์ ์ฌ์ฉ์์๊ฒ ํด๋น ์ปดํฌ๋ํธ์ JavaScript ๋ฅผ ๋ชจ๋ ์ ์ก
- ์ปดํฌ๋ํธ๊ฐ ๋ง์์ง์๋ก ์ด๊ธฐ ๋ค์ด๋ก๋ ์ฉ๋ ์ฆ๊ฐ
- ์๋ฒ๋ก๋ถํฐ ๋ฐ์
HTML ์ JavaScript ๋ฅผ ์ฐ๊ฒฐํ์ฌ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋ก
- ์ด๋ฅผ ํ์ด๋๋ ์ด์
์ด๋ผ๊ณ ํจ
- ํ์ด๋๋ ์ด์
์ ํ์ํ ์์
์ฆ๊ฐ๋ก ์ธํ ์ธํฐ๋์
์์ ์๊ฐ ์ฆ๊ฐ
- SEO ํจ์จ์ฑ ๊ฐ์
JavaScript ๊ธฐ๋ฐ์ด๋ฏ๋ก, ์์ฑ๋ HTML ํ์ผ์ ์ ๊ณตํ๋ SSR ๋ฐฉ์์ ๋นํด ๋ฎ์ ํจ์จ
๐ก ๋๊ด์ ์
๋ฐ์ดํธ์ ์ด๋ฉด
- ๊ฐ์ ์๋๋ฆฌ์ค
1) ์ฌ์ฉ์๊ฐ ์ข์์ ๋ฒํผ ํด๋ฆญ
2) ์ข์์ ์ซ์ ์ฆ๊ฐ ๋ฐ ๋ฒํผ ์กํฐ๋ธ UI ์ ๊ณต
3) ์๋ฒ API ํธ์ถ
4) API ๋ 10๋ถ ๋๊ธฐ ํ ํด๋น ๋ก์ง ์คํ
5) 10๋ถ ํ ํด๋น ๋ก์ง ์ํ ์ค ์๋ฌ ๋ฐ์
6) ์ข์์ ํด๋ฆญ ์ธํฐ๋ํธ ์ด๊ธฐํ ๋ฐ ์๋ฌ ๋ฉ์์ง ํ์
- ์ด์ฒ๋ผ, ๋น ๋ฅธ ๋ฐ์์ฑ์ ์ ๊ณตํ๋ ๋๊ด์ ์
๋ฐ์ดํธ์ด์ง๋ง ์ถํ ์๋ฌ ๋ฐ์ ์ ๋ค๋ฆ์ ์๋ฌ ์๋ต ๋ฐ์
- ์ด์ ๋ฐ๋ฅธ ๋ถ์พํ ์ฌ์ฉ์ ๊ฒฝํ ์ ๊ณต
โ๏ธ ํด๊ฒฐ ๋ฐฉ์
- ํ์์์ ์ค์
- ์๋ฒ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ ์ต๋ ์๊ฐ ์ค์
UX ์ ํ ๋ฐฉ์ง๋ฅผ ์ํด, ๋ฉ๋ํ ์ ๋์ ์ฒ๋ฆฌ ์๊ฐ ํ๋ ์ค์
- ๋ก๋ฉ ์ํ ์ฌ์ฉ
- ์๋ฒ ์๋ต์ด ์ค๊ธฐ ์ ๊น์ง, ํ์ด์ง์ ๋ก๋ฉ ์ค์์ ์๋ฆฌ๋ ์ํ ์ถ๊ฐ
- ๋น ๋ฅธ ์๋ต์ฑ์ด๋ผ๋ ์ฅ์ ์ ๋ก๋ฉ ์ค ์ํ ํ์์ ์ฌ์ฉํ์ง๋ง, ๊ทธ๋งํผ ์์ ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ ์ ๊ณต
- ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฌ์๋
- ์๋ฒ ์์ฒญ ์คํจ์, ์๋ฌ ํ์ ๋์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์์ฒญ ์๋ ์ฌ์๋
3๏ธโฃ SPA (Single-Page Application)
- ๋จ์ผ ํ์ด์ง ์ดํ๋ฆฌ์ผ์ด์
- ํ์ด์ง ์ด๋ ์๋ง๋ค ์๋ฒ์ ์ ์ฒด ํ์ด์ง๋ฅผ ์์ฒญํ๋ ๊ธฐ๋ณธ ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ, ์ต์ด ํ์ด์ง ์ ๊ทผ ํ ๋ฒ๋ง ์ ์ ๋ฆฌ์์ค๋ฅผ ๋ค์ด๋ก๋
- ์ดํ ์ํธ์์ฉ ๋ฐ์์, ํ์ด์ง ์๋ก๊ณ ์นจ์ ํ์ง ์๊ณ
JavaScript ๋ก ํ์ํ ๋ฐ์ดํฐ๋ง ์๋ฒ์์ ๋น๋๊ธฐ์ ์ผ๋ก ํธ์ถ
- ๋ธ๋ผ์ฐ์ ์บ์ฑ์ ํตํด ๋ค์ด๋ก๋ ๋ฆฌ์์ค๋ค์ ์ฌํ์ฉ
- ์ฒซ ๋ก๋ฉ์ ๋๋ฆด ์ ์์ด๋, ์ดํ ํ์ด์ง ์ ํ์ ๋งค์ฐ ๋น ๋ฆ
- ์ด๋ ๊ฒ ๋์ ์
๋ฐ์ดํธ ๋ ๋๋ง ์ํ
CSR ๋ฐฉ์์ ๊ทน๋ํํ ์น ์ ํ๋ฆฌ์ผ์ด์
ํํ
4๏ธโฃ Next.js ์์์ ๋ ๋๋ง
Next.js ๋ SSR ๊ณผ CSR ์ ํจ๊ป ์ฌ์ฉํ๋ ํ์ด๋ธ๋ฆฌ๋
- "use client" ์ฌ์ฉ ์ ๋ฌด์ ๋ฐ๋ผ
SSR ๊ณผ CSR ์ ๊ตฌ๋ถ
- "use client" ์ฌ์ฉ :
CSR - ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ๋ ๋๋ง
- "use client" ๋ฏธ์ฌ์ฉ :
SSR - ์๋ฒ ์ปดํฌ๋ํธ ๋ ๋๋ง
๐ "use client"
- ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก ์ ์ํ๋ค๋ ์๋ฏธ
- ๋ธ๋ผ์ฐ์ ๋ง ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๋ ์ฌ์ฉ
- React Hooks์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- ex)
use() , useEffect() , useRouter() ...
JavaScript ๋ก ๋ฑ๋ก๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ
- ex)
onClick() , onSubmit() , onChange() ...
- ๋ธ๋ผ์ฐ์
API๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- ex)
window.scrollTo() , document.title ...
๐ก a ๐ router ๐ Link
JavaScript ์์๋ Link ๋ <a> , router ๋ฑ์ผ๋ก ํ์ด์ง ์ด๋ ์ง์
๐ฅ <a>
- ๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ ๋งํฌ ๋์
- ํด๋ฆญ ์ ์๋ฒ์ ์๋ก์ด ํ์ด์ง ์์ฒญ
- ์๋ฒ๋ ํด๋น ํ์ด์ง์ ์๋ก์ด HTML ์๋ต
SSR
- ํ์ด์ง ์ด๋ ์ดํ, ํด๋น ํ์ด์ง์ "use client" ์ ๋ฌด์ ๋ฐ๋ผ
CSR ์ถ๊ฐ
- ์ฆ,
SSR ๋ก ์์ํ์ฌ ํ์์ ๋ฐ๋ผ CSR ์ถ๊ฐ๋ก ์ฌ์ฉ์ ์ธํฐ๋์
์ ๊ณต
๐ฅ router
- JavaScript ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด๋ถ์์ ์ฌ์ฉ
- ํ์ด์ง ์ ์ฒด๋ฅผ ์๋ก๊ณ ์นจํ๋ ๊ฒ ์๋๋ผ, ํ์ํ ๋ฐ์ดํฐ๋ง ํธ์ถํ์ฌ ํ์ด์ง ์
๋ฐ์ดํธ
CSR
- ์ฆ,
CSR ๋ก ์์ํ์ฌ ์ฌ์ฉ์ ์ธํฐ๋์
์ผ๋ก ์ธํด ํ์ด์ง๊ฐ ์ด๋๋๊ณ , ์ดํ SSR ๋ก ์๋ก์ด ์ฝํ
์ธ ์๋ต
๐ฅ <Link>
SPA ๋ฐฉ์์ ํ์ด์ง ์ด๋ ์ง์
- ํด๋ฆญ ์ ์๋ก์ด ํ์ด์ง ์์ฒญ์ด ์๋,
Next.js ๊ฐ ๋ฏธ๋ฆฌ ๋ค์ด๋ก๋ํด ๋ ํ์ํ JavaScript ๋ฐ ๋ฐ์ดํฐ๋ง์ผ๋ก ํ์ด์ง ์
๋ฐ์ดํธ
- ์ด๋ ๊ฒ ๋ค์ด๋ก๋ ๋ฆฌ์์ค๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ์ ธ์ค๋ ๊ฒ์ ํ๋ฆฌํจ์นญ(Prefetching) ์ด๋ผ๊ณ ํจ
router ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ก๊ณ ์นจ ์์ด ํ์ด์ง ์ ํ
SSR + CSR (ํ์ด๋ธ๋ฆฌ๋)
SSR ๋ก ์ด๊ธฐ ํ์ด์ง ๋ ๋๋ง ์ดํ, <Link> ํ์ด์ง ์ด๋ ์์๋ CSR ๋ก ๋ถ๋๋ฌ์ด ํ์ด์ง ์ ํ
Next.js ์ ๊ธฐ๋ณธ ์ ๊ณต ๋ ๋๋ง ๋ฐฉ์์ผ๋ก, SPA ์ ์ฅ์ ๋ค์ ๋ชจ๋ ๋๋ฆด ์ ์์
๊ฒ์) Google Gemini ( https://gemini.google.com/app )