Post

Nextjs-Optimizing(3) - Production Checklist(๋ฒˆ์—ญ)

๐Ÿ“Œ์‹œ์ž‘ํ•˜๋ฉฐ

Next.js ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฝ์„ ๋•Œ๋งˆ๋‹ค ๋А๋ผ๋Š” ๊ฑฐ์ง€๋งŒ ์ •๋ง ์‚ฌ๋žŒ์€ ์•„๋Š”๋งŒํผ ๋ณด์ด๊ณ , ์•„๋Š”๋งŒํผ ์“ฐ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.. ๐Ÿ˜… ํŠนํžˆ ์ด๋ ‡๊ฒŒ ์Šต๋“ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๊ฐ€ ๋งŽ์„ ๋•Œ๋Š” ๋‚ด๊ฐ€ ์ฒ˜ํ•ด์žˆ๋Š” ์ƒํ™ฉ์— ์–ด๋–ค ์ •๋ณด๊ฐ€ ๊ฐ€์žฅ ํ•„์š”ํ•œ์ง€ ๊ตฌ๋ณ„ํ•ด๋‚ด๋Š” ๊ฒƒ์ด ์ •๋ง ์–ด๋ ต์ง€๋งŒ ๊ผญ ํ•„์š”ํ•œ ์ผ์ด๊ธฐ๋„ ํ•˜๋‹ค.

์„œ๋ก ์ด ๊ธธ์—ˆ๋Š”๋ฐ, ์ตœ๊ทผ Optimizing ๊ด€๋ จ ๋ฌธ์„œ๋ฅผ ์ฝ๋‹ค๊ฐ€ ํƒ€๊ณ  ํƒ€๊ณ .. ๋“ค์–ด๊ฐ€๋‹ค ๋ณด๋‹ˆ ๋งŒ๋‚œ ๋„ˆ๋ฌด ์ข‹์€ ์ฑ•ํ„ฐ๊ฐ€ ์žˆ์–ด์„œ, ๋‚ด๊ฐ€ ์ฝ๊ธฐ ์ข‹๊ฒŒ ๋ฒˆ์—ญํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.. (์˜์—ญ/์˜ค์—ญ ๋‹น์—ฐํžˆ!! ์žˆ์„ ์ˆ˜ ์žˆ์Œ)

+ ๋‹จ์–ด์˜ ๋œป์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์„ ๋•Œ๊ฐ€ ์žˆ์–ด ์•„๋ž˜ ์šฉ์–ด ์„ค๋ช…์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค!

โœ…๋ฐฐํฌ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

Next.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ”„๋กœ๋•์…˜์œผ๋กœ ์ „ํ™˜ํ•˜๊ธฐ ์ „์—, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜, ์„ฑ๋Šฅ ๋ฐ ๋ณด์•ˆ์„ ์œ„ํ•ด ๊ตฌํ˜„ํ•ด์•ผ ํ•  ์ตœ์ ํ™” ํŒจํ„ด์ด ์žˆ๋‹ค.


1๏ธโƒฃ ์ž๋™ ์ตœ์ ํ™”

์•„๋ž˜๋Š” Next.js๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ์ตœ์ ํ™” ๋ชฉ๋ก์œผ๋กœ, ๋ณ„๋„๋กœ ํ™œ์„ฑํ™”ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

๐Ÿ”น Server Components
Next.js๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋Š” ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋˜๋ฉฐ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ”น Code Splitting
์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด route segments์— ๋”ฐ๋ผ ์ž๋™ code splitting์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ, ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ lazy loading ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๐Ÿ”น Prefetching
์‚ฌ์šฉ์ž ๋ทฐํฌํŠธ์— ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ๋กœ ๊ฐ€๋Š” Link๊ฐ€ ๋“ค์–ด์˜ค๋ฉด, Next.js๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ํ•ด๋‹น ๊ฒฝ๋กœ๋ฅผ prefetcing ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, ์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ์˜ ํƒ์ƒ‰์ด ์ฆ‰๊ฐ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๊ฒŒ ๋œ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ”„๋ฆฌํŒจ์นญ์„ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”น Static Rendering
Next.js๋Š” ์„œ๋ฒ„์—์„œ ๋นŒ๋“œ ํƒ€์ž„์— ์„œ๋ฒ„ ๋ฐ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜๊ณ , ๋ Œ๋”๋ง๋œ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•œ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํŠน์ • ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ๋™์  ๋ Œ๋”๋ง์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”น Caching
Next.js๋Š” ๋ฐ์ดํ„ฐ ์š”์ฒญ, ์„œ๋ฒ„ ๋ฐ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ, static assets ๋“ฑ์„ ์บ์‹œํ•˜์—ฌ ์„œ๋ฒ„, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์ˆ˜๋ฅผ ์ค„์ธ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์บ์‹ฑ์„ ํ•ด์ œํ•  ์ˆ˜ ์•˜๋‹ค.

์ด๋Ÿฐ ๊ธฐ๋ณธ ๊ฐ’์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ณ  ๊ฐ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์‹œ ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์–‘๊ณผ ๋น„์šฉ์„ ์ค„์ด๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค.

2๏ธโƒฃ ๊ฐœ๋ฐœ ์‹œ ์ง„ํ–‰ํ•  ๋‚ด์šฉ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ๋•Œ ์ตœ์ƒ์˜ ์„ฑ๋Šฅ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

โค Routing and Rendering

๐Ÿ”น Layouts
๋ ˆ์•„์ด์›ƒ์„ ์‚ฌ์šฉํ•ด ํŽ˜์ด์ง€ ๊ฐ„ UI๋ฅผ ๊ณต์œ ํ•˜๊ณ  ํŽ˜์ด์ง€ ์ด๋™์‹œ ๋ถ€๋ถ„ ๋ Œ๋”๋ง์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

๐Ÿ”น Link ์ปดํฌ๋„ŒํŠธ
ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๊ฒŒ ํ•˜๊ฑฐ๋‚˜ prefetcing์„ ์œ„ํ•ด <Link> ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ”น Error Handling
์‚ฌ์šฉ์ž ์ง€์ • ์˜ค๋ฅ˜ ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํฌ๊ด„์ ์ธ ์˜ค๋ฅ˜, 404 ์˜ค๋ฅ˜๋ฅผ ์šฐ์•„ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•œ๋‹ค.

๐Ÿ”น Composition Patterns
์„œ๋ฒ„, ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ๊ถŒ์žฅํ•˜๋Š” ๊ตฌ์„ฑ ํŒจํ„ด์„ ๋”ฐ๋ฅด๊ณ , ํด๋ผ์ด์–ธํŠธ ์ธก์˜ JS ๋ฒˆ๋“ค์ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.

๐Ÿ”น Dynamic APIs
cookie ๋ฐ searchParams ์†์„ฑ๊ณผ ๊ฐ™์€ ๋™์  API๋Š” ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ๋™์  ๋ Œ๋”๋ง์œผ๋กœ ์„ค์ •ํ•จ์— ์ฃผ์˜ํ•œ๋‹ค.(๋งŒ์•ฝ ๋ฃจํŠธ ๋ ˆ์ด์•„์›ƒ์—์„œ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ „์ฒด์ ์œผ๋กœ ๋™์  ๋ Œ๋”๋ง์ด ๋œ๋‹ค.) ๋ณธ์ธ์ด ๋™์  API๋ฅผ ์˜๋„์ ์œผ๋กœ ์‚ฌ์šฉํ–ˆ์Œ์„ ํ™•์ธํ•˜๊ณ , <Suspense>๋กœ ๊ฐ์‹ผ๋‹ค.

โœจGood to know Partial Prerendering (์‹คํ—˜ ๊ธฐ๋Šฅ)์„ ์‚ฌ์šฉํ•˜๋ฉด ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ๋™์  ๋ Œ๋”๋ง์œผ๋กœ ์„ ํƒํ•˜์ง€ ์•Š๊ณ , ๊ฒฝ๋กœ์˜ ์ผ๋ถ€๋ฅผ ๋™์ ์œผ๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿงก Data fetching and caching

๐Ÿ”นServer Components
์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ด์ ์„ ์‚ฌ์šฉํ•œ๋‹ค. ๐Ÿ”นRoute Handlers
๋ผ์šฐํ„ฐ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐฑ์—”๋“œ ๋ฆฌ์†Œ์Šค์•  ์ ‘๊ทผํ•œ๋‹ค. ๋‹จ ์ถ”๊ฐ€ ์„œ๋ฒ„ ์š”์ฒญ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ผ์šฐํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๐Ÿ”นStreaming
๋กœ๋”ฉ UI, React์˜ <Suspense>๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ UI๋ฅผ ์ ์ง„์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋„๋ก ํ•˜์—ฌ, ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋™์•ˆ ์ „์ฒด ๊ฒฝ๋กœ๊ฐ€ blocking ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค. ๐Ÿ”นParallel Data Fetching
์ ์ ˆํ•œ ๊ฒฝ์šฐ ๋ณ‘๋ ฌ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ fetchingํ•˜์—ฌ ๋„คํŠธ์›Œํฌ waterfalls(์ง€์—ฐ)์„ ์ค„์ธ๋‹ค. ๋˜ํ•œ ์ ์ ˆํ•œ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ๋กœ๋“œ์•Ÿ๋Š” ๊ฒƒ๋„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค. ๐Ÿ”นData Caching
๋ฐ์ดํ„ฐ ์š”์ฒญ์ด ์บ์‹œ๋˜๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ฐ€๋Šฅํ•˜๋ฉด ์บ์‹ฑ์„ ์„ ํƒํ•œ๋‹ค. ๋˜ํ•œ fetch๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์บ์‹ฑ์ด ์ ์šฉ๋˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ๐Ÿ”นStatic Images
public ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ static assets (์ด๋ฏธ์ง€ ๋“ฑ)์„ ์ž๋™์œผ๋กœ ์บ์‹ฑํ•œ๋‹ค.

๐Ÿ’› UI and accessibility

๐Ÿ”นForms and Validation
๐Ÿ”นFont Module
๐Ÿ”น<Image> Component
๐Ÿ”น<Script> Component
๐Ÿ”นESLint

๐Ÿ’š Security

๐Ÿ”นTainting
๐Ÿ”นServer Actions
๐Ÿ”นEnvironment Variables
๐Ÿ”นContent Security Policy

๐Ÿ’™ Metadata and SEO

๐Ÿ’œ Type safety

3๏ธโƒฃ ํ”„๋กœ๋•์…˜์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „

ํ”„๋กœ๋•์…˜์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— next build๋ฅผ ์‹คํ–‰ํ•ด ๋กœ์ปฌ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๊ณ  ๋นŒ๋“œ ์˜ค๋ฅ˜๋ฅผ ํŒŒ์•…ํ•œ ๋‹ค์Œ, next start๋ฅผ ์‹คํ–‰ํ•ด ํ”„๋กœ๋•์…˜๊ณผ ์œ ์‚ฌํ•œ ํ™˜๊ฒฝ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿงก Core Web vitals

๐Ÿ”น Lighthouse ์‹œํฌ๋ฆฟ ๋ชจ๋“œ์—์„œ Lighthouse๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ์‚ฌ์ดํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฒฝํ—˜ํ•˜๋Š”์ง€ ๋” ์ •ํ™•ํ•˜๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ฐœ์„ ํ•  ๋ถ€๋ถ„์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜๋œ ํ…Œ์ŠคํŠธ์ด๋ฏ€๋กœ Core Web Vitals ๊ฐ™์€ ํ•„๋“œ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๐Ÿ”น useReportWebVitals hook ์ด ํ›…์„ ์‚ฌ์šฉํ•ด Core Web Vitals๋ฅผ ๋ถ„์„ ํˆด์— ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’› Analyzing bundles

@next/bundle-analyzerํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š” ๋Œ€๊ทœ๋ชจ ๋ชจ๋“ˆ๊ณผ ์†์„ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ, ์ƒˆ๋กœ์šด ์ข…์†์„ฑ(dependencies)๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.

4๏ธโƒฃ ๋ฐฐํฌ ํ›„

์–ด๋””์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๊ฐœ์„ ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€์ ์ธ ๋„๊ตฌ๋‚˜ ํ†ตํ•ฉ ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

Vercel ๋ฐฐํฌ์˜ ๊ฒฝ์šฐ ์•„๋ž˜์˜ ์‚ฌํ•ญ์„ ๊ถŒ์žฅํ•œ๋‹ค.

๐Ÿ”น Analytics
๊ธฐ๋ณธ ์ œ๊ณต์œผ๋กœ ๋ถ„์„์šฉ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŠธ๋ž˜ํ”ฝ, ์ˆœ ๋ฐฉ๋ฌธ์ž ์ˆ˜, ํŽ˜์ด์ง€ ์กฐํšŒ์ˆ˜ ๋“ฑ์„ ์ดํ•ดํ•˜๋Š”๋ฐ ๋„์›€์„ ์ค€๋‹ค.

๐Ÿ”น Speed Insights
๋ฐฉ๋ฌธ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์‹ค์ œ ์„ฑ๋Šฅ ์ธ์‚ฌ์ดํŠธ๋กœ, ์›น์‚ฌ์ดํŠธ๊ฐ€ ํ˜„์žฅ์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์‹ค์งˆ์ ์ธ ์‹œ๊ฐ์„ ์ œ๊ณตํ•œ๋‹ค.

