๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐Ÿ‘‰ Front-end

๐ŸŽˆ Webpack์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?โ€‹

์›น ์‚ฌ์ดํŠธ๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ js, css, images ํŒŒ์ผ๋“ฑ ์ˆ˜ ๋งŽ์€ ํŒŒ์ผ๋“ค์ด ๋ชจ์—ฌ ์›น์‚ฌ์ดํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์›น ์‚ฌ์ดํŠธ์— ์ ‘์†ํ–ˆ์„ ๋•Œ ๊ต‰์žฅํžˆ ๋งŽ์€ ํŒŒ์ผ์ด ๋‹ค์šด๋กœ๋“œ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๊ฒƒ์— ๋น„๋ก€ํ•˜์—ฌ ์„œ๋ฒ„์˜ ์ž์›์„ ์†Œ๋ชจํ•˜๊ณ  ์›น์‚ฌ์ดํŠธ๊ฐ€ ๋Š๋ฆฌ๊ฒŒ ๋กœ๋”ฉ๋ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ, ๋งŽ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒจํ‚ค์ง€๋“ฑ์„ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ๊ฐ๊ฐ์˜ ์„œ๋กœ์˜ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋“ค์ด ์„œ๋กœ ๊ฐ™์€ ์ด๋ฆ„์ด๋‚˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊นจ์ง€๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋Ÿฌํ•œ ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ๊ฐœ๋…์ด ๋ฌถ๋Š”๋‹ค๋Š” ๊ฐœ๋…์˜ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

webpack, broserify, parcel๋“ฑ๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋“ค์ด ๋ฒˆ๋“ค๋Ÿฌ์— ์†ํ•ฉ๋‹ˆ๋‹ค.

์›นํŒฉ์€ ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ์ •์  ๋ชจ๋“ˆ๋Ÿฌ์ž…๋‹ˆ๋‹ค.
๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๋ž€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ์ž์›(HTML, CSS, JavaScript, images ๋“ฑ)์„ ๋ชจ๋‘ ๊ฐ๊ฐ์˜ ๋ชจ๋“ˆ๋กœ ๋ณด๊ณ  ์ด๋ฅผ ์กฐํ•ฉํ•ด์„œ ๋ณ‘ํ•ฉ๋œ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“œ๋Š” ๋„๊ตฌ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜์ž๋ฉด ์›นํŒฉ์ด๋ž€ ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ํ•˜๋‚˜ ์ด์ƒ์˜ ํŒŒ์ผ๋กœ ํ•ฉ์ณ์ฃผ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์›นํŒฉ์€ ์™œ ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ์„๊นŒ์š”?
์œ„์—์„œ ์–ธ๊ธ‰ํ•˜์˜€๋“ฏ ์ˆ˜ ๋งŽ์€ ํŒŒ์ผ์ด ๋ชจ์—ฌ ํ•˜๋‚˜์˜ ์›น ์‚ฌ์ดํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท์˜ ๋ฐœ์ „์œผ๋กœ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ฝ”๋“œ์˜ ์–‘์ด ๋ฐฉ๋Œ€ํ•ด์ง€๊ณ  ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“ˆ๋กœ์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ES2015(ES6) ์ด์ „์—๋Š” ๋ชจ๋“ˆ๋กœ์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ AMD, CommonJS๋“ฑ์ด ์กด์žฌํ•˜์˜€์œผ๋‚˜ ํ•˜๋‚˜์˜ ํ‘œ์ค€์ด ์•„๋‹Œ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์— ๋”ฐ๋ผ ์›ํ•˜๋Š” ๊ฒƒ์„ ์„ ํƒํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค.
๊ทธ ํ›„, ES6 ์ดํ›„๋ถ€ํ„ฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ‘œ์ค€ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ์ œ์•ˆํ•˜์˜€๊ณ  ์ด๊ฒƒ์ด export/import ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ES6 ๋ฐฉ์‹์˜ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ์ง€์›ํ•˜์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๋“ค์€ ๋ธŒ๋ผ์šฐ์ €์™€ ๋ฒ„์ „์— ์ƒ๊ด€์—†์ด ํŽธ๋ฆฌํ•œ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ–ˆ๊ณ , ์ด๋Ÿฌํ•œ ๋ฐฐ๊ฒฝ์— ์˜ํ•ด ๋“ฑ์žฅํ•˜๊ฒŒ๋œ ํˆด์ด ์›นํŒฉ์ž…๋‹ˆ๋‹ค.

์กฐ๊ธˆ ๋” ์„ธ๋ถ„ํ™”ํ•˜์ž๋ฉด ์›นํŒฉ์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํŒŒ์ผ ๋‹จ์œ„์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“ˆ ๊ด€๋ฆฌ์˜ ํ•„์š”์„ฑ
  2. ์›น ๊ฐœ๋ฐœ ์ž‘์—… ์ž๋™ํ™” ๋„๊ตฌ(Web Task Manager)
  3. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น ๋ฅธ ๋กœ๋”ฉ ์†๋„์™€ ๋†’์€ ์„ฑ๋Šฅ

์›นํŒฉ์—์„œ ์ง€์นญํ•˜๋Š” ๋ชจ๋“ˆ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“ˆ ๋ฟ๋งŒ์ด ์•„๋‹Œ HTML, CSS, JavaScript, Images, Font๋“ฑ ๋ชจ๋“  ํŒŒ์ผ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ชจ๋“ˆ์ด๋ผ ์ง€์นญํ•˜๋ฉฐ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ชจ๋“  ์ž์›์„ ๋ชจ๋“ˆ์ด๋ผ ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋ง์—์„œ๋Š” ๋นŒ๋“œ, ๋ฒˆ๋“ค๋ง, ๋ณ€ํ™˜ ์ด ์„ธ ๋‹จ์–ด๋Š” ๋ชจ๋‘ ๊ฐ™์€ ์˜๋ฏธ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์›นํŒฉ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์ œ

  1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜ ์œ ํšจ ๋ฒ”์œ„ ๋ฌธ์ œ
  • ES6์˜ ๋ชจ๋“ˆ ๋ฌธ๋ฒ•๊ณผ ๋ฒˆ๋“ค๋ง์œผ๋กœ ํ•ด๊ฒฐ
  1. ๋ธŒ๋ผ์šฐ์ €๋ณ„ HTTP ์š”์ฒญ ์ˆซ์ž์˜ ์ œ์•ฝ
  • ์›นํŒฉ์€ ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ํ•˜๋‚˜ ์ด์ƒ์˜ ํŒŒ์ผ๋กœ ํ•ฉ์ณ ๋งจ ์ฒ˜์Œ ์–ธ๊ธ‰ํ•˜์˜€๋˜ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๋Š” ํšŸ์ˆ˜๊ฐ€ ์ค„์–ด๋“ค๊ฒŒ ๋˜๊ณ  ์ด ํšจ๊ณผ๋กœ ์ธํ•ด ๋ธŒ๋ผ์šฐ์ €๋ณ„ HTTP ์š”์ฒญ ์ˆซ์ž ์ œ์•ฝ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1. ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ์˜ ๊ด€๋ฆฌ
  2. Dynamic Loading ๋ฐ Lazy Loading ๋ฏธ์ง€์› ๋ฌธ์ œ
  • ์ด์ „์— Require.js์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์ƒ ๋™์ ์œผ๋กœ ์›ํ•˜๋Š” ์ˆœ๊ฐ„์— ๋ชจ๋“ˆ์„ ๋กœ๋”ฉํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์›นํŒฉ์—์„œ๋Š” Code Splitting ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๋ชจ๋“ˆ์„ ์›ํ•˜๋Š” ํƒ€์ด๋ฐ์— ๋กœ๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŽˆ Babel vs Terser vs SWCโ€‹

๋ฐ”๋ฒจ (Babel)โ€‹

๋ฐ”๋ฒจ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋นŒ๋“œ ํˆด ์ค‘ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ(Transpiler) ๋ผ๋Š” ์˜์—ญ์— ์†ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ”๋ฒจ์ด ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ์ธ ์ด์œ ๋Š”, ์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๊ตฌ๋ฒ„์ „ ๋ธŒ๋ผ์šฐ์ €๋„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์˜ ์˜ค๋ž˜๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ด ์ฃผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋ฐ”๋ฒจ์€ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋กœ์จ ์œ ์‚ฌํ•œ ๋‘ ์–ธ์–ด ์‚ฌ์ด์—์„œ์˜ ๋ณ€ํ™˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์ค๋‹ˆ๋‹ค.

Terserโ€‹

Terser๋ผ๋Š” ๋นŒ๋“œ ํˆด์— ๋Œ€ํ•ด ์ฒ˜์Œ ๋“ค์–ด๋ณด๋Š” ๋ถ„์ด ์žˆ์œผ์‹ค ๊ฑฐ๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์šฐ๋ฆฌ๊ฐ€ Terser๋ผ๋Š” ํˆด์„ ์ง์ ‘ ๋‹ค๋ฃฐ ์ผ์€ ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ์ด๋ฏธ Terser์— ๋Œ€ํ•œ ์„ธํŒ…์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋˜์–ด์žˆ์œผ๋ฉฐ, ๋”์šฑ์ด Webpack์˜ ๊ฒฝ์šฐ v4 ์ดํ›„ ๋ฒ„์ „๋ถ€ํ„ฐ ๋ณ„๋„์˜ ์„ค์ • ์—†์ด๋„ ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ์—์„œ ์ž๋™์œผ๋กœ Terser ํˆด์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ธํŒ…๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Terser ๊ณต์‹ ์›น์‚ฌ์ดํŠธ์—์„œ๋Š” Terser๋ผ๋Š” ํˆด์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์†Œ๊ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ES6+๋ฅผ ์œ„ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ parser, mangler ๊ทธ๋ฆฌ๊ณ  compressor

Terser๊ฐ€ mangler๋กœ์จ ํ•˜๋Š” ์—ญํ• ์€ ์šฐ๋ฆฌ๊ฐ€ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•œ ๋ณ€์ˆ˜ / ํ•จ์ˆ˜ / ์†์„ฑ๋“ค์˜ ์ด๋ฆ„์„ ๋งค์šฐ ๋‹จ์ˆœํ™”๋œ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ์–ธ์–ด๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋Š”์ง€์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ, ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ์ •ํ•  ๋•Œ์—๋Š” ํ•ญ์ƒ ์˜๋ฏธ ์žˆ๋Š” ๋„ค์ด๋ฐ์„ ์‚ฌ์šฉํ•˜๋ผ๋Š” ๊ฒฉ์–ธ์ด ์–ธ์ œ๋‚˜ ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ๋„ค์ด๋ฐ์€ ๊ทธ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์ฝ”๋“œ ์ „์ฒด๋ฅผ ๋ณด์ง€ ์•Š๋”๋ผ๋„ ๋Œ€๋žต์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋งค์šฐ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ, ์ปดํ“จํ„ฐ ์ž…์žฅ์—์„œ ์ด ๋„ค์ด๋ฐ์€ ์ „ํ˜€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํŠน์ • ๋ฉ”๋‰ด๊ฐ€ ๋ณด์—ฌ์ ธ์•ผ ํ•˜๋Š”์ง€์˜ ์—ฌ๋ถ€๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” Boolean ํƒ€์ž… ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ isMenuVisible์ด๋ผ๊ณ  ์ง“๋“ ์ง€ ์•„๋‹ˆ๋ฉด ๋‹จ์ˆœํžˆ b๋ผ๊ณ  ์ง“๋“ ์ง€ ์™€ ์ƒ๊ด€ ์—†์ด, ์ปดํ“จํ„ฐ๋Š” ๊ทธ์ € ํ•˜๋‚˜์˜ ๋˜‘๊ฐ™์€ ๋ถˆ๋ฆฌ์–ธ ๋ณ€์ˆ˜๋กœ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๋ถ™์—ฌ์ค€ ์ด๋ฆ„๋“ค์€ ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ฝ”๋“œ์˜ ๊ธธ์ด๋ฅผ ๊ธธ๊ฒŒ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์—, ์†Œ์Šค ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ ์ˆ˜๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค.
mangler๋Š” ์šฐ๋ฆฌ์˜ ์†Œ์Šค์ฝ”๋“œ์— ์กด์žฌํ•˜๋Š” ๋„ค์ด๋ฐ๋“ค์„ ์˜๋ฏธ ์—†๋Š” ๋ฌธ์ž๋กœ ๋ฐ”๊ฟ”๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. isMenuVisible ์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ช…์„ ๋‹จ์ˆœํžˆ a๋กœ ๋ฐ”๊ฟ”๋ฒ„๋ฆฌ๋ฉด, 13๊ธ€์ž๋ฅผ ํ•œ ๊ธ€์ž๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ตœ์ ํ™” ๊ณผ์ •์„ ํ†ตํ•ด ์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋  ์šฐ๋ฆฌ์˜ ์ฝ”๋“œ ์‚ฌ์ด์ฆˆ๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์šฐ๋ฆฌ์˜ ์ฝ”๋“œ๋Š” ์—‰๋ง์ด ๋˜๊ฒ ์ง€๋งŒ ๋ง์ด์ฃ (mangled).

Terser๊ฐ€ compressor๋กœ์จ ํ•˜๋Š” ์—ญํ• ์€ ์šฐ๋ฆฌ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•œ ํ›„, ๋” ์งง์€ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ•ด ์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

mangle ํ•˜๋Š” ๊ณผ์ •์ด๋‚˜ compress ํ•˜๋Š” ๊ณผ์ •๊ณผ ๊ฐ™์ด, ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ๋Ÿ‰ํ™”๋œ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ด ์ฃผ๋Š” ์ผ๋ จ์˜ ์ž‘์—…์„ minify ํ˜น์€ minification(์ฝ”๋“œ ๊ฒฝ๋Ÿ‰ํ™”) ์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ ๊ฒฝ๋Ÿ‰ํ™” ์ž‘์—…์„ ํ•ด์ฃผ๋Š” ํˆด์„ ์šฐ๋ฆฌ๋Š” minifier๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, Terser๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ํ”„๋กœ๋•์…˜์—์„œ ๋”์šฑ ๊ฒฝ๋Ÿ‰ํ™”๋œ ์ƒํƒœ๋กœ ์ œ๊ณต๋  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” minifier ๋นŒ๋“œ ํˆด์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SWC(Speedy Web Compiler)โ€‹

SWC๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ์ ํŠธ์˜ ์ปดํŒŒ์ผ๊ณผ ๋ฒˆ๋“ค๋ง ๋ชจ๋‘์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š”, Rust๋ผ๋Š” ์–ธ์–ด๋กœ ์ œ์ž‘๋œ ๋นŒ๋“œ ํˆด์ž…๋‹ˆ๋‹ค. SWC๋Š” Speedy Web Compiler์˜ ์•ฝ์ž๋กœ, ๋ง ๊ทธ๋Œ€๋กœ ๋งค์šฐ ๋น ๋ฅธ ์›น ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํˆด์ž…๋‹ˆ๋‹ค.

Next.js์—์„œ๋Š” SWC๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด ๊ธฐ์กด ๋นŒ๋“œ์— ํ™œ์šฉํ•˜๋˜ ๋ฐ”๋ฒจ๊ณผ Terser๋ฅผ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, Next.js์˜ ๋นŒ๋“œ ๊ณผ์ • ์ค‘ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง์„ ์ˆ˜ํ–‰ํ–ˆ๋˜ ๋ฐ”๋ฒจ๊ณผ, ์ฝ”๋“œ ๊ฒฝ๋Ÿ‰ํ™”๋ฅผ ์ˆ˜ํ–‰ํ–ˆ๋˜ Terser๊ฐ€ SWC๋กœ ๋Œ€์ฒด๋œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. SWC๋กœ ๊ต์ฒดํ•จ์œผ๋กœ์จ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง์€ ๋ฌด๋ ค 17๋ฐฐ๋‚˜ ๋นจ๋ผ์กŒ๋‹ค๊ณ  ํ•˜๋ฉฐ, ์ฝ”๋“œ ๊ฒฝ๋Ÿ‰ํ™” ์ž‘์—…์€ 7๋ฐฐ๊ฐ€ ๋นจ๋ผ์กŒ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, SWC๋ผ๋Š” ํˆด์ด ๋ฐ”๋ฒจ์ด๋‚˜ Terser๋ณด๋‹ค ์›”๋“ฑํ•˜๊ฒŒ ๋น ๋ฅธ ์ด์œ ๊ฐ€ ๋Œ€์ฒด ๋ญ˜๊นŒ์š”? ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” ๋ฐ”๋กœ Rust๋ผ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๊ธฐ๋ฐ˜์˜ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์–ธ์–ด์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ๊ณ ๋ คํ•ด์„œ ์„ค๊ณ„๋œ ์–ธ์–ด๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•œ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋งŒ์„ ์‚ฌ์šฉํ•˜๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋Ÿฌํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋กœ ๊ตฌํ˜„๋œ ๋ฐ”๋ฒจ๊ณผ Terser๋Š” ํ•œ ๋ฒˆ์— ํ•œ ๊ฐœ์˜ ํŒŒ์ผ๋งŒ์„ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€๋Š” ๋‹ฌ๋ฆฌ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„๋œ Rust ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ SWC๋Š” ์˜์กด์„ฑ์ด ์—†๋Š” ํŒŒ์ผ๋“ค์„ ๋™์‹œ์— ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋งŒ์•ฝ ํ˜„์žฌ ์ปดํ“จํ„ฐ๊ฐ€ ์ตœ๋Œ€ 4๊ฐœ์˜ ์ž‘์—…์„ ๋™์‹œ์— ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด SWC๋ฅผ ์‚ฌ์šฉํ•œ ๋นŒ๋“œ ์†๋„๋Š” ๋ฐ”๋ฒจ์ด๋‚˜ Terser๋ฅผ ํ†ตํ•ด ๋นŒ๋“œํ–ˆ์„ ๋•Œ ๋ณด๋‹ค ์ตœ๋Œ€ 4๋ฐฐ๊นŒ์ง€ ๋” ๋นจ๋ผ์งˆ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐ŸŽˆ ์ปดํŒŒ์ผ๋Ÿฌ vs ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌโ€‹

์ปดํŒŒ์ผ๋Ÿฌโ€‹

์ปดํ“จํ„ฐ๊ฐ€ 0๊ณผ 1๋งŒ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.(๊ธฐ๊ณ„์–ด) ํ•˜์ง€๋งŒ ์ปดํ“จํ„ฐ์—์„œ ๋™์ž‘ํ•  ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„ํ•  ๋•Œ, ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” 0๊ณผ 1๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋‚˜ C++์™€ ๊ฐ™์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ปดํ“จํ„ฐ์— ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์ดํ•ด์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š”, ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•˜๋Š” ๊ธฐ๊ณ„์–ด์™€ 1๋Œ€ 1๋กœ ๋Œ€์‘๋˜๋Š” ์ €๊ธ‰ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด(์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค)๋กœ ๋ฒˆ์—ญํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์˜์—ญ์—์„œ ์ด๋Ÿฌํ•œ ์–ธ์–ด ๊ฐ„์˜ ๋ฒˆ์—ญ(๋ณ€ํ™˜)์„ ๋‹ด๋‹นํ•˜๋Š” ๋ฒˆ์—ญ๊ฐ€๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

ํ•œ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์˜ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์—ญํ• ๋งŒ ์ œ๊ณตํ•œ๋‹ค๋ฉด ๊ทธ ์†Œํ”„ํŠธ์›จ์–ด๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌโ€‹

ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ํ•˜์œ„๋ถ„๋ฅ˜์ž…๋‹ˆ๋‹ค. ์–ธ์–ด๋ฅผ ๋ณ€ํ™˜ํ•ด ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด์ธ ๊ฒƒ์€ ์ผ๋ฐ˜์ ์ธ ์ปดํŒŒ์ผ๋Ÿฌ์™€ ๋™์ผํ•˜์ง€๋งŒ, ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋‘ ์–ธ์–ด ์‚ฌ์ด๋ฅผ ๋ณ€ํ™˜ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์œ ์‚ฌํ•œ ๋‘ ์–ธ์–ด ์‚ฌ์ด์—์„œ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ํ•œ์ •๋œ ์—ญํ• ์„ ์ œ๊ณตํ•ด ์ฃผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ผ๋Š” ์ ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๐ŸŽˆ ํ”„๋ก ํŠธ์—”๋“œ ๋ Œ๋”๋ง: SSG vs ISR vs SSR vs CSR - ์–ธ์ œ ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”?โ€‹

์ •์  ํŽ˜์ด์ง€ ์ƒ์„ฑ (SSG, Static Site Generation)โ€‹

SSG๋Š” raw ๋ฐ์ดํ„ฐ์™€ ํ…œํ”Œ๋ฆฟ ์„ธํŠธ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์™„์ „ํžˆ ์ •์ ์ธ HTML ์›น ์‚ฌ์ดํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ์€ ๊ฐ๊ฐ์˜ HTML ํŽ˜์ด์ง€ ์ฝ”๋”ฉ ์ž‘์—…์„ ์ž๋™ํ™”ํ•˜๊ณ  ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ๋ฏธ๋ฆฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, SSG๋Š” ์›น ์‚ฌ์ดํŠธ์˜ ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ๋ฏธ๋ฆฌ ๋ Œ๋”๋งํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์— ๋”ฐ๋ผ ํŽ˜์ด์ง€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์žฅ์ 

  1. SSG๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜๋Š” ์„œ๋ฒ„ ์ธก ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฑฐ์˜ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์™„์ „ํžˆ ์ •์ ์ธ HTML ๊ธฐ๋ฐ˜ ์‚ฌ์ดํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  2. ์ •์  ์‚ฌ์ดํŠธ๋Š” ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ ธ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณต๋  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ๋น ๋ฅธ ํ˜•์‹์˜ ์›น ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค.
  3. ์›น์‚ฌ์ดํŠธ๊ฐ€ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ˜ํ…์ธ ๊ฐ€ ํ›จ์”ฌ ๋” ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”(SEO)์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ 

  1. ์ฝ˜ํ…์ธ ๋ฅผ ํŽธ์ง‘ํ•˜๊ณ  ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ํŽธ์ง‘์ž๋“ค์€ ๋‹จ์ˆœํ•œ ์›น ์•ฑ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ Git ์ €์žฅ์†Œ์˜ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์š”๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ฝ˜ํ…์ธ ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ์‚ฌ์ดํŠธ๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•œ ํ›„ ์ตœ์ข…์ ์œผ๋กœ ๋ฐฐํฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋Œ€๊ทœ๋ชจ ์›น ์‚ฌ์ดํŠธ์˜ ๊ฒฝ์šฐ ๋นŒ๋“œ๊ฐ€ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์€ ๋งํ•  ๊ฒƒ๋„ ์—†๊ณ , ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ๋„ ๋งค์šฐ ๋ฒˆ๊ฑฐ๋กญ์Šต๋‹ˆ๋‹ค.

SSG๋Š” ์žฅ์ ์ด ๋งŽ์ง€๋งŒ ์ œํ’ˆ ์‡ผ์ผ€์ด์Šค ์›น์‚ฌ์ดํŠธ์ฒ˜๋Ÿผ ๋‚ด์šฉ์ด ๊ฑฐ์˜ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์›น์‚ฌ์ดํŠธ์ธ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋ธ”๋กœ๊ทธ์˜ ๊ฒฝ์šฐ, ์ˆ˜์ •ํ•  ๋•Œ๋งˆ๋‹ค ์‚ฌ์ดํŠธ๋ฅผ ๋‹ค์‹œ ๋ฐฐํฌํ•ด๋„ ๊ดœ์ฐฎ๋‹ค๋ฉด SSG๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์•ฝ๊ฐ„์˜ ๋™์ ์ธ ์ฝ˜ํ…์ธ ๋ผ๋„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ์‚ฌ์ดํŠธ๋ผ๋ฉด SSG๋ฅผ ์ ˆ๋Œ€ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”.

์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง (SSR, Server-Side Rendering)โ€‹

์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR)์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์›น ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋Œ€์‹  ์„œ๋ฒ„์—์„œ ์›น ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ์™„์ „ํžˆ ๋ Œ๋”๋ง ๋œ ํŽ˜์ด์ง€๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์ด SPA ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ž‘๋™์„ ๋Œ€์‹ ํ•ฉ๋‹ˆ๋‹ค.

SSR์—์„œ๋Š” ํŽ˜์ด์ง€๊ฐ€ ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง ๋˜์–ด ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†ก๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์  ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ๋„ ์—ฌ์ „ํžˆ ์šฐ์ˆ˜ํ•œ SEO๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ์ 

  1. ๋™์  ์ฝ˜ํ…์ธ ๊ฐ€ ํฌํ•จ๋œ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. SSR์€ SSG๋งŒํผ ๋น ๋ฅด์ง€๋Š” ์•Š์ง€๋งŒ ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋˜๋Š” ์ฆ‰์‹œ ์ฝ˜ํ…์ธ ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฏ€๋กœ ์œ ์ €๊ฐ€ ๋น ๋ฅด๊ฒŒ ์ฝ˜ํ…์ธ ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”(SEO)์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ 

  1. SSR์€ ๋ชจ๋“  ์š”์ฒญ์ด ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์— ๋†’์€ ์—ฐ์‚ฐ ๋Šฅ๋ ฅ์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.
  2. SSR ์‚ฌ์ดํŠธ๋Š” ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋Š” ์ง€์ ์ด ๋” ๋งŽ์œผ๋ฏ€๋กœ ๋ณด์•ˆ์„ ์œ ์ง€ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
  3. ์บ์‹ฑ์— ๋ณต์žกํ•œ ๊ตฌ์„ฑ์ด ๋งŽ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

SSR์€ ์„œ๋ฒ„ ๋น„์šฉ์„ ํฌ๊ฒŒ ์ฆ๊ฐ€์‹œํ‚ฌ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋ฏ€๋กœ, ๋งค์šฐ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๊ณ  SEO์— ํฌ๊ฒŒ ์˜์กดํ•˜๋Š” ๋งค์šฐ ๋™์ ์ธ ์ฝ˜ํ…์ธ ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ์‚ฌ์ดํŠธ์ธ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์˜ค๊ฐ€๋‹‰(organic) ๊ฒ€์ƒ‰์—์„œ ์‚ฌ์šฉ์ž๋ฅผ ๋ชจ์œผ๋Š” ์ฃผ์‹ ์‹œ์„ธ ํ‘œ์‹œ๊ธฐ ์›น์‚ฌ์ดํŠธ๋ผ๋ฉด SSR์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ ์ง„์  ์ •์  ์žฌ์ƒ์„ฑ (ISR, Incremental Static Regeneration)โ€‹

์ ์ง„์  ์ •์  ์žฌ์ƒ์„ฑ(ISR)์„ ์‚ฌ์šฉํ•˜๋ฉด ์ „์ฒด ์‚ฌ์ดํŠธ๋ฅผ ์žฌ๋นŒ๋“œํ•  ํ•„์š” ์—†์ด ํŽ˜์ด์ง€๋ณ„๋กœ ์ •์  ์ƒ์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ISR์„ ์‚ฌ์šฉํ•˜๋ฉด ์ •์  ์‚ฌ์ดํŠธ์˜ ์ด์ ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ˆ˜๋งŽ์€ ํŽ˜์ด์ง€๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ISR์€ SSG์™€ SSR์˜ ์žฅ์ ์ด ํ•ฉ์ณ์ ธ ๋ณด๋‹ค ํšจ์œจ์ ์ด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

์žฅ์ 

  1. SSG์™€ ๋™์ผํ•˜๊ฒŒ ISR๋„ ํŽ˜์ด์ง€๋ฅผ ๋ฏธ๋ฆฌ ๋ Œ๋”๋งํ•˜๊ณ  ์บ์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๊ต‰์žฅํžˆ ๋น ๋ฆ…๋‹ˆ๋‹ค.
  2. ๋‚ด์šฉ ๋ณ€๊ฒฝ๋˜์–ด๋„ ์‚ฌ์ดํŠธ๋ฅผ ๋‹ค์‹œ ๋ฐฐํฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  3. ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”(SEO)์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ 

  1. ISR์—๋Š” ํ•œ ๊ฐ€์ง€ ํฐ ๋‹จ์ ์ด ์žˆ๋Š”๋ฐ, ์ฝ˜ํ…์ธ ๊ฐ€ ๋ณ€๊ฒฝ๋œ ํ›„์— ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ฒŒ ๋˜์–ด๋„ ์ด์ „์˜ ์ฝ˜ํ…์ธ ๋ฅผ ๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ฒ„์ „์˜ ์›น์‚ฌ์ดํŠธ๋Š” ์•„์ง ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ISR์€ ์ด์ƒ์ ์œผ๋กœ๋Š” ์ฝ˜ํ…์ธ ๊ฐ€ ๋™์ ์ด์ง€๋งŒ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ์‚ฌ์ดํŠธ์ธ ๊ฒฝ์šฐ ISR์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ ์˜ˆ์‹œ๋กœ๋Š” ๋ธ”๋กœ๊ทธ๋‚˜ ๊ฐœ์ธ ์›น์‚ฌ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง (CSR, Client-Side Rendering)โ€‹

ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(CSR)์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋กœ์ง, ๋ฐ์ดํ„ฐ ํŽ˜์นญ, ํ…œํ”Œ๋ฆฟ ๋ฐ ๋ผ์šฐํŒ…์€ ์„œ๋ฒ„๊ฐ€ ์•„๋‹Œ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

