๐Ÿ“ƒ Front-End/Next.js

๐Ÿ“ƒ Front-End/Next.js

Next.js - ๋’ค๋กœ๊ฐ€๊ธฐ ํ•  ๋•Œ ์ด์ „ ์Šคํฌ๋กค ์œ„์น˜ ์œ ์ง€

_app.tsx const router = useRouter() useEffect(() => { window.history.scrollRestoration = 'auto' const cacheScrollPositions: Array = [] let shouldScrollRestore : null | {x: number; y: number} router.events.on('routeChangeStart', () => { cacheScrollPositions.push([window.scrollX, window.scrollY]) }) router.events.on('routeChangeComplete', () => { if (shouldScrollRestore) { const {x, y} = shouldScr..

๐Ÿ“ƒ Front-End/Next.js

Dynamic Routes

[slug] ๊ฐ’์€ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ๊ฒƒ ์ธ๊ฐ€? - pages/category/[slug].js slug ๊ฐ’์— ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋ณด์—ฌ์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. 1. useRouter Next.js ์—์„œ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ import { useRouter } from 'next/router' // ์„ ์–ธ const router = useRouter(); const { slug } = router.query; 1.1 category.js import { useRouter } from "next/router"; const CategorySlug = () => { const router = useRouter() const { slug } = router.query return ( Category {slu..

๐Ÿ“ƒ Front-End/Next.js

Next.js - Assets, Meta data, CSS

1. Assets 1.1 public ๋””๋ ‰ํ† ๋ฆฌ ์ •์  ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ ์ตœ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ์˜ public ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๋Š” public ํด๋”๊ฐ€ / ๋กœ ๋งค์นญ ๋ฉ๋‹ˆ๋‹ค. 1.2 ์ตœ์ ํ™” ๋˜์ง€ ์•Š์€ ์ด๋ฏธ์ง€ ๊ทธ๋Ÿฌ๋‚˜, ์ผ๋ฐ˜ HTML ์˜ img ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ž˜์˜ ์ƒํ™ฉ๋“ค์„ ์ˆ˜๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ํ™”๋ฉด ํฌ๊ธฐ์— ์ด๋ฏธ์ง€๊ฐ€ ๋ฐ˜์‘ํ˜•์œผ๋กœ ์ ์šฉ๋˜๋Š”์ง€ ๋‹ค๋ฅธ ํˆด ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ด๋ฏธ์ง€ ์ตœ์ ํ™” ๋ทฐํฌํŠธ์— ๋“ค์–ด๊ฐˆ ๋•Œ๋งŒ ์ด๋ฏธ์ง€ ๋กœ๋“œ ๋“ฑ ... ํ•˜์ง€๋งŒ, Next.js ๋Š” Image ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ฆ‰์‹œ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ œ๊ณต ํ•ฉ๋‹ˆ๋‹ค. 1.3 Image Component - ์ด๋ฏธ์ง€ ์ž๋™ ์ตœ์ ํ™” Next.js ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”๋„ ์ง€์› ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์กฐ์ •, ์ตœ์ ํ™”์™€ ์ตœ์‹  ์ด๋ฏธ์ง€ ํฌ๋ฉง (..

๐Ÿ“ƒ Front-End/Next.js

Next.js - Link

Next.js ์—์„œ๋Š” ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŽ˜์ด์ง€ ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ฐ˜๊ฐ€์›Œ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์œ ๋Š”, ์•ฑ ๋‚ด์—์„œ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํŠน์ • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ ์ž…๋‹ˆ๋‹ค. React ์—์„œ React router link ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๊ฒŒ ๋˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ƒˆ๋กœ๊ณ ์นจ์ด ๋ฐœ์ƒ ํ•ฉ๋‹ˆ๋‹ค. Link ํŽ˜์ด์ง€๊ฐ„์˜ ํƒ์ƒ‰์„ CSR์œผ๋กœ ์ง„ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Code Splitting์ด ํŽ˜์ด์ง€ ๋ณ„๋กœ ์ง„ํ–‰ ๋˜์–ด ๊ฐ ํŽ˜์ด์ง€์—์„œ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ํŽ˜์ด์ง€์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๋‚˜๋จธ์ง€ ์•ฑ์€ ์ •์ƒ ์ž‘๋™ ํ•ฉ๋‹ˆ๋‹ค. ๋ผ์šฐํŒ… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. next/link ๊ฐ€์žฅ ๋จผ์ € import ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ์„ค์น˜๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. import Link ..

๐Ÿ“ƒ Front-End/Next.js

Next.js - Routing

Next.js ์˜ Router ๋Š” file-system ๊ธฐ๋ฐ˜ file-system : ํŒŒ์ผ์„ ๋งŒ๋“ค๋ฉด ๊ทธ ์ฆ‰์‹œ ๋ผ์šฐํ„ฐ๋กœ ์ธ์ง€๋˜๊ณ  ์ฃผ์†Œ๊ฐ€ ๋งตํ•‘์ด ๋ฉ๋‹ˆ๋‹ค. pages/ src/pages/ ๋ฆฌ์•กํŠธ์—์„œ๋Š” ๋ณ„๋„์˜ Router ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜์ง€๋งŒ, Next.js ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต์„ ํ•ฉ๋‹ˆ๋‹ค. pages/ OR src/pages ๋‘˜ ์ค‘ ์šฐ์„ ์ˆœ์œ„๋Š”? ์šฐ์„ ์ˆœ์œ„๋Š” pages/ ๊ฐ€ ์šฐ์„  ์ž…๋‹ˆ๋‹ค. pages/index.js import Link from 'next/link' import { useEffect, useState } from 'react' export async function getStaticProps(){ console.log('server') return { props..

๐Ÿ“ƒ Front-End/Next.js

Next.js - Pre Rendering

1. React.js ์˜ ๋ฐฉ์‹ 1.1 ๊ธฐ์กด์˜ React ๋Š” CSR ๋ฐฉ์‹์œผ๋กœ ํ™”๋ฉด์„ ๋ Œ๋”๋ง ํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ํ™”๋ฉด์„ ์ง์ ‘ ๋ Œ๋”๋ง ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์œ ์ €๊ฐ€ ๋ณด๋Š” UI ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. React ๋กœ ๋งŒ๋“ค์–ด์ง„ ํ™”๋ฉด์˜ ๋ชจ๋“  ๊ฒƒ์€ HTML ์†Œ์Šค์ฝ”๋“œ ์•ˆ์— ๋“ค์–ด์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. React ๋กœ ๋งŒ๋“ค์–ด์ง„ ์•ฑ์„ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋กœ ํ™•์ธํ•˜๋ฉด, ํ•˜๋‚˜์˜ ๋งŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML ์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๋น„์–ด์žˆ๋Š” div ์œผ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ทธ ํ›„, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์š”์ฒญํ•ด์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ React.js ๋ฅผ ์‹คํ–‰ ์‹œํ‚ค๊ณ  ๊ทธ ๋‹ค์Œ ํ™”๋ฉด์ด ์œ ์ €์—๊ฒŒ ๋ณด์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 1.2 ๋งŒ์•ฝ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค๋ฉด? ์‚ฌ์šฉ์ž๋Š” ํ™”๋ฉด์ด ๋ Œ๋”๋ง ๋˜๋Š” ์‹œ๊ฐ„์„ ์˜ค๋ž˜ ๋™์•ˆ ๊ธฐ๋‹ค๋ ค์•ผ ํ•  ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ์ž๋ฐ”..

๐Ÿ“ƒ Front-End/Next.js

Next.js - Data Fetching

๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ, ํ™”๋ฉด์— ๋ฌด์—‡์ธ๊ฐ€๋ฅผ ๊ทธ๋ฆฌ๋ ค๋ฉด ์–ด๋””์„ ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. 1. SSR (Server Side Render) ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์š”์ฒญ์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ๋งค๋ฒˆ ์—ฐ์‚ฐ์„ ํ•ด์•ผํ•˜๋ฉฐ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ƒ๋Œ€์ ์œผ๋กœ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— SSG์— ๋น„ํ•ด ๋Š๋ฆฝ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•ญ์ƒ ์ตœ์‹ ์˜ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ์–ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ, SSR๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. (ํ”„๋ก ํŠธ)์„œ๋ฒ„์—์„œ HTML ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— CSR์— ๋น„ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๋” ๋น ๋ฅด๊ฒŒ ํ™”๋ฉด์„ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฒคํŠธ ๋“ฑ ํŽ˜์ด์ง€์˜ ๋™์ž‘์„ ์œ„ํ•ด์„œ๋Š” hydrate๋ผ๋Š” ๊ณผ์ •์„ ํ†ตํ•ด์„œ JS ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ฐ€ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ฆฐ๋‹ค : ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ฆ‰, ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๊ทธ๋ฆฐ๋‹ค...

๐Ÿ“ƒ Front-End/Next.js

React์˜ ๋ฌธ์ œ์ ๊ณผ NextJS์˜ ๋„์ž…

React์˜ ๋ฒˆ๊ฑฐ๋กœ์šด ๋ถ€๋ถ„ ๋ฆฌ์•กํŠธ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋นŒ๋“œํ•˜๋ ค๋ฉด ์‹ ๊ฒฝ ์จ์•ผํ•˜๋Š” ์„ธ๋ถ€์‚ฌํ•ญ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. Webpack์œผ๋กœ ๋ฒˆ๋“ค๋ง & Babel ์ปดํŒŒ์ผ๋Ÿฌ๋กœ JSX → JS ๋กœ ๋ณ€ํ™˜ ์ตœ์ ํ™” (Code Splitting ๋“ฑ)๋ฅผ ํ•ด์•ผํ•จ Static Pre-Rendering (์„ฑ๋Šฅ๊ณผ SEO๋ฅผ ์œ„ํ•ด) / SSR ๋˜๋Š” CSR ๋ฅผ ํ•ด์•ผํ•จ ๋ฆฌ์•กํŠธ ์•ฑ๊ณผ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์„œ๋ฒ„ ์ธก ์ฝ”๋“œ ์ž‘์„ฑ NextJS: React ํ”„๋ ˆ์ž„์›Œํฌ NextJS๋Š” React ์˜ ๋ฒˆ๊ฑฐ๋กœ์šด ์ ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ํ•ด๊ฒฐ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง๊ด€์ ์ธ ํŽ˜์ด์ง€ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ… (Dynamic routes ๋„ ์ง€์›ํ•จ) Pre-rendering, static generation (SSG), server-side rendering (SSR) ์ด ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ์ œ๊ณต๋จ ์ž..

HoHo.dev
'๐Ÿ“ƒ Front-End/Next.js' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก