Front-end

HMR(Hot Module Replacement): Vite vs Webpack ๋น„๊ต ๐ŸŒŸ

xeunnie 2025. 2. 5. 00:02
728x90
๋ฐ˜์‘ํ˜•

HMR(Hot Module Replacement): Vite vs Webpack ๋น„๊ต ๐ŸŒŸ

HMR(Hot Module Replacement)์€ ์›น ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๋กœ, ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜์ง€ ์•Š๊ณ ๋„ ๋ณ€๊ฒฝ๋œ ๋ชจ๋“ˆ์„ ์ฆ‰์‹œ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๋น ๋ฅด๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ณ , ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์ž‘์—…์„ ์ด์–ด๊ฐˆ ์ˆ˜ ์žˆ์ฃ .

 

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” HMR์ด ๋ฌด์—‡์ธ์ง€, Vite์™€ Webpack์—์„œ์˜ HMR ๋™์ž‘ ๋ฐฉ์‹, ๊ทธ๋ฆฌ๊ณ  ๋‘˜์˜ ์ฐจ์ด์ ๊ณผ ์žฅ๋‹จ์ ์„ ๋น„๊ตํ•ด ๋ณผ๊ฒŒ์š”!


HMR์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”? ๐Ÿค”

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

HMR์˜ ํ•ต์‹ฌ ๋ชฉํ‘œ

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

Webpack์—์„œ์˜ HMR ๐Ÿ”ง

Webpack์€ HMR์„ ์œ„ํ•œ ๋‚ด์žฅ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ฒˆ๋“ค๋ง ํ”„๋กœ์„ธ์Šค ์ค‘ ๋ณ€๊ฒฝ๋œ ๋ชจ๋“ˆ์„ ๊ฐ์ง€ํ•˜๊ณ , ์ด๋ฅผ ๋ธŒ๋ผ์šฐ์ €์— ์ „๋‹ฌํ•˜์—ฌ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Webpack HMR์˜ ์ž‘๋™ ๋ฐฉ์‹

  1. ๋ณ€๊ฒฝ ๊ฐ์ง€: ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜๋ฉด Webpack Dev Server๊ฐ€ ์ด๋ฅผ ๊ฐ์ง€
  2. ๋ฒˆ๋“ค ๊ฐฑ์‹ : ๋ณ€๊ฒฝ๋œ ๋ชจ๋“ˆ๋งŒ ๋‹ค์‹œ ๋ฒˆ๋“ค๋ง
  3. ๋ชจ๋“ˆ ์—…๋ฐ์ดํŠธ: ๋ณ€๊ฒฝ๋œ ๋ชจ๋“ˆ๋งŒ ๋ธŒ๋ผ์šฐ์ €์— ํ‘ธ์‹œ. ์ „์ฒด ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด UI ๊ฐฑ์‹ 
npm install webpack webpack-cli webpack-dev-server --save-dev
// webpack.config.js
module.exports = {
  devServer: {
    hot: true, // HMR ํ™œ์„ฑํ™”
  },
};

์žฅ์ 

  • ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋„ ์•ˆ์ •์ ์œผ๋กœ ๋™์ž‘
  • ๋‹ค์–‘ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ๋กœ๋”๋กœ ์œ ์—ฐ์„ฑ ์ œ๊ณต

๋‹จ์ 

  • ๋ฒˆ๋“ค๋ง ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ์ˆ˜๋ก HMR ์†๋„๊ฐ€ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Œ
  • ํฐ ํ”„๋กœ์ ํŠธ์—์„œ ์ดˆ๊ธฐ ๋กœ๋“œ๊ฐ€ ๋А๋ฆด ๊ฐ€๋Šฅ์„ฑ

Vite์—์„œ์˜ HMR โšก๏ธ

Vite๋Š” HMR์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด์žฅํ•˜๋ฉฐ, Webpack๊ณผ ๋‹ฌ๋ฆฌ ES ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

Vite๋Š” ๋ฒˆ๋“ค๋ง ์—†์ด ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ HMR ์„ฑ๋Šฅ์ด ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค.

Vite HMR์˜ ์ž‘๋™ ๋ฐฉ์‹

  1. ๋ณ€๊ฒฝ ๊ฐ์ง€: Vite๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€
  2. ๋ชจ๋“ˆ ๊ฐฑ์‹ : ๋ณ€๊ฒฝ๋œ ๋ชจ๋“ˆ์„ ์ฆ‰์‹œ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „๋‹ฌ
    • ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ณ€๊ฒฝ๋œ ES ๋ชจ๋“ˆ๋งŒ ๋‹ค์‹œ ๋กœ๋“œ
  3. ์ƒํƒœ ์œ ์ง€: ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ์—…๋ฐ์ดํŠธํ•˜๋ฏ€๋กœ ๋ธŒ๋ผ์šฐ์ € ์ƒํƒœ๋Š” ์œ ์ง€๋จ
