๐Ÿš€ Webpack 5 ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋ง์˜ ๋ชจ๋“  ๊ฒƒ ๐Ÿš€

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ Webpack 5 ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋ง์˜ ๋ชจ๋“  ๊ฒƒ ๐Ÿš€

 

 

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์˜ค๋Š˜์€ ์šฐ๋ฆฌ๊ฐ€ ์›น ๊ฐœ๋ฐœ์„ ํ•  ๋•Œ ์ •๋ง ์œ ์šฉํ•œ ๋„๊ตฌ์ธ Webpack 5์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ์•ผ. ํŠนํžˆ ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋ง์ด๋ผ๋Š” ๊ฐœ๋…์„ ์ค‘์‹ฌ์œผ๋กœ, Webpack์˜ A๋ถ€ํ„ฐ Z๊นŒ์ง€ ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค๋ค„๋ณผ ๊ฑฐ๋‹ˆ๊นŒ ํŽธํ•˜๊ฒŒ ๋”ฐ๋ผ์™€! ๐Ÿ˜Ž

์šฐ๋ฆฌ๊ฐ€ ์ด ๊ธด ์—ฌ์ •์„ ํ•จ๊ป˜ ๋– ๋‚˜๊ธฐ ์ „์—, ์ž ๊น! ํ˜น์‹œ ์žฌ๋Šฅ๋„ท์ด๋ผ๋Š” ์‚ฌ์ดํŠธ ๋“ค์–ด๋ดค์–ด? ์—ฌ๊ธฐ๋Š” ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ๋“ค์ด ๋ชจ์—ฌ์„œ ์„œ๋กœ์˜ ์ง€์‹๊ณผ ๊ธฐ์ˆ ์„ ๊ณต์œ ํ•˜๊ณ  ๊ฑฐ๋ž˜ํ•˜๋Š” ๊ณณ์ด์•ผ. ์šฐ๋ฆฌ๊ฐ€ ์˜ค๋Š˜ ๋ฐฐ์šธ Webpack ๊ฐ™์€ ๊ธฐ์ˆ ๋„ ์žฌ๋Šฅ๋„ท์—์„œ ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋ฐฐ์šฐ๊ฑฐ๋‚˜ ๊ฐ€๋ฅด์น  ์ˆ˜ ์žˆ๊ฒ ์ง€? ๊ทธ๋Ÿผ ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์‹œ์ž‘ํ•ด๋ณด์ž!

๐Ÿ” ์˜ค๋Š˜์˜ ํ•™์Šต ๋ชฉํ‘œ:

  • Webpack์ด ๋ญ”์ง€, ์™œ ํ•„์š”ํ•œ์ง€ ์ดํ•ดํ•˜๊ธฐ
  • Webpack 5์˜ ์ฃผ์š” ๊ธฐ๋Šฅ๊ณผ ๊ฐœ์„ ์‚ฌํ•ญ ์•Œ์•„๋ณด๊ธฐ
  • Webpack ์„ค์ • ํŒŒ์ผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• ๋งˆ์Šคํ„ฐํ•˜๊ธฐ
  • ๋กœ๋”์™€ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ™œ์šฉํ•˜๊ธฐ
  • ์ตœ์ ํ™” ๊ธฐ๋ฒ• ๋ฐฐ์šฐ๊ธฐ

์ž, ์ด์ œ ์ •๋ง ์‹œ์ž‘ํ•ด๋ณผ๊นŒ? ์ค€๋น„๋์–ด? ๊ทธ๋Ÿผ ๊ณ ๊ณ ! ๐Ÿš—๐Ÿ’จ

๐Ÿ“ฆ Webpack, ๋„Œ ๋Œ€์ฒด ๋ญ๋‹ˆ?

์ž, ์นœ๊ตฌ์•ผ. Webpack์ด ๋ญ”์ง€ ๊ถ๊ธˆํ•˜์ง€? ๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด, Webpack์€ ๋ชจ๋˜ JavaScript ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ์ •์  ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์•ผ. ์–ด, ๋ญ” ์†Œ๋ฆฌ๋ƒ๊ณ ? ๊ฑฑ์ • ๋งˆ, ์ฒœ์ฒœํžˆ ์„ค๋ช…ํ•ด์ค„๊ฒŒ!

์˜›๋‚  ์˜›์ ์— ์›น ๊ฐœ๋ฐœ์ž๋“ค์€ ์•„์ฃผ ํž˜๋“  ์‹œ๊ธฐ๋ฅผ ๋ณด๋ƒˆ์–ด. JavaScript ํŒŒ์ผ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๋•Œ๋งˆ๋‹ค HTML์— ์ผ์ผ์ด <script> ํƒœ๊ทธ๋ฅผ ๋„ฃ์–ด์•ผ ํ–ˆ๊ณ , ํŒŒ์ผ ์ˆœ์„œ๋„ ์‹ ๊ฒฝ ์จ์•ผ ํ–ˆ์ง€. CSS๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์˜€๊ณ . ๊ทธ๋ฆฌ๊ณ  ์ด๋ฏธ์ง€, ํฐํŠธ ๊ฐ™์€ ์ž์›๋“ค๋„ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ์ •๋ง ๊ณจ์น˜ ์•„ํŒ ์–ด. ๐Ÿ˜ซ