๐Ÿ”น Logging
๋Ÿฐํƒ€์ž„ ๋ฐ ํ™œ๋™ ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ณ . ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์• ์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค.๋Œ€์•ˆ์œผ๋กœ third-party ํˆด์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๊ณณ์„ ์ฐธ์กฐํ•œ๋‹ค.

โœจGood to know

Vercel์—์„œ ์‹ค์ œ ์„œ๋น„์Šค๋กœ ๋ฐฐํฌํ•  ๋•Œ ๊ผญ ํ™•์ธํ•ด์•ผ ํ•  ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ณ , ์›น์‚ฌ์ดํŠธ ์„ฑ๋Šฅ์„ ๋†’์ด๋Š” ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด Vercel Production Checklist๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

๐Ÿ‘€ ์ถ”๊ฐ€ ์šฉ์–ด ์„ค๋ช…

๐Ÿ”ธSegment URL ๊ฒฝ๋กœ์˜ ํŠน์ • ๋ถ€๋ถ„์„ ์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž.

  • https://example.com/products/123 ์ด๋ž€ ๊ฒฝ๋กœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ products์™€ 123์ด ๊ฐ๊ฐ ํ•˜๋‚˜์˜ segment ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • app router์—์„œ๋Š” app ํด๋” ์•„๋ž˜ url์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ํด๋” ํ•˜๋‚˜๊ฐ€ ๊ฒฝ๋กœ์˜ segment๊ฐ€ ๋œ๋‹ค.

๐Ÿ”ธPartial Rendering Parial Rendering์€ ๋ณ€๊ฒฝ๋˜๋Š” route segments๋งŒ client์—์„œ re-render ๋˜๊ณ , ๊ณต์œ  segments๋Š” ์œ ์ง€๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž.

  1. /dashboard/settings์™€ /dashboard/analytics๊ฐ„ ๋‚ด๋น„๊ฒŒ์ด์…˜์„ ์‹œ๋„ํ•œ๋‹ค.
  2. ์ด ๊ณผ์ •์—์„œ /settings๋Š” unmount ๋˜๊ณ , /analytics๋Š” ์ƒˆ ์ƒํƒœ๋กœ ๋งˆ์šดํŠธ ๋œ๋‹ค.
  3. ์ด ๋–„, /dashboard ์˜ ๋ ˆ์ด์•„์›ƒ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ ๋œ๋‹ค.
  4. 1~3๋ฒˆ ๊ณผ์ •์€ /blog/[slug]/page์™€ ๊ฐ™์€ ๋™์  segment ์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค.

๐Ÿ”ธPrefetcing

  • Prefetcing์€ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฝ๋กœ๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ธฐ ์ „ ๋ฐฑ๊ทธ๋ผ์šด๋ฐ์—์„œ ๊ฒฝ๋กœ๋ฅผ ๋ฏธ๋ฆฌ ๋กœ๋“œํ•œ๋‹ค.
  • Next.js ์—์„œ ๊ฒฝ๋กœ๋ฅผ Prefetcingํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.
    • <Link> ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉํ•˜๊ธฐ
      • route๊ฐ€ ์‚ฌ์šฉ์ž์˜ ๋ทฐํฌํŠธ์— ํ‘œ์‹œ๋  ๋•Œ ์ž๋™์œผ๋กœ prefetcing ๋œ๋‹ค. (์ฒ˜์Œ ๋“ค์–ด์™”์„ ๋•Œ / ์Šคํฌ๋กค ํ•ด์„œ ๋ทฐํฌํŠธ์— ํ‘œ์‹œ๋  ๋•Œ ๋“ฑ)
    • router.prefetch() ์‚ฌ์šฉํ•˜๊ธฐ
      • useRouter ํ›…์„ ์‚ฌ์šฉํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

โœจGood to know

  • Prefetcing์€ development์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ , production์ผ ๋•Œ๋งŒ ๊ฐ€๋Šฅํ•จ์— ์ฃผ์˜ํ•œ๋‹ค!
  • <Link> ์ปดํฌ๋„ŒํŠธ์˜ ๋” ์ž์„ธํ•  ์„ค๋ช…์€ ์ด์ชฝ์—์„œ ํ™•์ธํ•œ๋‹ค.