CSR์—์„œ ์„œ๋ฒ„๋Š” ๋นˆ HTML ํŽ˜์ด์ง€์™€ ๋ชจ๋“  ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์žฅ์ 

  1. ๋™์  ์ฝ˜ํ…์ธ ๊ฐ€ ํฌํ•จ๋œ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. SSG์™€ ๋‹ฌ๋ฆฌ ์„œ๋ฒ„ ๋น„์šฉ์ด ๋†’์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  3. ์ฒ˜์Œ ๋กœ๋“œํ•œ ํ›„ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜๋Š” ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค.

๋‹จ์ 

  1. ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”(SEO)๊ฐ€ ์ž˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. ๋Š๋ฆฐ ์ดˆ๊ธฐ ๋กœ๋“œ ์‹œ๊ฐ„๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ ์‹œ๊ฐ„์ด ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ต๋‹ˆ๋‹ค.

CSR์€ SEO์— ํฌ๊ฒŒ ์˜์กดํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ์‚ฌ์ดํŠธ์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค. Tauri ๋˜๋Š” Electron๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ’๋ถ€ํ•œ ์‚ฌ์ดํŠธ ์ƒํ˜ธ์ž‘์šฉ๊ณผ ์›น, ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŽˆ Yarn Berry๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ โ€‹

Yarn Berry๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๊ธฐ์กด์— ์‚ฌ์šฉํ–ˆ๋˜ npm, yarn v1์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ธฐ์กด์— ์˜์กด์„ฑ์„ node_modules๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌํ•˜์˜€๋Š”๋ฐ npm์€ ํŒจํ‚ค์ง€๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ ๊ณ„์† ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ์˜ node_modules ํด๋”๋ฅผ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŒจํ‚ค์ง€๋ฅผ ๋ฐ”๋กœ ์ฐพ์ง€ ๋ชปํ• ์ˆ˜๋ก readdir, stat๊ณผ ๊ฐ™์€ ๋Š๋ฆฐ I/O ํ˜ธ์ถœ์ด ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค. ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ๋Š” I/O ํ˜ธ์ถœ์ด ์ค‘๊ฐ„์— ์‹คํŒจํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

npm์€ ํŒจํ‚ค์ง€๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ์˜ node_modules ํด๋”๋ฅผ ๊ณ„์† ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ํŠน์„ฑ ๋•Œ๋ฌธ์— ์–ด๋–ค ์˜์กด์„ฑ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€๋Š” ํ•ด๋‹น ํŒจํ‚ค์ง€์˜ ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์–ด๋–ค node_modules๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š”์ง€์— ๋”ฐ๋ผ ์˜์กด์„ฑ์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ธฐ๋„ ํ•˜๊ณ , ์—†๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฒ„์ „์˜ ์˜์กด์„ฑ์„ ์ž˜๋ชป ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์—ฌ์ง€๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ npm์„ ๊ตฌ์„ฑํ•˜๋Š” node_modules ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋Š” ๋งค์šฐ ํฐ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. node_modules ํด๋”๋Š” ๋ณต์žกํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ค์น˜๊ฐ€ ์œ ํšจํ•œ์ง€ ๊ฒ€์ฆํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆ˜๋ฐฑ ๊ฐœ์˜ ํŒจํ‚ค์ง€๊ฐ€ ์„œ๋กœ๋ฅผ ์˜์กดํ•˜๋Š” ๋ณต์žกํ•œ ์˜์กด์„ฑ ํŠธ๋ฆฌ์—์„œ node_modules ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋Š” ๊นŠ์–ด์ง‘๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๊นŠ์€ ํŠธ๋ฆฌ ๊ตฌ์กฐ์—์„œ ์˜์กด์„ฑ์ด ์ž˜ ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ๊ฒ€์ฆํ•˜๋ ค๋ฉด ๋งŽ์€ ์ˆ˜์˜ I/O ํ˜ธ์ถœ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋””์Šคํฌ I/O ํ˜ธ์ถœ์€ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๋กœ ์ธํ•ด yarn v1์ด๋‚˜ npm์€ ๊ธฐ๋ณธ์ ์ธ ์˜์กด์„ฑ ํŠธ๋ฆฌ์˜ ์œ ํšจ์„ฑ๊นŒ์ง€๋งŒ ๊ฒ€์ฆํ•˜๊ณ , ๊ฐ ํŒจํ‚ค์ง€์˜ ๋‚ด์šฉ์ด ์˜ฌ๋ฐ”๋ฅธ์ง€๋Š” ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  npm ๋ฐ yarn v1์—์„œ๋Š” ์ค‘๋ณตํ•ด์„œ ์„ค์น˜๋˜๋Š” node_modules๋ฅผ ์•„๋ผ๊ธฐ ์œ„ํ•ด ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ(Hoisting) ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ์— ๋”ฐ๋ผ ์ง์ ‘ ์˜์กดํ•˜๊ณ  ์žˆ์ง€ ์•Š์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ require() ํ•  ์ˆ˜ ์žˆ๋Š” ํ˜„์ƒ์„ ์œ ๋ น ์˜์กด์„ฑ(Phantom Dependency)์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์œ ๋ น ์˜์กด์„ฑ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ๋•Œ, package.json์— ๋ช…์‹œํ•˜์ง€ ์•Š์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์กฐ์šฉํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

yarn berry๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ๋ฅผ Plugโ€™nโ€™Play (PnP) ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
yarn berry๋Š” node_modules๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  .yarn/cache ํด๋”์— ์˜์กด์„ฑ์˜ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๊ณ , .pnp.cjs ํŒŒ์ผ์— ์˜์กด์„ฑ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๊ฐ€ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. .pnp.cjs๋ฅผ ์ด์šฉํ•˜๋ฉด ๋””์Šคํฌ I/O ์—†์ด ์–ด๋–ค ํŒจํ‚ค์ง€๊ฐ€ ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กดํ•˜๋Š”์ง€, ๊ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์–ด๋””์— ์œ„์น˜ํ•˜๋Š”์ง€๋ฅผ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

yarn berry์˜ PnP ์‹œ์Šคํ…œ์—์„œ ๊ฐ ์˜์กด์„ฑ์€ zip ์•„์นด์ด๋ธŒ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ดํ›„ .pnp.cjs ํŒŒ์ผ์ด ์ง€์ •ํ•˜๋Š” ๋ฐ”์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ zip ์•„์นด์ด๋ธŒ์˜ ๋‚ด์šฉ์ด ์ฐธ์กฐ๋ฉ๋‹ˆ๋‹ค. zip ์•„์นด์ด๋ธŒ๋กœ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๋ฉด ๋” ์ด์ƒ node_modules ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์„ค์น˜๊ฐ€ ์‹ ์†ํžˆ ์™„๋ฃŒ๋˜๊ณ , ๊ฐ ํŒจํ‚ค์ง€๋Š” ๋ฒ„์ „๋งˆ๋‹ค ํ•˜๋‚˜์˜ zip ์•„์นด์ด๋ธŒ๋งŒ์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณตํ•ด์„œ ์„ค์น˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜์กด์„ฑ์„ ๊ตฌ์„ฑํ•˜๋Š” ํŒŒ์ผ์˜ ์ˆ˜๊ฐ€ ๋งŽ์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜๊ฑฐ๋‚˜ ์ „์ฒด ์˜์กด์„ฑ์„ ์‚ญ์ œํ•˜๋Š” ์ž‘์—…์ด ๋น ๋ฆ…๋‹ˆ๋‹ค.