๊ทธ๋Ÿฐ๋ฐ Webpack์ด ๋“ฑ์žฅํ•˜๋ฉด์„œ ์ด ๋ชจ๋“  ๊ฒŒ ๋ฐ”๋€Œ์—ˆ์–ด! Webpack์€ ๋งˆ์น˜ ๋งˆ๋ฒ• ์ƒ์ž ๊ฐ™์•„. ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๋ชจ๋“  ํŒŒ์ผ์„ ์ด ์ƒ์ž์— ๋„ฃ์œผ๋ฉด, Webpack์ด ์•Œ์•„์„œ ์ •๋ฆฌํ•˜๊ณ  ์ตœ์ ํ™”ํ•ด์„œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฑฐ์ง€.

๐Ÿ’ก Webpack์˜ ์ฃผ์š” ๊ธฐ๋Šฅ:

  • ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์คŒ (๋ฒˆ๋“ค๋ง)
  • ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ณ  ์••์ถ•ํ•จ
  • ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์ œ๊ณตํ•ด์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ
  • ๋‹ค์–‘ํ•œ ํ˜•์‹์˜ ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ (JS, CSS, ์ด๋ฏธ์ง€, ํฐํŠธ ๋“ฑ)

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

๊ทธ๋Ÿฐ๋ฐ ๋ง์ด์•ผ, Webpack์ด ์ด๋ ‡๊ฒŒ ์ข‹๋‹ค๊ณ  ํ•ด์„œ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์— ๋ฌด์กฐ๊ฑด ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฑด ์•„๋‹ˆ์•ผ. ์ž‘์€ ํ”„๋กœ์ ํŠธ๋‚˜ ๊ฐ„๋‹จํ•œ ์›นํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” ์˜คํžˆ๋ ค ๋ถˆํ•„์š”ํ•  ์ˆ˜ ์žˆ์–ด. ํ•˜์ง€๋งŒ ๊ทœ๋ชจ๊ฐ€ ํฐ ํ”„๋กœ์ ํŠธ, ํŠนํžˆ SPA(Single Page Application)๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ๊ฑฐ์˜ ํ•„์ˆ˜์ ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์ง€.

Webpack ์ž‘๋™ ์›๋ฆฌ JavaScript CSS Images Webpack Bundle

์œ„์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด Webpack์˜ ์ž‘๋™ ์›๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์–ด. ๋‹ค์–‘ํ•œ ํ˜•์‹์˜ ํŒŒ์ผ๋“ค์ด Webpack์ด๋ผ๋Š” '๋งˆ๋ฒ• ์ƒ์ž'๋กœ ๋“ค์–ด๊ฐ€์„œ ํ•˜๋‚˜์˜ ์ตœ์ ํ™”๋œ ๋ฒˆ๋“ค๋กœ ๋‚˜์˜ค๋Š” ๊ฑฐ์ง€. ๋ฉ‹์ง€์ง€ ์•Š์•„?

์ž, ์ด์ œ Webpack์ด ๋ญ”์ง€ ๋Œ€์ถฉ ๊ฐ์ด ์™”์„ ๊ฑฐ์•ผ. ๋‹ค์Œ์œผ๋กœ๋Š” Webpack 5์˜ ํŠน์ง•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. Webpack 5๋Š” ์ด์ „ ๋ฒ„์ „๋ณด๋‹ค ํ›จ์”ฌ ๋” ๊ฐ•๋ ฅํ•˜๊ณ  ํšจ์œจ์ ์ด๊ฑฐ๋“ . ์–ด๋–ค ์ ์ด ์ข‹์•„์กŒ๋Š”์ง€ ํ•จ๊ป˜ ์‚ดํŽด๋ณด์ž!

๐Ÿ†• Webpack 5์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ๋“ค

์ž, ์ด์ œ Webpack 5์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์‹œ๊ฐ„์ด์•ผ! Webpack 5๋Š” 2020๋…„ 10์›”์— ์ถœ์‹œ๋์–ด. ์ด์ „ ๋ฒ„์ „์ธ Webpack 4์— ๋น„ํ•ด ๋งŽ์€ ๊ฐœ์„ ์‚ฌํ•ญ๊ณผ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ๋“ค์ด ์ถ”๊ฐ€๋์ง€. ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณผ๊นŒ?

๐ŸŒŸ Webpack 5์˜ ์ฃผ์š” ํŠน์ง•:

  • ๋” ๋น ๋ฅธ ๋นŒ๋“œ ์†๋„
  • ๋” ์ž‘์€ ๋ฒˆ๋“ค ํฌ๊ธฐ
  • ์žฅ๊ธฐ์ ์ธ ์บ์‹ฑ ๊ฐœ์„ 
  • Node.js ํด๋ฆฌํ•„ ์ž๋™ ์ œ๊ฑฐ
  • ์›น ํ”Œ๋žซํผ์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์— ๋งž์ถ˜ ์ฝ”๋“œ ์ƒ์„ฑ

1. ๋นŒ๋“œ ์†๋„ ๊ฐœ์„ 

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

2. ์žฅ๊ธฐ์ ์ธ ์บ์‹ฑ ๊ฐœ์„ 