๐Ÿ”ธStatic Rendering

  • Static Rendering(์ •์  ๋ Œ๋”๋ง)์—์„œ๋Š” date Fetching๊ณผ rendering์ด ์„œ๋ฒ„์—์„œ ๋นŒ๋“œ ํƒ€์ž„ ๋˜๋Š” data revalidating(๋ฐ์ดํ„ฐ ์žฌ๊ฒ€์ฆ)์‹œ ์ผ์–ด๋‚œ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฉ๋ฌธํ•  ๋•Œ ๋งˆ๋‹ค ์บ์‹œ๋œ ๊ฒฐ๊ณผ๊ฐ€ ์ œ๊ณต๋œ๋‹ค.
  • ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    • ๋” ๋น ๋ฅธ ์›น์‚ฌ์ดํŠธ
      • ๋ฏธ๋ฆฌ ๋ Œ๋”๋ง ๋œ ์ฝ˜ํ…์ธ ๋ฅผ Vercel๊ณผ ๊ฐ™์€ ํ”Œ๋žซํผ์— ๋ฐฐํฌํ•˜๋ฉด, ์บ์‹ฑํ•˜์—ฌ ์ „ ์„ธ๊ณ„์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์–ด ์ „ ์„ธ๊ณ„ ์‚ฌ์šฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ์˜ ์ฝ˜ํ…์ธ ์— ๋” ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์„œ๋ฒ„ ๋ถ€ํ•˜ ๊ฐ์†Œ
      • ์ฝ˜ํ…์ธ ๊ฐ€ ์บ์‹œ๋˜๋ฏ€๋กœ, ๊ฐ๊ฐ์˜ ์‚ฌ์šฉ์ž๋“ค ์š”์ฒญ์— ์ผ์ผํžˆ ์ฝ˜ํ…์ธ ๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์–ด ์ปดํ“จํŒ… ๋น„์šฉ์„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
    • SEO
      • ๋ฏธ๋ฆฌ ๋ Œ๋”๋ง ๋œ ์ฝ˜ํ…์ธ ๋Š” ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“ค ๋  ๋•Œ ์ด๋ฏธ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด, ๊ฒ€์ƒ‰ ์—”์ง„ ํฌ๋กค๋Ÿฌ๊ฐ€ ์ƒ‰์ธ์„ ์ƒ์„ฑํ•˜๊ธฐ ๋” ์‰ฌ์›Œ ๊ฒ€์ƒ‰ ์—”์ง„ ์ˆœ์œ„ ํ–ฅ์ƒ์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ์ •์  ๋ Œ๋”๋ง์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ฑฐ๋‚˜, ์‚ฌ์šฉ์ž๋“ค์ด ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์žˆ๋Š” UI (๋ธ”๋กœ๊ทธ, ์ƒํ’ˆ ํŽ˜์ด์ง€ ๋“ฑ)์— ์œ ์šฉํ•˜๋‹ค.
  • ์ •๊ธฐ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๊ฑฐ๋‚˜, ๊ฐœ์ธํ™” ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๋Œ€์‹œ๋ณด๋“œ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค.

๐Ÿ”ธDynamic Rendering

  • Dynmaic Rendering(๋™์  ๋ Œ๋”๋ง)์—์„œ๋Š” ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ด ๋ฐœ์ƒํ•  ๋•Œ (์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ) ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง ๋œ๋‹ค.
  • ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    • ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ
      • ๋™์  ๋ Œ๋”๋ง์„ ์‚ฌ์šฉํ•˜๋ฉด ์‹ค์‹œ๊ฐ„์œผ๋กœ, ํ˜น์€ ์ž์ฃผ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์–ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹๋‹ค,.
    • ์‚ฌ์šฉ์ž๋ณ„ ์ฝ˜ํ…์ธ 
      • ๋Œ€์‹œ๋ณด๋“œ๋‚˜ ์‚ฌ์šฉ์ž ํ”„๋กœํ•„๊ณผ ๊ฐ™์€ ๊ฐœ์ธํ™” ๋œ ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณตํ•˜๊ณ , ์‚ฌ์šฉ์ž ์ƒํ˜ธ ์ž‘์šฉ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ ๋” ์‰ฌ์›Œ์ง„๋‹ค.
    • ์š”์ฒญ ์‹œ์ ์—์„œ์˜ ์ •๋ณด
      • ๋™์  ๋ Œ๋”๋ง์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฟ ํ‚ค๋‚˜ URL ๊ฒ€์ƒ‰ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๊ฐ™์ด ์š”์ฒญ ์‹œ์ ์—๋งŒ ์•Œ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ—‚๏ธ์ฐธ๊ณ  ์‚ฌ์ดํŠธ

This post is licensed under CC BY 4.0 by the author.