10,000 Hour Rule

๊พธ์ค€ํžˆ, ์ฒœ์ฒœํžˆ ๊ธฐ๋กํ•˜์ž

Next.JS

[Next.js] Next.js์˜ Page๊ฐ„ ํƒ์ƒ‰

Dochi.Dev 2021. 9. 22. 22:53

๐Ÿงญ ํด๋ผ์ด์–ธํŠธ ์ธก ํƒ์ƒ‰(Client-Side Navigation)

<Link> ์ปดํฌ๋„ŒํŠธ๋Š” Next.js ์•ฑ์˜ ๋‘ ํŽ˜์ด์ง€ ๊ฐ„์˜ ํด๋ผ์ด์–ธํŠธ ์ธก ํƒ์ƒ‰(Client-Side Navigation)์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

ํด๋ผ์ด์–ธํŠธ ์ธก ํƒ์ƒ‰์ด๋ผ ํ•จ์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋ณธ ํƒ์ƒ‰๋ณด๋‹ค ๋น ๋ฅธ JavaScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ์ „ํ™˜์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

 

Next.js ๊ณต์‹ ๋ฌธ์„œ์—๋Š” ์ด๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‚˜์™€์žˆ๋‹ค.

 

์™ผ์ชฝ์€ testํŽ˜์ด์ง€, ์˜ค๋ฅธ์ชฝ์€ test1ํŽ˜์ด์ง€์ด๋‹ค.

 

์œ„์˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ํŽ˜์ด์ง€๋ฅผ ๋‘๊ฐœ ๋งŒ๋“ค์–ด ๋†“๋Š”๋‹ค.

๋‚˜๋Š” test.js, test1.js ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์ฝ”๋”ฉํ–ˆ๋‹ค.

 

๋ธŒ๋ผ์šฐ์ €์˜ ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ์—์„œ background์ƒ‰์„ ์ž„์˜๋กœ aqua๋กœ ์ง€์ •ํ•œ ๋ชจ์Šต

์ด๋ ‡๊ฒŒ ๋ฐฐ๊ฒฝ์„ ์ž„์˜๋กœ ์ง€์ •ํ•˜๊ณ  ๋งํฌ๋ฅผ ๋ˆŒ๋Ÿฌ๋ณธ๋‹ค.

 

Link๋ฅผ ๋ˆŒ๋Ÿฌ์„œ test ์‚ฌ์ดํŠธ๋กœ ์ด๋™ํ•œ ๋ชจ์Šต

<Link>๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ์ด๋™ํ–ˆ์Œ์—๋„ ๋ฐฐ๊ฒฝ์ƒ‰์ด ์œ ์ง€๋˜๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋ณดํ†ต <a> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•œ๋ฒˆ ์ƒˆ๋กœ๊ณ ์นจ(refresh)๋˜๋ฉด์„œ ํŽ˜์ด์ง€๊ฐ€ ๋‹ค์‹œ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ(๋ฐฉ๊ธˆ ๋“  ์˜ˆ์‹œ์ฒ˜๋Ÿผ background ์ƒ‰์„ ์ง€์ •ํ•ด๋†“์œผ๋ฉด ์ง€์›Œ์ง)์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ,

Next.js์˜ <Link>๋Š” ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  ํด๋ผ์ด์–ธํŠธ ์ธก ํƒ์ƒ‰(Client-Side Navigation)์„ ์ž‘๋™์‹œํ‚จ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 


๐Ÿ› ๏ธ ์ฝ”๋“œ ๋ถ„ํ• (Code splitting) ๋ฐ prefetching

Next.js๋Š” ์ฝ”๋“œ ๋ถ„ํ• (Code splitting)์„ ์ž๋™์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๊ฐ ํŽ˜์ด์ง€๋Š” ํ•ด๋‹น ํŽ˜์ด์ง€์— ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๋กœ๋“œํ•œ๋‹ค.