Webpack 5์—์„œ๋Š” ๋” ๋˜‘๋˜‘ํ•œ ์บ์‹ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋„์ž…ํ–ˆ์–ด. ์ด๊ฒŒ ๋ฌด์Šจ ๋œป์ด๋ƒ๋ฉด, ํ•œ ๋ฒˆ ๋นŒ๋“œํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋” ์˜ค๋ž˜, ๋” ํšจ์œจ์ ์œผ๋กœ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑฐ์•ผ. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ฝ”๋“œ์˜ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•˜์ง€ ์•Š๊ณ  ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋์–ด. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์‹œ๊ฐ„์„ ์—„์ฒญ๋‚˜๊ฒŒ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์ง€!

3. Node.js ํด๋ฆฌํ•„ ์ž๋™ ์ œ๊ฑฐ

์ด์ „ ๋ฒ„์ „์˜ Webpack์€ Node.js์˜ ํ•ต์‹ฌ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ํด๋ฆฌํ•„์„ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ–ˆ์–ด. ํด๋ฆฌํ•„์ด ๋ญ๋ƒ๊ณ ? ์‰ฝ๊ฒŒ ๋งํ•ด์„œ, ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ฝ”๋“œ ์กฐ๊ฐ์ด์•ผ. ๊ทธ๋Ÿฐ๋ฐ ์ด๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋๋˜ ๊ฒŒ, ์‹ค์ œ๋กœ ๊ทธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ํ‚ค์› ๊ฑฐ๋“ . Webpack 5์—์„œ๋Š” ์ด๋Ÿฐ ํด๋ฆฌํ•„์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ฑฐํ–ˆ์–ด. ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ง์ ‘ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ง์ด์•ผ. ์ด๋ ‡๊ฒŒ ํ•ด์„œ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ๋” ์ž‘๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ๋์ง€.

4. ๋ชจ๋“ˆ ํŽ˜๋”๋ ˆ์ด์…˜

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

Webpack 5์˜ ์ฃผ์š” ํŠน์ง• ๋น ๋ฅธ ๋นŒ๋“œ ์†๋„ ์ž‘์€ ๋ฒˆ๋“ค ํฌ๊ธฐ ๊ฐœ์„ ๋œ ์บ์‹ฑ ๋ชจ๋“ˆ ํŽ˜๋”๋ ˆ์ด์…˜ Webpack 5

์œ„์˜ ๊ทธ๋ฆผ์€ Webpack 5์˜ ์ฃผ์š” ํŠน์ง•์„ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์–ด. ์ด ๋ชจ๋“  ํŠน์ง•๋“ค์ด ํ•ฉ์ณ์ ธ์„œ ๋” ํšจ์œจ์ ์ด๊ณ  ๊ฐ•๋ ฅํ•œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฑฐ์ง€.

5. ์›น ํ”Œ๋žซํผ์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์— ๋งž์ถ˜ ์ฝ”๋“œ ์ƒ์„ฑ

Webpack 5๋Š” ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋Šฅ์„ ๋” ์ž˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜. ์˜ˆ๋ฅผ ๋“ค์–ด, ECMAScript ๋ชจ๋“ˆ์„ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์ง€์›ํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ๋ž˜ํผ ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ณ , ๋” ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€.

์ž, ์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ Webpack 5์˜ ์ฃผ์š” ํŠน์ง•์ด์•ผ. ์–ด๋•Œ? ๊ฝค ๋Œ€๋‹จํ•˜์ง€? ์ด๋Ÿฐ ๊ธฐ๋Šฅ๋“ค ๋•๋ถ„์— ์šฐ๋ฆฌ๋Š” ๋” ๋น ๋ฅด๊ณ , ๋” ์ž‘๊ณ , ๋” ํšจ์œจ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ๋์–ด. ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ์ด๋Ÿฐ ๊ฐœ์„ ์‚ฌํ•ญ๋“ค์˜ ํšจ๊ณผ๊ฐ€ ํฌ๊ฒŒ ๋‚˜ํƒ€๋‚˜์ง€.

๊ทธ๋Ÿฐ๋ฐ ๋ง์ด์•ผ, ์ด๋Ÿฐ ๋ฉ‹์ง„ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜๋ ค๋ฉด Webpack์„ ์ž˜ ์„ค์ •ํ•ด์•ผ ํ•ด. ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” Webpack์˜ ์„ค์ • ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์ค€๋น„๋์–ด? ๊ทธ๋Ÿผ ๊ณ ๊ณ ! ๐Ÿš€

โš™๏ธ Webpack ์„ค์ • ํŒŒ์ผ ์ž‘์„ฑํ•˜๊ธฐ

์ž, ์ด์ œ Webpack์„ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณผ ์ฐจ๋ก€์•ผ. Webpack์˜ ์‹ฌ์žฅ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ์„ค์ • ํŒŒ์ผ, webpack.config.js๋ฅผ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•˜๋Š”์ง€ ํ•จ๊ป˜ ์‚ดํŽด๋ณด์ž!

๊ธฐ๋ณธ ๊ตฌ์กฐ

Webpack ์„ค์ • ํŒŒ์ผ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„:


const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js'
  },
  mode: 'development',
  module: {
    rules: [
      // ๋กœ๋” ์„ค์ •
    ]
  },
  plugins: [
    // ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ •
  ]
};

์ด์ œ ๊ฐ ๋ถ€๋ถ„์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณผ๊ฒŒ.