yarn PnP๋Š” node_modules์—์„œ์™€ ๊ฐ™์ด ์˜์กด์„ฑ์„ ๋Œ์–ด์˜ฌ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋กœ์จ ๊ฐ ํŒจํ‚ค์ง€๋“ค์€ ์ž์‹ ์ด package.json์— ๊ธฐ์ˆ ํ•˜๋Š” ์˜์กด์„ฑ์—๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์— ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์šฐ์—ฐํžˆ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ์ฝ”๋“œ๋“ค์ด ๋ณด๋‹ค ์—„๊ฒฉํžˆ ๊ด€๋ฆฌ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋กœ์จ ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ๋ฒ„๊ทธ๋ฅผ ์‰ฝ๊ฒŒ ์ผ์œผํ‚ค๋˜ ์œ ๋ น ์˜์กด์„ฑ ํ˜„์ƒ์„ ๊ทผ๋ณธ์ ์œผ๋กœ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

yarn PnP์€ ์˜์กด์„ฑ์„ ์••์ถ• ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜์กด์„ฑ์˜ ์šฉ๋Ÿ‰์ด ์ž‘์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ ์˜์กด์„ฑ์€ ํ•˜๋‚˜์˜ zip ํŒŒ์ผ๋กœ๋งŒ ํ‘œํ˜„๋˜๊ธฐ ๋•Œ๋ฌธ์— ์˜์กด์„ฑ์„ ๊ตฌ์„ฑํ•˜๋Š” ํŒŒ์ผ์˜ ์ˆซ์ž๊ฐ€ npm๋งŒํผ ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ์šฉ๋Ÿ‰๊ณผ ํŒŒ์ผ์˜ ์ˆซ์ž๊ฐ€ ์ ๊ธฐ ๋•Œ๋ฌธ์— yarn berry๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜์กด์„ฑ์„ Git์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ yarn berry์—์„œ ์˜์กด์„ฑ์„ ๋ฒ„์ „ ๊ด€๋ฆฌ์— ํฌํ•จํ•˜๋Š” ๊ฒƒ์„ Zero-Install์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ ์˜์กด์„ฑ์„ ๋ฒ„์ „ ๊ด€๋ฆฌ์— ํฌํ•จํ•˜๋ฉด ์ƒˆ๋กœ ์ €์žฅ์†Œ๋ฅผ ๋ณต์ œํ•˜๊ฑฐ๋‚˜ ๋ธŒ๋žœ์น˜๋ฅผ ๋ฐ”๊พธ์—ˆ๋‹ค๊ณ  ํ•ด์„œ yarn install์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ณ  ์ด์— ๋”ฐ๋ผ CI์—์„œ ์˜์กด์„ฑ ์„ค์น˜ํ•˜๋Š” ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://toss.tech/article/node-modules-and-yarn-berry

๐ŸŽˆ Next.js์˜ ์ž‘๋™ ๋ฐฉ์‹โ€‹

https://nextjs.org/learn/foundations/how-nextjs-works https://velog.io/@surim014/how-next.js-works

๐ŸŽˆ Vercel Edge Functionโ€‹

Vercel์˜ Edge Functions๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฝ๋Ÿ‰ Edge Runtime์œผ๋กœ ๋™์ ์ด๊ณ  ๊ฐœ์ธํ™”๋œ ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Vercel Edge Runtime์€ ํ‰๊ท ์ ์œผ๋กœ Serverless Functions๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚˜๊ณ  ๋น„์šฉ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. Edge Functions๋Š” Edge Network์— ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ๋ฐฐํฌ๋˜๋ฉฐ ์ด๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์‚ฌ์šฉ์ž์™€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ง€์—ญ์—์„œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ cold boots๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์ถ”๊ฐ€ ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Edge Functions๋Š” OAuth ์ฝœ๋ฐฑ ์‹คํ–‰, ์›นํ›„ํฌ ์š”์ฒญ ์‘๋‹ต ๋˜๋Š” ์งง์€ ์‹œ๊ฐ„ ์ œํ•œ ๋‚ด์— ์š”์ฒญ์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉด ์‹คํŒจํ•˜๋Š” API์™€ ์ƒํ˜ธ ์ž‘์šฉ๊ณผ ๊ฐ™์ด ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

Edge Function์˜ ์ž‘๋™ ๋ฐฉ์‹โ€‹

Edge Functions๋Š” Chrome ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ณ ์„ฑ๋Šฅ V8 JavaScript ๋ฐ WebAssembly ์—”์ง„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” Vercel์˜ Edge Runtime์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

V8 ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๋‚˜ ๊ฐ€์ƒ ๋จธ์‹ ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฉ๋ฆฌ๋œ ์‹คํ–‰ ํ™˜๊ฒฝ์—์„œ Edge Functions๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Edge Runtime์„ ์—ฌ๋Ÿฌ ๋ฉด์—์„œ ์ œํ•œํ•˜์ง€๋งŒ ๋™์‹œ์— ๊ฒฝ๋Ÿ‰ํ™”ํ•ฉ๋‹ˆ๋‹ค. Edge Function ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์„œ๋ฒ„๋ฆฌ์Šค ๊ธฐ๋Šฅ๋ณด๋‹ค ์ ์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ cold boot ์‹œ๊ฐ„์„ ํšจ๊ณผ์ ์œผ๋กœ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

Edge Functions์˜ ๋ณดํŽธ์  ์ด์ ์€ Edge Runtime์ž…๋‹ˆ๋‹ค. ๋น„์šฉ ํšจ์œจ์ ์ด๊ณ  ๋ฆฌ์†Œ์Šค๋ฅผ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Edge Functions๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์ปจํ…์ŠคํŠธ์—์„œ ๋‚ฎ์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์œผ๋กœ ๋™์  ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  Edge ๊ธฐ๋Šฅ์ด ๋ณต์ œ๋˜์–ด Vercel์˜ Edge Network์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์˜ ๊ธ€๋กœ๋ฒŒ ๋„คํŠธ์›Œํฌ์— ๋ฐฐํฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ฎ์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์œผ๋กœ ๋™์  ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฐ์ดํ„ฐ ์„ผํ„ฐ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ทผ์ฒ˜ ์ง€์—ญ์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ง€์—ญ์— ๋”ฐ๋ผ ๊ฐœ์ธํ™”๋œ ์ฝ˜ํ…์ธ ๋ฅผ ๋น ๋ฅธ ์†๋„๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Edge Functions๋Š” ์บ์‹œ ์ดํ›„์—๋„ ์‹คํ–‰๋˜๋ฉฐ ์‘๋‹ต์„ ์บ์‹œํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฃ์ง€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ โ€‹