npm create vite@latest my-app
cd my-app
npm install
npm run dev

์žฅ์ 

  • ๋ฒˆ๋“ค๋ง์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— HMR ์†๋„๊ฐ€ ๋ˆˆ์— ๋„๊ฒŒ ๋น ๋ฆ„
  • ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๊นŒ์ง€ ์ ํ•ฉ

๋‹จ์ 

  • HMR์ด ES ๋ชจ๋“ˆ์— ์˜์กดํ•˜๋ฏ€๋กœ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Œ

Vite vs Webpack: HMR ๋น„๊ต ๐ŸฅŠ

๊ธฐ์ค€ Vite Webpack
๊ธฐ์ˆ  ๊ธฐ๋ฐ˜ ES ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜์˜ ๋„ค์ดํ‹ฐ๋ธŒ HMR ๋ฒˆ๋“ค ๊ธฐ๋ฐ˜ HMR
์†๋„ ๋ฒˆ๋“ค๋ง ์—†์ด ๋ณ€๊ฒฝ๋œ ๋ชจ๋“ˆ๋งŒ ๋กœ๋“œํ•˜์—ฌ ๋งค์šฐ ๋น ๋ฆ„ ๋ฒˆ๋“ค๋ง์„ ํฌํ•จํ•˜์—ฌ ์†๋„๊ฐ€ ๋А๋ฆด ์ˆ˜ ์žˆ์Œ
์ƒํƒœ ์œ ์ง€ ๋ณ€๊ฒฝ๋œ ๋ชจ๋“ˆ๋งŒ ์—…๋ฐ์ดํŠธ, ์ƒํƒœ ์œ ์ง€ ํƒ์›” ๋ณ€๊ฒฝ๋œ ๋ชจ๋“ˆ๋งŒ ์—…๋ฐ์ดํŠธ, ๊ทธ๋Ÿฌ๋‚˜ ๋ฒˆ๋“ค๋ง ์‹œ๊ฐ„ ์˜ํ–ฅ
์„ค์ • ๋ณ„๋„์˜ ์„ค์ • ํ•„์š” ์—†์Œ HMR ์„ค์ •์ด ํ•„์š”
ํ”Œ๋Ÿฌ๊ทธ์ธ ์ง€์› Vite ์ „์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ•„์š” ํ’๋ถ€ํ•œ ์ƒํƒœ๊ณ„์˜ ๋‹ค์–‘ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ง€์›
๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์šฐ์ˆ˜ํ•œ ์„ฑ๋Šฅ ์ œ๊ณต ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ์ดˆ๊ธฐ ๋กœ๋“œ ์‹œ๊ฐ„์ด ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Œ

์–ธ์ œ Vite์™€ Webpack์„ ์‚ฌ์šฉํ• ๊นŒ? ๐Ÿค”

  1. Vite๊ฐ€ ์ ํ•ฉํ•œ ๊ฒฝ์šฐ
    • ๋น ๋ฅธ HMR์ด ์ค‘์š”ํ•œ ์†Œ๊ทœ๋ชจ ๋˜๋Š” ์ค‘์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ
    • ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €๋งŒ ํƒ€๊ฒŸ์œผ๋กœ ํ•˜๋Š” ํ”„๋กœ์ ํŠธ
    • ๊ฐœ๋ฐœ ์ค‘ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
  2. Webpack์ด ์ ํ•ฉํ•œ ๊ฒฝ์šฐ
    • ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ๋ณต์žกํ•œ ์˜์กด์„ฑ
    • ์˜ค๋ž˜๋œ ๋ธŒ๋ผ์šฐ์ €๊นŒ์ง€ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
    • ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ๋กœ๋”๊ฐ€ ํ’๋ถ€ํ•œ ์ƒํƒœ๊ณ„ ํ™œ์šฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ

HMR ์‚ฌ์šฉ ์˜ˆ์ œ: React ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ

Webpack๊ณผ React

// webpack.config.js
const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');

module.exports = {
  mode: 'development',
  devServer: {
    hot: true,
  },
  plugins: [new ReactRefreshWebpackPlugin()],
};

Vite์™€ React

// vite.config.js
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';

export default defineConfig({
  plugins: [react()],
});

๊ฒฐ๋ก : Vite vs Webpack, HMR ์ตœ์ข… ์ •๋ฆฌ

  • ์†๋„ ์ค‘์‹ฌ์ด๋ผ๋ฉด Vite๊ฐ€ ํƒ์›”ํ•œ ์„ ํƒ
  • ํ”Œ๋Ÿฌ๊ทธ์ธ ํ™œ์šฉ ๋ฐ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ € ์ง€์›์ด ์ค‘์š”ํ•˜๋‹ค๋ฉด Webpack์ด ์ ํ•ฉ

๐ŸŒท์ „์„ค์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ด…์‹œ๋‹น!๐ŸŒท

728x90
๋ฐ˜์‘ํ˜•