1. entry

entry๋Š” Webpack์ด ๋ฒˆ๋“ค๋ง์„ ์‹œ์ž‘ํ•  ์ง„์ž…์ ์ด์•ผ. ๋ณดํ†ต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”์ธ JavaScript ํŒŒ์ผ์„ ์ง€์ •ํ•ด. ์—ฌ๋Ÿฌ ๊ฐœ์˜ entry point๋ฅผ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ์–ด:


entry: {
  main: './src/index.js',
  admin: './src/admin.js'
}

2. output

output์€ Webpack์ด ๋ฒˆ๋“ค๋งํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ ์–ด๋””์—, ์–ด๋–ค ์ด๋ฆ„์œผ๋กœ ์ €์žฅํ• ์ง€ ์ง€์ •ํ•ด. path๋Š” ์ ˆ๋Œ€ ๊ฒฝ๋กœ์—ฌ์•ผ ํ•ด:


output: {
  path: path.resolve(__dirname, 'dist'),
  filename: '[name].[contenthash].js'
}

์—ฌ๊ธฐ์„œ [name]์€ entry์—์„œ ์ง€์ •ํ•œ ํ‚ค ๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ณ , [contenthash]๋Š” ํŒŒ์ผ ๋‚ด์šฉ์— ๋”ฐ๋ผ ์ƒ์„ฑ๋˜๋Š” ํ•ด์‹œ ๊ฐ’์ด์•ผ. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํŒŒ์ผ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ํŒŒ์ผ ์ด๋ฆ„์ด ์ƒ์„ฑ๋˜์–ด ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€.

3. mode

mode๋Š” Webpack์˜ ์ตœ์ ํ™” ์ˆ˜์ค€์„ ๊ฒฐ์ •ํ•ด. 'development', 'production', 'none' ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์–ด:


mode: 'production'

'production' ๋ชจ๋“œ์—์„œ๋Š” ์ฝ”๋“œ ์ตœ์†Œํ™”, ํŠธ๋ฆฌ ์‰์ดํ‚น ๋“ฑ ๋‹ค์–‘ํ•œ ์ตœ์ ํ™”๊ฐ€ ์ž๋™์œผ๋กœ ์ ์šฉ๋ผ.

4. module

module ์„น์…˜์—์„œ๋Š” ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ๋ชจ๋“ˆ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ์ •์˜ํ•ด. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ rules ๋ฐฐ์—ด์ด์•ผ:


module: {
  rules: [
    {
      test: /\.js$/,
      exclude: /node_modules/,
      use: {
        loader: 'babel-loader',
        options: {
          presets: ['@babel/preset-env']
        }
      }
    },
    {
      test: /\.css$/,
      use: ['style-loader', 'css-loader']
    }
  ]
}

์ด ์„ค์ •์€ .js ํŒŒ์ผ์€ Babel๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผํ•˜๊ณ , .css ํŒŒ์ผ์€ ์Šคํƒ€์ผ๋กœ ์ ์šฉํ•˜๋ผ๋Š” ์˜๋ฏธ์•ผ.

5. plugins

plugins๋Š” Webpack์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ผ. ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด:


const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

// ...

plugins: [
  new HtmlWebpackPlugin({
    template: './src/index.html'
  }),
  new MiniCssExtractPlugin({
    filename: '[name].[contenthash].css'
  })
]

์ด ์„ค์ •์€ HTML ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  CSS๋ฅผ ๋ณ„๋„ ํŒŒ์ผ๋กœ ์ถ”์ถœํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด.

6. devServer

๊ฐœ๋ฐœ ์ค‘์— ์‚ฌ์šฉํ•  ์„œ๋ฒ„ ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ์–ด:


devServer: {
  contentBase: './dist',
  open: true,
  hot: true
}

์ด ์„ค์ •์€ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ž๋™์œผ๋กœ ์—ด๊ณ , ํ•ซ ๋ชจ๋“ˆ ๋ฆฌํ”Œ๋ ˆ์ด์Šค๋จผํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•ด.

๐Ÿ’ก Pro Tip:

์„ค์ • ํŒŒ์ผ์ด ๋„ˆ๋ฌด ์ปค์ง€๋ฉด ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์–ด. ์ด๋Ÿด ๋•Œ๋Š” ์„ค์ •์„ ์—ฌ๋Ÿฌ ํŒŒ์ผ๋กœ ๋‚˜๋ˆ„๊ณ  webpack-merge๋ฅผ ์‚ฌ์šฉํ•ด ํ•ฉ์น˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•ด๋ด:


// webpack.common.js
const common = { /* ๊ณตํ†ต ์„ค์ • */ };

// webpack.dev.js
const merge = require('webpack-merge');
const common = require('./webpack.common.js');

module.exports = merge(common, {
  mode: 'development',
  // ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ํŠน์ • ์„ค์ •
});

// webpack.prod.js
module.exports = merge(common, {
  mode: 'production',
  // ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ํŠน์ • ์„ค์ •
});