Edge Functions๋Š” ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ๋ถ„์‚ฐ๋œ ์‚ฌ์šฉ์ž ๊ธฐ๋ฐ˜์— ๋Œ€ํ•ด ํ‰๊ท ์ ์œผ๋กœ Serverless Functions๋ณด๋‹ค ๋” ๋น ๋ฅธ ์‘๋‹ต์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ Edge Functions๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ตฌ์ฒด์ ์ธ ์ด์ ์ž…๋‹ˆ๋‹ค.

  1. ๋„คํŠธ์›Œํฌ ์‚ฌ์šฉ ๋น„์šฉ ๊ฐ์†Œ Edge Functions๋Š” ์ง€๋ฆฌ์ ์œผ๋กœ ์‚ฌ์šฉ์ž ๊ทผ์ฒ˜ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ทผ์ฒ˜์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์€ serverless function๋ณด๋‹ค ๋” ์งง์€ ๊ฑฐ๋ฆฌ๋ฅผ ์ด๋™ํ•˜๊ณ  ๋” ๋‚ฎ์€ ๋น„์šฉ์„ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ•œ ์ง€์—ญ์—์„œ ๋ฐฐํฌ ๋ฐ ํ˜ธ์ถœ๋˜๋ฏ€๋กœ ๋•Œ๋•Œ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‘๋‹ต์„ ์ œ๊ณตํ•˜๊ธฐ ์ „์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ€๋ฆฌ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋Œ€๊ธฐ ์‹œ๊ฐ„ ๊ฐ์†Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์ง€๋ฆฌ์ ์œผ๋กœ ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ ์ข…์†์„ฑ์— ์˜์กดํ•˜์ง€ ์•Š๋Š” Edge Functions๋Š” ์‚ฌ์šฉ์ž ๊ทผ์ฒ˜์—์„œ ์‹คํ–‰๋˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด Serverless Functions๋ณด๋‹ค ํ›จ์”ฌ ์งง์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์œผ๋กœ ์‘๋‹ต์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๊ฐœ์ธํ™”๋œ ๋™์  ์ฝ˜ํ…์ธ  Edge Functions์—์„œ ์‚ฌ์šฉ์ž ์ง€์ • ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” Edge ๋„คํŠธ์›Œํฌ์˜ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ์ €์ˆ˜์ค€ ์–ธ์–ด ์ง€์› C ๋˜๋Š” Rust์™€ ๊ฐ™์€ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ๋„๊ตฌ๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ  Edge Functions์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ WebAssembly ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

Edge Function regionsโ€‹

Edge Functions์˜ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐฉ๋ฌธ์ž์™€ ์ง€๋ฆฌ์ ์œผ๋กœ ๊ฐ€๊นŒ์šด ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•จ์ˆ˜๊ฐ€ ๋ฐฉ๋ฌธ์ž๋กœ๋ถ€ํ„ฐ ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ ๋ฐ์ดํ„ฐ ์†Œ์Šค์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ ์ด ์ด์ ์ด ์™„ํ™”๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ผ๋ณธ์˜ ๋ฐฉ๋ฌธ์ž๊ฐ€ ๋ฏธ๊ตญ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜์กดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์—์ง€ ๋„คํŠธ์›Œํฌ์˜ ์ผ๋ณธ์— ์žˆ๋Š” ์‹œ์Šคํ…œ์—์„œ ํ˜ธ์ถœ ๋˜์ง€๋งŒ ์ตœ์ข… ์‘๋‹ต์—๋Š” Japan -> US -> Japan ์™•๋ณต์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ๋ฐฉ๋ฌธ์ž์—๊ฒŒ ์ „์ฒด ์‘๋‹ต ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

Edge Function์˜ ํšจ์œจ์ ์ธ ๋ผ์šฐํŒ…์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ง€์—ญ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด configEdge Function์ด ๋‚ด๋ณด๋‚ด๋Š” ๊ฐ์ฒด๋ฅผ ํŽธ์ง‘ํ•˜์‹ญ์‹œ์˜ค.

export const config = {
runtime: 'edge', // this is a pre-requisite
regions: ['iad1'], // only execute this function on iad1
};

์ œํ•œ ์‚ฌํ•ญโ€‹

๋ชจ๋“  ์†”๋ฃจ์…˜๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Edge Functions๋Š” ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์•Œ์•„์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ฐ์ดํ„ฐ ์›๋ณธ๊ณผ Edge Function์ด ์‹คํ–‰๋˜๋Š” ์œ„์น˜ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋กœ ์ธํ•ด ์š”์ฒญ์— ์›์น˜ ์•Š๋Š” ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž ์žฌ์ ์œผ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•˜๋ ค๋ฉด Vercel์—์„œ ์ง€์—ญ Edge Function ์‹คํ–‰์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ๋ฅผ ์ฝ์œผ์‹ญ์‹œ์˜ค.
  2. Edge Function์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋Š” ํ•จ์ˆ˜์— ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ 4MB ์ž…๋‹ˆ๋‹ค.
  3. ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋ณธ Node.js API๋Š” ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ง€์›๋˜๋Š” Node.js API ๋ชฉ๋ก์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  4. ์„œ๋ฒ„๋ฆฌ์Šค ๊ธฐ๋Šฅ๊ณผ์˜ ๋น„๊ต
  5. edge function ์‚ฌ์šฉ์‹œ Next.js์—์„œ ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ์ •์  ์ƒ์„ฑ(Static Generation)์ด ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. Edge ๋Ÿฐํƒ€์ž„์€ ๊ฐ ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ •์ ์œผ๋กœ ์ƒ์„ฑ๋œ ์ฝ˜ํ…์ธ ์™€ ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ๋ถ„ ์ •์  ์žฌ์ƒ์„ฑ(ISR)์„ ์‚ฌ์šฉํ•  ๋•Œ, Edge ๋Ÿฐํƒ€์ž„๊ณผ ISR์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    1. ์˜ค๋ž˜๋œ(stale) ํŽ˜์ด์ง€ ์žฌ์ƒ์„ฑ: ํŽ˜์ด์ง€๊ฐ€ ์˜ค๋ž˜๋˜์–ด ์žฌ์ƒ์„ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, HTML๊ณผ JSON ๋ฒ„์ „์„ ๋™์‹œ์— ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    2. On-demand ISR with fallback: 'blocking': ํŽ˜์ด์ง€๋Š” ์š”์ฒญ ์‹œ ๋™๊ธฐ์ ์œผ๋กœ HTML์„ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ HTML๊ณผ JSON ๋ฒ„์ „ ๋ชจ๋‘์— ๋Œ€ํ•œ ์žฌ๊ฒ€์ฆ(revalidation)์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
    3. Edge ๋Ÿฐํƒ€์ž„์„ ์‚ฌ์šฉํ•  ๋•Œ ์ •์  ์ƒ์„ฑ์ด ๋น„ํ™œ์„ฑํ™”๋˜์ง€๋งŒ, ISR๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์—ฌ์ „ํžˆ ํšจ์œจ์ ์ธ ์ฝ˜ํ…์ธ  ๊ฐฑ์‹ ๊ณผ ์ œ๊ณต์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ์ด ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ ๋กœ๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ์„ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ Edge Functions ์ œํ•œ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

https://vercel.com/docs/concepts/functions/edge-functions

๐ŸŽˆ Edge Middlewareโ€‹