ํ™ˆํŽ˜์ด์ง€(์ง€๊ธˆ ํ•„์š”ํ•œ ํŽ˜์ด์ง€๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ ๊ฐ™์Œ)๋ฅผ ๋žœ๋”๋งํ•  ๋•Œ ๋‹ค๋ฅธ ํŽ˜์ด์ง€์˜ ์ฝ”๋“œ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๋Š”๋‹ค.

์ด๋ ‡๊ฒŒ ํ•ด์„œ ์ˆ˜๋ฐฑ ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ๋น ๋ฅด๊ฒŒ ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

์š”์ฒญํ•œ ํŽ˜์ด์ง€์˜ ์ฝ”๋“œ๋งŒ ๋กœ๋“œํ•˜๊ฒŒ ๋˜๋ฉด ํŽ˜์ด์ง€๊ฐ€ ๊ฒฉ๋ฆฌ๋˜๋Š” ํšจ๊ณผ๊ฐ€ ์ผ์–ด๋‚˜์„œ ํŠน์ • ํŽ˜์ด์ง€์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด๋„

๋‚˜๋จธ์ง€ Application(๋‹ค๋ฅธ ํŽ˜์ด์ง€๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ ๊ฐ™์Œ)์—์„œ๋Š” ๊ณ„์† ์ž‘๋™ํ•˜๊ฒŒ ๋˜๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

(ํ…Œ์ŠคํŠธ ํ•ด๋ณด๋‹ˆ ํ•œ ํŽ˜์ด์ง€์—์„œ ์˜ค๋ฅ˜๋‚˜๋„ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋Š” ๋ฉ€์ฉกํžˆ ์ž‘๋™ํ•˜์˜€๋‹ค.)

 

๋˜ํ•œ, Next.js์˜ production build์—์„œ <Link> ์ปดํฌ๋„ŒํŠธ๊ฐ€  ๋ธŒ๋ผ์šฐ์ €์˜ ๋ทฐํฌํŠธ(Viewport)์— ๋‚˜ํƒ€๋‚  ๋•Œ๋งˆ๋‹ค

Next.js๋Š” Background์—์„œ <Link>๋กœ ์—ฐ๊ฒฐ๋œ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์˜จ๋‹ค.

๊ทธ๋ž˜์„œ <Link>๋ฅผ ํด๋ฆญํ•  ๋•Œ ์ด๋ฏธ ๋Œ€์ƒ ํŽ˜์ด์ง€์˜ ์ฝ”๋“œ๊ฐ€ Background์—์„œ ๋กœ๋“œ๋˜๊ณ  ํŽ˜์ด์ง€ ์ „ํ™˜์ด ๋ฐ”๋กœ๋ฐ”๋กœ ์ด๋ฃจ์–ด์ง€๊ฒŒ ๋œ๋‹ค. ์ด๊ฒƒ์„ prefetching์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น <Link>๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํŽ˜์ด์ง€๋ฅผ ๋ฏธ๋ฆฌ ๋กœ๋“œํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

<Link href='...' prefetch={false}>

<Link>๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋‹ค์Œ ํŽ˜์ด์ง€์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ prefetching์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ ์ด ๊ธฐ๋Šฅ์„ false๋กœ ๊บผ์ฃผ๋ฉด ๋œ๋‹ค.

 

์ฐธ๊ณ ๋กœ Next.js ์•ฑ ์™ธ๋ถ€์˜ ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ(๋˜๋Š” ํŽ˜์ด์ง€)๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ์‹ถ์œผ๋ฉด

<Link> ํƒœ๊ทธ ์—†์ด <a>ํƒœ๊ทธ๋งŒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  className๊ณผ ๊ฐ™์€ ํŠน์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, <Link> ํƒœ๊ทธ๊ฐ€ ์•„๋‹Œ <a> ํƒœ๊ทธ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

 

<Link> ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ๋” ์ž์„ธํ•œ ์„ค๋ช…์€ ์ด๊ณณ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.(์ถ”๊ฐ€๋กœ ๋ผ์šฐํŒ…์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์ด๊ณณ)