์ž, ์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ Webpack ์„ค์ • ํŒŒ์ผ์˜ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ์•ผ. ์–ด๋•Œ, ์ƒ๊ฐ๋ณด๋‹ค ๋ณต์žกํ•˜์ง€ ์•Š์ง€? ๋ฌผ๋ก  ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด๋ณด๋‹ค ๋” ๋ณต์žกํ•œ ์„ค์ •์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์–ด. ํ•˜์ง€๋งŒ ์ด ๊ธฐ๋ณธ ๊ตฌ์กฐ๋งŒ ์ดํ•ดํ•˜๊ณ  ์žˆ์œผ๋ฉด, ๋‚˜๋จธ์ง€๋Š” ํ•„์š”์— ๋”ฐ๋ผ ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€ํ•ด๋‚˜๊ฐ€๋ฉด ๋ผ.

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

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” Webpack์˜ ํ•ต์‹ฌ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜์ธ ๋กœ๋”(Loader)์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ๋กœ๋”๋ฅผ ์ด์šฉํ•˜๋ฉด Webpack์ด JavaScript ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๊ฑฐ๋“ . ์ค€๋น„๋์–ด? ๊ทธ๋Ÿผ ๊ณ ๊ณ ! ๐Ÿš€

๐Ÿ”ง Webpack ๋กœ๋”(Loader) ๋งˆ์Šคํ„ฐํ•˜๊ธฐ

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

๋กœ๋”(Loader)๋ž€?

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

๐ŸŽญ ๋กœ๋”์˜ ์—ญํ• :

  • ๋‹ค์–‘ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ JavaScript ๋ชจ๋“ˆ๋กœ ๋ณ€ํ™˜
  • ์ตœ์‹  JavaScript ๋ฌธ๋ฒ•์„ ๊ตฌ๋ฒ„์ „ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ๋™์ž‘ํ•˜๋„๋ก ๋ณ€ํ™˜
  • CSS๋ฅผ JavaScript์— ์‚ฝ์ž…
  • ์ด๋ฏธ์ง€๋ฅผ ๋ฐ์ดํ„ฐ URL๋กœ ๋ณ€ํ™˜

์ฃผ์š” ๋กœ๋” ์†Œ๊ฐœ

1. babel-loader: ์ตœ์‹  JavaScript ์ฝ”๋“œ๋ฅผ ๊ตฌ๋ฒ„์ „์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ณ€ํ™˜ํ•ด์ค˜.


module: {
  rules: [
    {
      test: /\.js$/,
      exclude: /node_modules/,
      use: {  loader: 'babel-loader',
        options: {
          presets: ['@babel/preset-env']
        }
      }
    }
  ]
}

2. css-loader์™€ style-loader: CSS ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  HTML์— ์Šคํƒ€์ผ์„ ์ฃผ์ž…ํ•ด.


{
  test: /\.css$/,
  use: ['style-loader', 'css-loader']
}

3. file-loader: ์ด๋ฏธ์ง€๋‚˜ ํฐํŠธ ๊ฐ™์€ ํŒŒ์ผ์„ ๋ชจ๋“ˆ๋กœ ๋ณ€ํ™˜ํ•ด์ค˜.


{
  test: /\.(png|jpe?g|gif)$/i,
  use: [
    {
      loader: 'file-loader',
    },
  ],
}

4. url-loader: ์ž‘์€ ํŒŒ์ผ๋“ค์„ ๋ฐ์ดํ„ฐ URL๋กœ ๋ณ€ํ™˜ํ•ด ์ธ๋ผ์ธ์œผ๋กœ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜.


{
  test: /\.(png|jpg|gif)$/i,
  use: [
    {
      loader: 'url-loader',
      options: {
        limit: 8192,
      },
    },
  ],
}

๋กœ๋” ์ฒด์ด๋‹

๋กœ๋”๋Š” ์ฒด์ธ์œผ๋กœ ์—ฐ๊ฒฐํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด. ์ด๋•Œ ๋กœ๋”๋Š” ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ ์ˆœ์œผ๋กœ ์ ์šฉ๋ผ. ์˜ˆ๋ฅผ ๋“ค์–ด, Sass ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ณด์ž:


{
  test: /\.scss$/,
  use: ['style-loader', 'css-loader', 'sass-loader']
}

์ด ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๋™์ž‘ํ•ด:

  1. sass-loader๊ฐ€ Sass๋ฅผ CSS๋กœ ๋ณ€ํ™˜
  2. css-loader๊ฐ€ CSS๋ฅผ CommonJS๋กœ ๋ณ€ํ™˜
  3. style-loader๊ฐ€ JS๋กœ ๋ณ€ํ™˜๋œ CSS๋ฅผ DOM์— ์ฃผ์ž…

๋กœ๋” ์˜ต์…˜ ์„ค์ •

๋กœ๋”์—๋Š” ๋‹ค์–‘ํ•œ ์˜ต์…˜์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, babel-loader์— ์˜ต์…˜์„ ์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์ž:


{
  test: /\.js$/,
  exclude: /node_modules/,
  use: {
    loader: 'babel-loader',
    options: {
      presets: ['@babel/preset-env'],
      plugins: ['@babel/plugin-proposal-class-properties']
    }
  }
}

์ธ๋ผ์ธ ๋กœ๋”

์„ค์ • ํŒŒ์ผ ๋Œ€์‹  import ๋ฌธ์— ์ง์ ‘ ๋กœ๋”๋ฅผ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์–ด. ์ด๋ฅผ ์ธ๋ผ์ธ ๋กœ๋”๋ผ๊ณ  ํ•ด:


import Styles from 'style-loader!css-loader?modules!./styles.css';

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ํ•ด์น˜๋ฏ€๋กœ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ์„ค์ • ํŒŒ์ผ์—์„œ ๋กœ๋”๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„.

๐Ÿ’ก Pro Tip:

๋กœ๋”๋ฅผ ์„ ํƒํ•  ๋•Œ๋Š” ํ•ญ์ƒ ์ตœ์‹  ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ , ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„. ๋˜ํ•œ, ํ”„๋กœ์ ํŠธ์˜ needs์— ๋งž๋Š” ๋กœ๋”๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹จ์ˆœํ•œ ํ”„๋กœ์ ํŠธ๋ผ๋ฉด babel-loader๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ณต์žกํ•œ React ํ”„๋กœ์ ํŠธ๋ผ๋ฉด babel-loader์™€ ํ•จ๊ป˜ react-hot-loader๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ์ˆ˜ ์žˆ์–ด.

์ž, ์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ Webpack ๋กœ๋”์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ๋‚ด์šฉ์ด์•ผ. ์–ด๋•Œ, ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€ ์•Š์ง€? ๋กœ๋”๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ์ •๋ง ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ํŒŒ์ผ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด. ํŠนํžˆ ์žฌ๋Šฅ๋„ท๊ฐ™์€ ๋ณต์žกํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ๋กœ๋”์˜ ํž˜์„ ์ œ๋Œ€๋กœ ๋Š๋‚„ ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ.

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” Webpack์˜ ๋˜ ๋‹ค๋ฅธ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ธ ํ”Œ๋Ÿฌ๊ทธ์ธ(Plugin)์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฒˆ๋“ค๋ง ํ”„๋กœ์„ธ์Šค๋ฅผ ๋”์šฑ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ . ์ค€๋น„๋์–ด? ๊ทธ๋Ÿผ ๊ณ ๊ณ ! ๐Ÿš€

๐Ÿ”Œ Webpack ํ”Œ๋Ÿฌ๊ทธ์ธ(Plugin) ์™„์ „ ์ •๋ณต

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์ด๋ฒˆ์—๋Š” Webpack์˜ ๋˜ ๋‹ค๋ฅธ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ธ ํ”Œ๋Ÿฌ๊ทธ์ธ(Plugin)์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋ญ”์ง€, ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ•จ๊ป˜ ์‚ดํŽด๋ณด์ž!

ํ”Œ๋Ÿฌ๊ทธ์ธ(Plugin)์ด๋ž€?

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

๐ŸŽญ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์—ญํ• :

  • ๋ฒˆ๋“ค ํŒŒ์ผ ์ตœ์ ํ™”
  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฃผ์ž…
  • ์—์…‹ ๊ด€๋ฆฌ
  • ๋ฒˆ๋“ค ๋ถ„์„ ๋ฆฌํฌํŠธ ์ƒ์„ฑ

์ฃผ์š” ํ”Œ๋Ÿฌ๊ทธ์ธ ์†Œ๊ฐœ

1. HtmlWebpackPlugin: HTML ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋ฒˆ๋“ค๋œ JavaScript ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์‚ฝ์ž…ํ•ด์ค˜.


const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html'
    })
  ]
};

2. MiniCssExtractPlugin: CSS๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ์ถ”์ถœํ•ด์ค˜. ํฐ ๊ทœ๋ชจ์˜ ์•ฑ์—์„œ ์Šคํƒ€์ผ์„ ๋ณ„๋„๋กœ ์บ์‹ฑํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•ด.


const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
  plugins: [
    new MiniCssExtractPlugin({
      filename: '[name].[contenthash].css'
    })
  ]
};

3. DefinePlugin: ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ „์—ญ ์ƒ์ˆ˜๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด. ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฃผ์ž…ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•ด.


const webpack = require('webpack');

module.exports = {
  plugins: [
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify('production')
    })
  ]
};

4. CleanWebpackPlugin: ๋นŒ๋“œ ์ „์— output ํด๋”๋ฅผ ์ •๋ฆฌํ•ด์ค˜.


const { CleanWebpackPlugin } = require('clean-webpack-plugin');

module.exports = {
  plugins: [
    new CleanWebpackPlugin()
  ]
};

ํ”Œ๋Ÿฌ๊ทธ์ธ ์˜ต์…˜ ์„ค์ •

๋Œ€๋ถ€๋ถ„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์˜ต์…˜์„ ํ†ตํ•ด ์„ธ๋ถ€์ ์ธ ๋™์ž‘์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, HtmlWebpackPlugin์˜ ์˜ต์…˜์„ ์‚ดํŽด๋ณด์ž:


new HtmlWebpackPlugin({
  template: './src/index.html',
  filename: 'index.html',
  minify: {
    collapseWhitespace: true,
    removeComments: true
  },
  hash: true
})

์ด ์„ค์ •์€ HTML ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๊ณ , ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•˜๊ณ , ์ฃผ์„์„ ์‚ญ์ œํ•˜๋ฉฐ, ํŒŒ์ผ ์ด๋ฆ„์— ํ•ด์‹œ๋ฅผ ์ถ”๊ฐ€ํ•ด.