Edge Middleware๋Š” ์š”์ฒญ์ด ์‚ฌ์ดํŠธ์—์„œ ์ฒ˜๋ฆฌ ๋˜๊ธฐ ์ „์— ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์š”์ฒญ์— ๋”ฐ๋ผ ์‘๋‹ต์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์บ์‹œ๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ •์ ์œผ๋กœ ์ƒ์„ฑ๋œ ์ฝ˜ํ…์ธ ์— ๊ฐœ์ธํ™”๋ฅผ ์ œ๊ณตํ•˜๋Š” ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์— ๋”ฐ๋ผ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉ์ž ์ง€์ • ๋…ผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žฌ์ž‘์„ฑ, ๋ฆฌ๋””๋ ‰์…˜, ํ—ค๋” ์ถ”๊ฐ€ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Edge ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์ดํŠธ ๋ฐฉ๋ฌธ์ž์—๊ฒŒ ๋น ๋ฅด๊ณ  ๊ฐœ์ธํ™”๋œ ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Vercel์˜ Edge Network์— ์ „์—ญ์ ์œผ๋กœ ๋ฐฐํฌ๋˜๋ฉฐ ์„œ๋ฒ„ ์ธก ๋กœ์ง์„ ๋ฐฉ๋ฌธ์ž์˜ ์ถœ์ฒ˜์— ๊ฐ€๊นŒ์šด Edge๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฏธ๋“ค์›จ์–ด๋Š” Chrome ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ณ ์„ฑ๋Šฅ V8 JavaScript ๋ฐ WebAssembly ์—”์ง„ ์— ๊ตฌ์ถ•๋œ Vercel Edge Runtime์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Edge Runtime์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ Web Standard API์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ๋…ธ์ถœํ•˜๊ณ  ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. FetchEvent, Response, ๊ทธ๋ฆฌ๊ณ  Request, ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์— ๋”ฐ๋ผ ์‘๋‹ต์„ ์กฐ์ž‘ํ•˜๊ณ  ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋” ์ž˜ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฏธ๋“ค์›จ์–ด ์ž‘์„ฑ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฏธ๋“ค์›จ์–ด API ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ฐœ๋ฐœ์ž๋Š” Edge Middleware๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ถ”๊ฐ€ ํฌ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ ๋„ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋ณด๋‹ค ํšจ๊ณผ์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ์ตœ์ข… ์‚ฌ์šฉ์ž๋Š” edge์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๋งค์šฐ ์งง์€ ์‚ฌ์ „ ๋ Œ๋”๋ง๋˜๊ณ  ๊ฐœ์ธํ™”๋œ ์ฝ˜ํ…์ธ ๋ฅผ ๊ฒฝํ—˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฏธ๋“ค์›จ์–ด์˜ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

https://vercel.com/docs/concepts/functions/edge-middleware

๐ŸŽˆ ๋ชจ๋…ธ๋ ˆํฌ๋ž€?โ€‹

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

๋ชจ๋…ธ๋ ˆํฌ๋Š” ๋ฉ€ํ‹ฐ๋ ˆํฌ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์ค๋‹ˆ๋‹ค.

  1. ๋” ์‰ฌ์šด ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๋ชจ๋…ธ๋ ˆํฌ์—์„œ๋Š” ์ €์žฅ์†Œ ์ƒ์„ฑ์„ ์ƒˆ๋กญ๊ฒŒ ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ CI/CD, ๋นŒ๋“œ ๋“ฑ์˜ ๊ณผ์ •์— ๊ธฐ์กด DevOps๋ฅผ ์ด์šฉํ•˜๋ฏ€๋กœ ์ƒˆ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ์— ๋Œ€ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  2. ๋” ์‰ฌ์šด ์˜์กด์„ฑ ๊ด€๋ฆฌ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์˜์กด์„ฑ ํŒจํ‚ค์ง€๊ฐ€ ๊ฐ™์€ ์ €์žฅ์†Œ์— ์žˆ์œผ๋ฏ€๋กœ ๋ฒ„์ „์ด ์ง€์ •๋œ ํŒจํ‚ค์ง€๋ฅผ npm registry์™€ ๊ฐ™์€ ๊ณณ์— publishํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  3. ๋‹จ์ผํ™”๋œ ๊ด€๋ฆฌ ํฌ์ธํŠธ ๊ฐœ๋ฐœํ™˜๊ฒฝ ๋ฐ DevOps์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•œ ๋ฒˆ์— ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ์ผ๊ด€๋œ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜ ์ œ๊ณต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ผ๊ด€๋˜๊ฒŒ ๊ตฌ์ถ•ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๋Š” ๋‹ค๋ฅธ ํŒ€์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ž์‹  ์žˆ๊ฒŒ ๊ธฐ์—ฌํ•˜๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์•ˆ์ „ํ•œ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  5. ํ”„๋กœ์ ํŠธ๋“ค์— ๊ฑธ์นœ ์›์ž์  ์ปค๋ฐ‹ ์ปค๋ฐ‹ํ•  ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  ๊ฒƒ์ด ํ•จ๊ป˜ ์ž‘๋™ํ•˜๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์กฐ์ง์—์„œ ์‰ฝ๊ฒŒ ๋ณ€ํ™”๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  6. ์„œ๋กœ ์˜์กดํ•˜๋Š” ์ €์žฅ์†Œ๋“ค์˜ ๋ฆฌํŒฉํ„ฐ๋ง ๋น„์šฉ ๊ฐ์†Œ ๋ชจ๋…ธ๋ ˆํฌ๋Š” ๋Œ€๊ทœ๋ชจ ๋ณ€๊ฒฝ์„ ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. 100๊ฐœ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋งŒ๋“  10๊ฐœ์˜ ์•ฑ์„ ๋ฆฌํŒฉํ„ฐ๋งํ•˜๊ณ  ๋ณ€๊ฒฝ์„ ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— ๋ชจ๋‘ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  7. ํ…Œ์ŠคํŠธ ๋ฐ ๋นŒ๋“œ ๋ฒ”์œ„ ์ตœ์†Œํ™” ์†Œ์Šค ๋ณ€๊ฒฝ ์‹œ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๊ฑฐ๋‚˜ ๋‹ค์‹œ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ํ”„๋กœ์ ํŠธ๋งŒ ๋‹ค์‹œ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€๋งŒ ํ•ญ์ƒ ๋ชจ๋…ธ๋ ˆํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์€ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.

  • ์œ ์‚ฌํ•œ ์ œํ’ˆ์˜ ์ง‘ํ•ฉ
  • ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์˜ ๋ณ€ํ™”๋ฅผ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•ด์•ผ ํ•  ๋•Œ
  • ํ˜ธ์ŠคํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ์œผ๋กœ ํ™•์žฅํ•  ๋•Œ
  • ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ด€๋ จ๋œ ํ”„๋กœ์ ํŠธ์˜ ์ง‘ํ•ฉ
  • ์œ ์‚ฌํ•œ DevOps๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœ์ ํŠธ์˜ ์ง‘ํ•ฉ

๋ชจ๋…ธ๋ ˆํฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๊ด€๋ฆฌ ์šฉ์ด์„ฑ, ์†๋„ ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

๋ชจ๋…ธ๋ ˆํฌ ๊ตฌ์ถ•์„ ๋„์™€์ฃผ๋Š” ๋„๊ตฌ๋กœ๋Š” Lerna, yarn, nx, turborepo ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

https://d2.naver.com/helloworld/0923884