์ปค์Šคํ…€ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋งŒ๋“ค๊ธฐ

ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด ์—†๋‹ค๋ฉด ์ง์ ‘ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์–ด. ํ”Œ๋Ÿฌ๊ทธ์ธ์€ 'apply' ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง„ JavaScript ๊ฐ์ฒด์•ผ. ์ด ๋ฉ”์†Œ๋“œ๋Š” Webpack compiler์— ์˜ํ•ด ํ˜ธ์ถœ๋ผ.


class MyPlugin {
  apply(compiler) {
    compiler.hooks.done.tap('MyPlugin', (stats) => {
      console.log('Webpack build process is done!');
    });
  }
}

module.exports = {
  plugins: [new MyPlugin()]
};

์ด ์˜ˆ์ œ๋Š” Webpack ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ฝ˜์†”์— ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด์•ผ.

๐Ÿ’ก Pro Tip:

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

์ž, ์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ Webpack ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ๋‚ด์šฉ์ด์•ผ. ์–ด๋•Œ, ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ฐ•๋ ฅํ•จ์ด ๋Š๊ปด์ง€์ง€? ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด Webpack์˜ ๊ธฐ๋Šฅ์„ ๋ฌดํ•œํžˆ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์–ด. ํŠนํžˆ ์žฌ๋Šฅ๋„ท๊ฐ™์€ ๋ณต์žกํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ํž˜์„ ์ œ๋Œ€๋กœ ๋Š๋‚„ ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ.

๋กœ๋”์™€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ž˜ ์กฐํ•ฉํ•˜๋ฉด ์ •๋ง ๊ฐ•๋ ฅํ•œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, babel-loader๋กœ ์ตœ์‹  JavaScript๋ฅผ ๋ณ€ํ™˜ํ•˜๊ณ , MiniCssExtractPlugin์œผ๋กœ CSS๋ฅผ ์ตœ์ ํ™”ํ•˜๊ณ , HtmlWebpackPlugin์œผ๋กœ HTML์„ ์ž๋™ ์ƒ์„ฑํ•˜๋Š” ์‹์ด์ง€. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐœ๋ฐœ์€ ๋” ํŽธํ•ด์ง€๊ณ , ๊ฒฐ๊ณผ๋ฌผ์€ ๋” ์ตœ์ ํ™”๋˜๋Š” ๊ฑฐ์•ผ.

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” Webpack์˜ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋” ์ž‘๊ณ  ๋น ๋ฅธ ๋ฒˆ๋“ค์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€, ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ•จ๊ป˜ ์‚ดํŽด๋ณด์ž. ์ค€๋น„๋์–ด? ๊ทธ๋Ÿผ ๊ณ ๊ณ ! ๐Ÿš€

๐Ÿš€ Webpack ์ตœ์ ํ™” ๊ธฐ๋ฒ• ๋งˆ์Šคํ„ฐํ•˜๊ธฐ

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์ด๋ฒˆ์—๋Š” Webpack์˜ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋” ์ž‘๊ณ  ๋น ๋ฅธ ๋ฒˆ๋“ค์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€, ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ•จ๊ป˜ ์‚ดํŽด๋ณด์ž!

์™œ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ• ๊นŒ?

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

๐ŸŽฏ ์ตœ์ ํ™”์˜ ๋ชฉํ‘œ:

  • ๋ฒˆ๋“ค ํฌ๊ธฐ ์ค„์ด๊ธฐ
  • ๋กœ๋”ฉ ์‹œ๊ฐ„ ๋‹จ์ถ•
  • ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์†๋„ ๊ฐœ์„ 
  • ์ „์ฒด์ ์ธ ์„ฑ๋Šฅ ํ–ฅ์ƒ

์ฃผ์š” ์ตœ์ ํ™” ๊ธฐ๋ฒ•

1. ์ฝ”๋“œ ๋ถ„ํ•  (Code Splitting)

์ฝ”๋“œ ๋ถ„ํ• ์€ ํฐ ๋ฒˆ๋“ค์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ์ฒญํฌ๋กœ ๋‚˜๋ˆ„๋Š” ๊ธฐ๋ฒ•์ด์•ผ. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•„์š”ํ•œ ์ฝ”๋“œ๋งŒ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์–ด ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์ง€.


module.exports = {
  entry: {
    main: './src/index.js',
    vendor: ['react', 'react-dom', 'redux']
  },
  optimization: {
    splitChunks: {
      chunks: 'all'
    }
  }
};

2. ํŠธ๋ฆฌ ์‰์ดํ‚น (Tree Shaking)

ํŠธ๋ฆฌ ์‰์ดํ‚น์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ธฐ๋ฒ•์ด์•ผ. ES6 ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๊ณ  production ๋ชจ๋“œ์—์„œ ๋นŒ๋“œํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ ์šฉ๋ผ.


module.exports = {
  mode: 'production',
  // ...
};

3. lazy loading

lazy loading์€ ํ•„์š”ํ•œ ์‹œ์ ์— ์ฝ”๋“œ๋ฅผ ๋™์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ธฐ๋ฒ•์ด์•ผ. React.lazy()์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด.


const OtherComponent = React.lazy(() => import('./OtherComponent'));

4. ์บ์‹ฑ

ํŒŒ์ผ ์ด๋ฆ„์— ํ•ด์‹œ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์–ด.


output: {
  filename: '[name].[contenthash].js',
  path: path.resolve(__dirname, 'dist')
}

5. ๋ฏธ๋‹ˆํŒŒ์ด (Minify)

์ฝ”๋“œ๋ฅผ ์••์ถ•ํ•ด์„œ ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ๊ธฐ๋ฒ•์ด์•ผ. production ๋ชจ๋“œ์—์„œ ์ž๋™์œผ๋กœ ์ ์šฉ๋˜์ง€๋งŒ, ์ถ”๊ฐ€ ์„ค์ •์œผ๋กœ ๋” ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์–ด.


const TerserPlugin = require('terser-webpack-plugin');

module.exports = {
  optimization: {
    minimizer: [new TerserPlugin()]
  }
};

์„ฑ๋Šฅ ๋ถ„์„ ๋„๊ตฌ

์ตœ์ ํ™” ์ž‘์—…์„ ํ•  ๋•Œ๋Š” ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด. Webpack์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋„๊ตฌ๋ฅผ ์†Œ๊ฐœํ• ๊ฒŒ.

1. webpack-bundle-analyzer: ๋ฒˆ๋“ค์˜ ๊ตฌ์„ฑ์„ ์‹œ๊ฐํ™”ํ•ด์„œ ๋ณด์—ฌ์ฃผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด์•ผ.


const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

module.exports = {
  plugins: [
    new BundleAnalyzerPlugin()
  ]
};

2. speed-measure-webpack-plugin: ๊ฐ ๋กœ๋”์™€ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์†Œ์š”ํ•˜๋Š” ์‹œ๊ฐ„์„ ์ธก์ •ํ•ด์ค˜.


const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");
const smp = new SpeedMeasurePlugin();

module.exports = smp.wrap({
  // ์›นํŒฉ ์„ค์ •
});

๐Ÿ’ก Pro Tip:

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

์ž, ์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ Webpack ์ตœ์ ํ™” ๊ธฐ๋ฒ•์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ๋‚ด์šฉ์ด์•ผ. ์–ด๋•Œ, ์ตœ์ ํ™”์˜ ์ค‘์š”์„ฑ์ด ๋Š๊ปด์ง€์ง€? ์ด๋Ÿฐ ๊ธฐ๋ฒ•๋“ค์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ์žฌ๋Šฅ๋„ท๊ฐ™์€ ๋ณต์žกํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋„ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด.

์ตœ์ ํ™”๋Š” ๋์ด ์—†๋Š” ๊ณผ์ •์ด์•ผ. ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์ด ๋‚˜์˜ค๊ณ , ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฐœ์ „ํ•˜๋ฉด์„œ ์ตœ์ ํ™” ๊ธฐ๋ฒ•๋„ ๊ณ„์† ๋ณ€ํ™”ํ•˜๊ณ  ์žˆ์–ด. ๊ทธ๋ž˜์„œ ํ•ญ์ƒ ์ตœ์‹  ํŠธ๋ Œ๋“œ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉด์„œ ์ง€์†์ ์œผ๋กœ ํ•™์Šตํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด.

์—ฌ๊ธฐ๊นŒ์ง€ Webpack์— ๋Œ€ํ•œ ๋ชจ๋“  ๋‚ด์šฉ์„ ๋‹ค๋ค˜์–ด. Webpack์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ์„ค์ •, ๋กœ๋”, ํ”Œ๋Ÿฌ๊ทธ์ธ, ๊ทธ๋ฆฌ๊ณ  ์ตœ์ ํ™” ๊ธฐ๋ฒ•๊นŒ์ง€. ์ด์ œ ๋„ˆํฌ๋“ค์€ Webpack ๋งˆ์Šคํ„ฐ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์„ ์ •๋„์•ผ! ๐Ÿ˜Ž

Webpack์€ ์ •๋ง ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์•ผ. ์ฒ˜์Œ์—๋Š” ๋ณต์žกํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋ ‡๊ฒŒ ํ•˜๋‚˜์”ฉ ๋ฐฐ์›Œ๋‚˜๊ฐ€๋‹ค ๋ณด๋ฉด ์–ด๋Š์ƒˆ ์ž์œ ์ž์žฌ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ๋  ๊ฑฐ์•ผ. ์•ž์œผ๋กœ ์›น ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด์„œ Webpack์„ ํ™œ์šฉํ•  ๊ธฐํšŒ๊ฐ€ ๋งŽ์„ ๊ฑฐ์•ผ. ๊ทธ๋•Œ๋งˆ๋‹ค ์ด ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด์„œ ์กฐ๊ธˆ์”ฉ ์‹ค๋ ฅ์„ ์Œ“์•„๊ฐ€๊ธธ ๋ฐ”๋ผ!

์ž, ์ด์ œ ์ •๋ง ๋์ด์•ผ. ๊ธด ์—ฌ์ •์ด์—ˆ์ง€๋งŒ ํ•จ๊ป˜ ํ•ด์ค˜์„œ ๊ณ ๋งˆ์›Œ. ์—ฌ๋Ÿฌ๋ถ„ ๋ชจ๋‘ ํ›Œ๋ฅญํ•œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋  ๊ฑฐ๋ผ ๋ฏฟ์–ด! ํ™”์ดํŒ…! ๐Ÿš€๐ŸŒŸ