์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํซ ๋ฆฌ๋ก๋ฉ(HMR)์ด ์ด๋ป๊ฒ ์ต์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฐ๋ฐ ํจ์จ์ฑ์ ํฌ๊ฒ ํฅ์์ํค๊ณ , ๋๋ฒ๊น ์๊ฐ์ ๋จ์ถํ๋ฉฐ, ์ ๋ฐ์ ์ธ ๊ฐ๋ฐ ๊ฒฝํ์ ๊ฐ์ ํ๋์ง ์์๋ณด์ธ์.
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํซ ๋ฆฌ๋ก๋ฉ: ๊ฐ๋ฐ ํจ์จ์ฑ ๊ทน๋ํ
์ค๋๋ ๋น ๋ฅด๊ฒ ๋ณํํ๋ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์ ํจ์จ์ฑ์ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ๊ฐ๋ฐ์๋ค์ ์ํฌํ๋ก์ฐ๋ฅผ ๊ฐ์ํํ๊ณ , ๋๋ฒ๊น ์๊ฐ์ ์ค์ด๋ฉฐ, ๊ถ๊ทน์ ์ผ๋ก ๊ณ ํ์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋น ๋ฅด๊ฒ ์ ๊ณตํ๊ธฐ ์ํ ๋๊ตฌ์ ๊ธฐ์ ์ ๋์์์ด ์ฐพ๊ณ ์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ์ ์ค ์์ฒญ๋ ์ธ๊ธฐ๋ฅผ ์ป์ ๊ฒ ์ค ํ๋๊ฐ ๋ฐ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํซ ๋ฆฌ๋ก๋ฉ(HMR)์ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํซ ๋ฆฌ๋ก๋ฉ(HMR)์ด๋ ๋ฌด์์ธ๊ฐ?
HMR์ ์ ์ฒด ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ ํ์ ์์ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ ๋์ ๋ชจ๋์ ์ ๋ฐ์ดํธํ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ฌ ์ํ๋ฅผ ์์ง ์๊ณ ์ฝ๋ ๋ณ๊ฒฝ ๊ฒฐ๊ณผ๋ฅผ ๊ฑฐ์ ์ฆ์ ํ์ธํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ฌ๋ฌ ํ๋์ ์ ํจ์ฑ ๊ฒ์ฌ ๊ท์น์ด ์๋ ๋ณต์กํ ํผ์ ์์ ํ๊ณ ์๋ค๊ณ ์์ํด ๋ณด์ธ์. HMR์ด ์๋ค๋ฉด, ์คํ์ผ๋ง์ด๋ ์ ํจ์ฑ ๊ฒ์ฌ ๋ก์ง์ ์ฝ๊ฐ๋ง ๋ณ๊ฒฝํ ๋๋ง๋ค ๊ทธ ํจ๊ณผ๋ฅผ ๋ณด๊ธฐ ์ํด ๋ชจ๋ ํผ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ ๋ ฅํด์ผ ํ์ ๊ฒ์ ๋๋ค. HMR์ ์ฌ์ฉํ๋ฉด ๋ณ๊ฒฝ ์ฌํญ์ด ๋์ ์ผ๋ก ์ ์ฉ๋์ด ํผ์ ์ํ๋ฅผ ๋ณด์กดํ๊ณ ๊ท์คํ ์๊ฐ์ ์ ์ฝํ ์ ์์ต๋๋ค.
์ ํต์ ์ธ ๋ผ์ด๋ธ ๋ฆฌ๋ก๋(live reload) ์๋ฃจ์ ์ ์ผ๋ฐ์ ์ผ๋ก ๋ณ๊ฒฝ์ด ๊ฐ์ง๋ ๋๋ง๋ค ์ ์ฒด ํ์ด์ง ์๋ก๊ณ ์นจ์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. ์ด๋ ์๋์ผ๋ก ๋ธ๋ผ์ฐ์ ๋ฅผ ์๋ก๊ณ ์นจํ๋ ๊ฒ๋ณด๋ค๋ ๋ซ์ง๋ง, ์ฌ์ ํ ๊ฐ๋ฐ ํ๋ฆ์ ๋ฐฉํดํ๊ณ ํนํ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ๋๋ฆด ์ ์์ต๋๋ค. HMR์ ๋ฐ๋ฉด์ ํ์ํ ๋ชจ๋๋ง ์ ๋ฐ์ดํธํ๋ฏ๋ก ํจ์ฌ ๋ ๋น ๋ฅด๊ณ ์ํํ ๊ฐ๋ฐ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
HMR ์ฌ์ฉ์ ์ด์
HMR์ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ๋ฅผ ํฌ๊ฒ ํฅ์์ํฌ ์ ์๋ ์๋ง์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ๋ ๋น ๋ฅธ ๊ฐ๋ฐ ์ฃผ๊ธฐ: ์ ์ฒด ํ์ด์ง ์๋ก๊ณ ์นจ์ ํ์์ฑ์ ์ ๊ฑฐํจ์ผ๋ก์จ HMR์ ์ฝ๋ ๋ณ๊ฒฝ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋ํญ ๋จ์ถ์ํต๋๋ค. ์ด๋ฅผ ํตํด ๋ ๋น ๋ฅธ ๋ฐ๋ณต๊ณผ ์คํ์ด ๊ฐ๋ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋์ฟ์์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ์์ ํ๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ๋ฐฉํดํ์ง ์๊ณ ๋ ๋ธ๋ผ์ฐ์ ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์ฆ์ ๋ฐ์๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
- ๊ฐ์ ๋ ๋๋ฒ๊น ๊ฒฝํ: HMR์ ์ ๋ฐ์ดํธ ์ค ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ๋ณด์กดํ์ฌ ๋ฌธ์ ๋๋ฒ๊น ์ ๋ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. ์ฝ๋ ๋ณ๊ฒฝ์ ์ ์ฉํ๋ ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ฌ ์ํ๋ฅผ ์ ์งํ ์ ์์ผ๋ฏ๋ก ๋ฒ๊ทธ์ ์์ธ์ ๋ ํจ๊ณผ์ ์ผ๋ก ์ฐพ์๋ผ ์ ์์ต๋๋ค. ๋ณต์กํ ๋ฐ์ดํฐ ์๊ฐํ ์ปดํฌ๋ํธ๋ฅผ ๋๋ฒ๊น ํ๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ณด์ธ์. HMR์ ์ฌ์ฉํ๋ฉด ํ์ฌ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์์ง ์๊ณ ์ปดํฌ๋ํธ์ ๋ก์ง์ ์์ ํ ์ ์์ด ์ค๋ฅ๋ฅผ ์๋ณํ๊ณ ์์ ํ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋๋ค.
- ํฅ์๋ ์์ฐ์ฑ: HMR์ด ์ ๊ณตํ๋ ๋ ๋น ๋ฅธ ํผ๋๋ฐฑ ๋ฃจํ๋ ๊ฐ๋ฐ์ ์์ฐ์ฑ ํฅ์์ผ๋ก ์ด์ด์ง๋๋ค. ์๋ก๊ณ ์นจ์ ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ์ด ์ค์ด๋ค๊ณ ์ฝ๋ ์์ฑ ๋ฐ ํ ์คํธ์ ๋ ๋ง์ ์๊ฐ์ ํ ์ ํ ์ ์์ต๋๋ค. ๋ฒ ๋ฅผ๋ฆฐ์์ ์ต๊ทค๋ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ํ๋ ๊ฐ๋ฐ์๋ ํ์ด์ง ์๋ก๊ณ ์นจ์ ์ํด ๊ณ์ ๋ฐฉํด๋ฐ์ง ์๊ณ ๋น๋ฉดํ ์์ ์ ์ง์คํ ์ ์์ต๋๋ค.
- ์์ฅ ์ถ์ ์๊ฐ ๋จ์ถ: ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํจ์ผ๋ก์จ HMR์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋น ๋ฅด๊ฒ ์ ๊ณตํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ํฅ์๋ ํจ์จ์ฑ๊ณผ ๋จ์ถ๋ ๋๋ฒ๊น ์๊ฐ์ ๋ ์งง์ ๊ฐ๋ฐ ์ฃผ๊ธฐ์ ๋ ๋น ๋ฅธ ์์ฅ ์ถ์ ์๊ฐ์ผ๋ก ์ด์ด์ง๋๋ค. ์ด๋ ํนํ ์๋ก์ด ๊ธฐ๋ฅ์ด๋ ์ ํ์ ์ถ์ํ๋ ํ์ฌ์ ์ ๋ฆฌํ๋ฉฐ, ๊ฒฝ์ ์ฐ์๋ฅผ ํ๋ณดํ ์ ์๊ฒ ํด์ค๋๋ค.
- ๊ฐ๋ฐ์ ๋ง์กฑ๋ ํฅ์: ๋ ์ํํ๊ณ ํจ์จ์ ์ธ ๊ฐ๋ฐ ๊ฒฝํ์ ๋ ํ๋ณตํ ๊ฐ๋ฐ์๋ก ์ด์ด์ง๋๋ค. HMR์ ์ข์ ๊ฐ์ ์ค์ด๊ณ ์ ๋ฐ์ ์ธ ์ง์ ๋ง์กฑ๋๋ฅผ ํฅ์์ํฌ ์ ์์ต๋๋ค. ํ๋ณตํ ๊ฐ๋ฐ์๋ ๋ ์์ฐ์ ์ด๋ฉฐ ๊ณ ํ์ง ์ฝ๋๋ฅผ ์์ฑํ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์ต๋๋ค.
HMR์ ์๋ ๋ฐฉ์: ๊ฐ๋จํ ์ค๋ช
๋์ ์์ค์์ HMR์ ์ฝ๋ ํ์ผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ชจ๋ํฐ๋งํ์ฌ ์๋ํฉ๋๋ค. ๋ณ๊ฒฝ์ด ๊ฐ์ง๋๋ฉด HMR์ด ํ์ฑํ๋ ๋ฒ๋ค๋ฌ(์: Webpack, Parcel ๋๋ Snowpack)๊ฐ ์์กด์ฑ ๊ทธ๋ํ๋ฅผ ๋ถ์ํ๊ณ ์ ๋ฐ์ดํธํด์ผ ํ ๋ชจ๋์ ์๋ณํฉ๋๋ค. ์ ์ฒด ํ์ด์ง ์๋ก๊ณ ์นจ์ ํธ๋ฆฌ๊ฑฐํ๋ ๋์ , ๋ฒ๋ค๋ฌ๋ ์น์์ผ(WebSockets)์ด๋ ์ ์ฌํ ๋ฉ์ปค๋์ฆ์ ํตํด ๋ธ๋ผ์ฐ์ ์ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ๋ณด์กดํ๋ฉด์ ์ค๋๋ ๋ชจ๋์ ์ ๋ชจ๋๋ก ๊ต์ฒดํฉ๋๋ค. ์ด ๊ณผ์ ์ ์ข ์ข ์ฝ๋ ์ฃผ์ (code injection) ๋๋ ๋ผ์ด๋ธ ์ฃผ์ (live injection)์ด๋ผ๊ณ ๋ถ๋ฆฝ๋๋ค.
์ ์์ ๋์ง ์๊ณ ๋จํ์ ์ ๊ตฌ๋ฅผ ๊ต์ฒดํ๋ ๊ฒ๊ณผ ๊ฐ๋ค๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค. ๋จํ(์ ํ๋ฆฌ์ผ์ด์ )๋ ๊ณ์ ์๋ํ๊ณ , ์ ์ ๊ตฌ(์ ๋ฐ์ดํธ๋ ๋ชจ๋)๊ฐ ์ํํ๊ฒ ๊ธฐ์กด ์ ๊ตฌ๋ฅผ ๋์ฒดํฉ๋๋ค.
HMR์ ์ง์ํ๋ ์ฃผ์ ๋ฒ๋ค๋ฌ
๋ช๋ช ์ธ๊ธฐ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค๋ฌ๋ HMR์ ๋ํ ๋ด์ฅ ์ง์์ ์ ๊ณตํฉ๋๋ค. ๋ค์์ ์ฃผ๋ชฉํ ๋งํ ๋ช ๊ฐ์ง ์์ ๋๋ค:
- Webpack: Webpack์ ๊ณ ๋๋ก ๊ตฌ์ฑ ๊ฐ๋ฅํ๊ณ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ชจ๋ ๋ฒ๋ค๋ฌ์
๋๋ค.
webpack-dev-middleware
์webpack-hot-middleware
๋ฅผ ํตํด ๊ฐ๋ ฅํ HMR ์ง์์ ์ ๊ณตํฉ๋๋ค. Webpack์ ๋ณต์กํ ๋น๋ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ง ๋ณต์กํ ํ๋ก์ ํธ์ ์์ฃผ ์ ํ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ญ๋ฐ์ด์์ ๊ฐ๋ฐ๋ ๋๊ท๋ชจ ์ํฐํ๋ผ์ด์ฆ ์ ํ๋ฆฌ์ผ์ด์ ์ Webpack์ ๊ณ ๊ธ ๊ธฐ๋ฅ๊ณผ HMR ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์์ต๋๋ค. - Parcel: Parcel์ ์ฌ์ฉ ํธ์์ฑ์ผ๋ก ์๋ ค์ง ์ ๋ก ๊ตฌ์ฑ(zero-configuration) ๋ฒ๋ค๋ฌ์ ๋๋ค. HMR์ Parcel์ ๊ฐ๋ฐ ๋ชจ๋์์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์์ด ์๊ท๋ชจ ํ๋ก์ ํธ๋ ๋ ๊ฐ๋จํ ์ค์ ์ ์ ํธํ๋ ๊ฐ๋ฐ์์๊ฒ ํ๋ฅญํ ์ ํ์ ๋๋ค. ๋ถ์๋ ธ์ค์์ด๋ ์ค์ ์์ ํ์ด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ํ๊ฒ ํ๋กํ ํ์ดํํ๋ค๊ณ ์์ํด ๋ณด์ธ์. Parcel์ ์ ๋ก ๊ตฌ์ฑ HMR์ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ์ค์ ์์ด๋ ์ค์๊ฐ์ผ๋ก ๋ณ๊ฒฝ ์ฌํญ์ ์ฝ๊ฒ ํ์ธํ ์ ์์ต๋๋ค.
- Snowpack: Snowpack์ ๋ค์ดํฐ๋ธ ES ๋ชจ๋์ ํ์ฉํ๋ ํ๋์ ์ด๊ณ ๊ฐ๋ฒผ์ด ๋น๋ ๋๊ตฌ์ ๋๋ค. ๋น ๋ฅธ HMR ์ ๋ฐ์ดํธ๋ฅผ ์ ๊ณตํ๋ฉฐ ํนํ ํฌ๊ณ ํ๋์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํฉ๋๋ค. ์ฑ๊ฐํฌ๋ฅด์ ํ ํ์ด ์ต์ฒจ๋จ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ๊ตฌ์ถํ๋ค๋ฉด, ํนํ ํ๋์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ ์์ํฌ์ ๊ฒฐํฉํ์ ๋ ๊ทธ ์๋์ ํจ์จ์ฑ ๋๋ฌธ์ Snowpack์ ์ ํํ ์ ์์ต๋๋ค.
- Vite: Vite๋ ํ๋ ์น ํ๋ก์ ํธ๋ฅผ ์ํ ๋ ๋น ๋ฅด๊ณ ๊ฐ๋ฒผ์ด ๊ฐ๋ฐ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ ๋น๋ ๋๊ตฌ์ ๋๋ค. ๊ฐ๋ฐ ์ค์๋ ๋ค์ดํฐ๋ธ ES ๋ชจ๋์ ํ์ฉํ๊ณ ํ๋ก๋์ ์ ์ํด Rollup์ผ๋ก ์ฝ๋๋ฅผ ๋ฒ๋ค๋งํฉ๋๋ค. Vite๋ ๊ธฐ๋ณธ์ ์ผ๋ก HMR ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๋์ด๋ก๋น์ ๊ฐ๋ฐ์๊ฐ Vue.js ํ๋ก์ ํธ๋ฅผ ์์ ํ๋ค๊ณ ์๊ฐํด ๋ณด์ธ์. Vite์ ๋น ๋ฅธ HMR๊ณผ ์ต์ ํ๋ ๋น๋ ํ๋ก์ธ์ค๋ ๊ทธ๋ค์ ์ํฌํ๋ก์ฐ๋ฅผ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
HMR ๊ตฌํ: ์ค์ฉ์ ์ธ ์์ (Webpack)
Webpack์ ์ฌ์ฉํ์ฌ HMR์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค. ์ด ์์ ๋ ๊ธฐ๋ณธ์ ์ธ ์ค์ ์ ๋ณด์ฌ์ฃผ๋ฉฐ, ํน์ ํ๋ก์ ํธ ๊ตฌ์ฑ์ ๋ฐ๋ผ ์กฐ์ ํด์ผ ํ ์๋ ์์ต๋๋ค.
1. ์์กด์ฑ ์ค์น
๋จผ์ , ํ์ํ Webpack ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค:
npm install webpack webpack-cli webpack-dev-server webpack-hot-middleware --save-dev
2. Webpack ์ค์
ํ๋ก์ ํธ์ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ webpack.config.js
ํ์ผ์ ์์ฑํฉ๋๋ค:
const path = require('path');
const webpack = require('webpack');
module.exports = {
mode: 'development',
entry: [
'webpack-hot-middleware/client?path=/__webpack_hmr&timeout=10000',
'./src/index.js'
],
output: {
path: path.resolve(__dirname, 'dist'),
publicPath: '/',
filename: 'bundle.js'
},
plugins: [
new webpack.HotModuleReplacementPlugin()
]
};
3. ์๋ฒ ์ค์
์ ํ๋ฆฌ์ผ์ด์
์ ์ ๊ณตํ๊ณ HMR ๋ฏธ๋ค์จ์ด๋ฅผ ํ์ฑํํ๊ธฐ ์ํด ์๋ฒ ํ์ผ(์: server.js
)์ ์์ฑํฉ๋๋ค:
const express = require('express');
const webpack = require('webpack');
const webpackDevMiddleware = require('webpack-dev-middleware');
const webpackHotMiddleware = require('webpack-hot-middleware');
const config = require('./webpack.config.js');
const compiler = webpack(config);
const app = express();
app.use(webpackDevMiddleware(compiler, {
publicPath: config.output.publicPath
}));
app.use(webpackHotMiddleware(compiler));
app.get('*', (req, res) => {
res.sendFile(path.resolve(__dirname, 'dist/index.html'));
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server listening on port ${PORT}`);
});
4. ์ง์ ์ ์์
๋ฉ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ(์: src/index.js
)์ HMR์ ํ์ฑํํ๊ธฐ ์ํด ๋ค์ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค:
if (module.hot) {
module.hot.accept();
}
5. ์ ํ๋ฆฌ์ผ์ด์ ์คํ
์๋ฒ๋ฅผ ์์ํฉ๋๋ค:
node server.js
์ด์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ณ๊ฒฝํ๋ฉด, Webpack์ด ์ ์ฒด ํ์ด์ง ์๋ก๊ณ ์นจ ์์ด ๋ธ๋ผ์ฐ์ ์ ๋ชจ๋์ ์๋์ผ๋ก ์ ๋ฐ์ดํธํฉ๋๋ค.
์ฐธ๊ณ : ์ด๊ฒ์ ๋จ์ํ๋ ์์ ์ด๋ฉฐ, ํ๋ก์ ํธ์ ํน์ ์๊ตฌ์ ๋ฐ๋ผ ๊ตฌ์ฑ์ ์กฐ์ ํด์ผ ํ ์๋ ์์ต๋๋ค. ๋ ์์ธํ ์ ๋ณด๋ Webpack ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
ํจ๊ณผ์ ์ธ HMR ์ฌ์ฉ์ ์ํ ํ
HMR์ ์ด์ ์ ๊ทน๋ํํ๋ ค๋ฉด ๋ค์ ํ์ ๊ณ ๋ คํ์ธ์:
- ๋ชจ๋์ ์๊ณ ์ง์ค์ ์ผ๋ก ์ ์งํ๊ธฐ: ๋ ์์ ๋ชจ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋จธ์ง ๋ถ๋ถ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์ ๋ฐ์ดํธํ๊ณ ๊ต์ฒดํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค. ์์ธ์์ ๋๊ท๋ชจ ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌํฉํ ๋งํ๋ ๊ฐ๋ฐ์๋ HMR ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ์ด๋ฅผ ๋ ์๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ๋ชจ๋๋ก ๋ถํดํด์ผ ํฉ๋๋ค.
- ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ ์ฌ์ฉํ๊ธฐ: ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ๋ ๊ฐ๋ณ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ์ ๋ฐ์ดํธํ ์ ์์ผ๋ฏ๋ก HMR์ ๋งค์ฐ ์ ํฉํฉ๋๋ค. ํ ๋ก ํ ์์ ๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ํ๋ ํ์ HMR์ ์ต๋ํ ํ์ฉํ๊ธฐ ์ํด ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ๋ฅผ ํ์ฉํด์ผ ํฉ๋๋ค.
- ์ ์ญ ์ํ ํผํ๊ธฐ: ์ ์ญ ์ํ์ ๊ณผ๋ํ ์ฌ์ฉ์ HMR์ ๋ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ ์ญ ์ํ์ ๋ณ๊ฒฝ์ ๋ ๊ด๋ฒ์ํ ์ ๋ฐ์ดํธ๋ฅผ ํ์๋ก ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋๋์ ๊ฐ๋ฐ์๋ ๋ ์ํํ HMR ์ ๋ฐ์ดํธ๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ์ ์ญ ์ํ ์ฌ์ฉ์ ์ต์ํํด์ผ ํฉ๋๋ค.
- ์ํ ๊ด๋ฆฌ ์ ์คํ๊ฒ ๋ค๋ฃจ๊ธฐ: Redux๋ Vuex์ ๊ฐ์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋, ๋ฆฌ๋์์ ๋ฎคํ ์ด์ ์ด HMR ์ ๋ฐ์ดํธ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ๋์๋์ง ํ์ธํ์ธ์. ๋ฐ๋์์ Redux๋ก ์์ ํ๋ ๊ฐ๋ฐ์๋ ๋ฆฌ๋์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ์์ง ์๊ณ HMR ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ํด์ผ ํฉ๋๋ค.
- HMR ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํ๊ธฐ: ์ผ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ HMR๊ณผ ์์ ํ ํธํ๋์ง ์์ ์ ์์ต๋๋ค. ์์กด์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฌธ์๋ฅผ ํ์ธํ์ฌ HMR์ ์ ๋๋ก ์ง์ํ๋์ง ํ์ธํ์ธ์.
- ๋ฒ๋ค๋ฌ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ํ๊ธฐ: ๋ฒ๋ค๋ฌ๊ฐ HMR์ ๋ง๊ฒ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์๋์ง ํ์ธํ์ธ์. ์์ธํ ์ง์นจ์ ์ ํํ ๋ฒ๋ค๋ฌ์ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
์ผ๋ฐ์ ์ธ HMR ๋ฌธ์ ํด๊ฒฐ
HMR์ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง, ๊ตฌํ ์ค์ ๋ช ๊ฐ์ง ๋ฌธ์ ์ ์ง๋ฉดํ ์ ์์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ๋ฌธ์ ์ ๊ทธ ํด๊ฒฐ์ฑ ์ ๋๋ค:
- HMR ๋์ ์ ์ฒด ํ์ด์ง ์๋ก๊ณ ์นจ: ์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ๋ฒ๋ค๋ฌ๋ ์๋ฒ์ ์ค์ ๋ฌธ์ ๋ฅผ ๋ํ๋
๋๋ค. Webpack ์ค์ , ์๋ฒ ์ค์ , ๊ทธ๋ฆฌ๊ณ ์ง์
์ ์ ๋ค์ ํ์ธํ์ฌ HMR์ด ์ฌ๋ฐ๋ฅด๊ฒ ํ์ฑํ๋์๋์ง ํ์ธํ์ธ์.
HotModuleReplacementPlugin
์ด Webpack ์ค์ ์ ์ถ๊ฐ๋์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. - ์ ๋ฐ์ดํธ ์ค ์ํ ์์ค: ์ด๊ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด HMR ์ ๋ฐ์ดํธ๋ฅผ ์ ๋๋ก ์ฒ๋ฆฌํ์ง ๋ชปํ ๋ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ฆฌ๋์์ ๋ฎคํ ์ด์ ์ด ์ ๋ฐ์ดํธ ์ค ์ํ๋ฅผ ๋ณด์กดํ๋๋ก ์ค๊ณ๋์๋์ง ํ์ธํ์ธ์. ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ์ ์ฅํ๊ณ ๋ณต์ํ๊ธฐ ์ํด ์ํ ์ง์์ฑ ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์.
- ๋๋ฆฐ HMR ์ ๋ฐ์ดํธ: ๋๋ฆฐ ์ ๋ฐ์ดํธ๋ ํฐ ๋ชจ๋ ํฌ๊ธฐ๋ ๋ณต์กํ ์์กด์ฑ ๊ทธ๋ํ๋ก ์ธํด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ฝ๋๋ฅผ ๋ ์์ ๋ชจ๋๋ก ๋๋๊ณ ์์กด์ฑ ๊ทธ๋ํ๋ฅผ ์ต์ ํํ์ฌ HMR ์ฑ๋ฅ์ ํฅ์์ํค์ธ์.
- ์ํ ์์กด์ฑ: ์ํ ์์กด์ฑ์ ๋๋๋ก HMR์ ๋ฐฉํดํ ์ ์์ต๋๋ค. ์ฝ๋์์ ์ํ ์์กด์ฑ์ ์๋ณํ๊ณ ํด๊ฒฐํ์ธ์.
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋นํธํ์ฑ: ์ผ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ HMR๊ณผ ์์ ํ ํธํ๋์ง ์์ ์ ์์ต๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ต์ ๋ฒ์ ์ผ๋ก ์ ๋ฐ์ดํธํ๊ฑฐ๋ HMR์ ์ง์ํ๋ ๋์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐพ์๋ณด์ธ์.
๋ค์ํ ํ๋ ์์ํฌ์์์ HMR
HMR์ ๋ค์ํ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ ์์ํฌ์์ ๋๋ฆฌ ์ง์๋ฉ๋๋ค. ๋ค์์ ๋ช๋ช ์ธ๊ธฐ ์๋ ํ๋ ์์ํฌ์์ HMR์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ฐ๋ตํ ๊ฐ์์ ๋๋ค:
- React: ๋ฆฌ์กํธ๋
react-hot-loader
์ ๊ฐ์ ๋๊ตฌ๋ฅผ ํตํด ๋ฐ์ด๋ HMR ์ง์์ ์ ๊ณตํฉ๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ํ๋ฅผ ์์ง ์๊ณ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ์ ๋ฐ์ดํธํ ์ ์๊ฒ ํด์ค๋๋ค. ๊ณผ๋ฌ๋ผํ๋ผ์์ ๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๊ฐ๋ฐ์๋react-hot-loader
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. - Angular: ์ต๊ทค๋ฌ์ CLI๋ ๋ด์ฅ๋ HMR ์ง์์ ์ ๊ณตํฉ๋๋ค.
ng serve --hmr
์ ์คํํ์ฌ HMR์ ํ์ฑํํ ์ ์์ต๋๋ค. ์ต๊ทค๋ฌ์ HMR ๊ตฌํ์ ์ปดํฌ๋ํธ ์ํ๋ฅผ ๋ณด์กดํ๊ณ ์ํํ ๊ฐ๋ฐ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค. ์ผ์ดํํ์ด์์ ์ต๊ทค๋ฌ ํ๋ก์ ํธ๋ฅผ ์์ ํ๋ ํ์ ์ต๊ทค๋ฌ CLI์ HMR ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํ ์ ์์ต๋๋ค. - Vue.js: Vue.js๋
vue-loader
๋ฅผ ํตํด HMR์ ์ง์ํฉ๋๋ค. Vue CLI ๋ํ ๋ด์ฅ๋ HMR ์ง์์ ์ ๊ณตํฉ๋๋ค. Vue์ HMR ๊ตฌํ์ ์ํ๋ฅผ ์์ง ์๊ณ ์ปดํฌ๋ํธ๋ฅผ ์ ๋ฐ์ดํธํ ์ ์๊ฒ ํด์ค๋๋ค. ๋ชจ์คํฌ๋ฐ์์ Vue.js ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ํ๋ ๊ฐ๋ฐ์๋ Vue CLI์ HMR ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ์ค์๊ฐ์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค. - Svelte: ์ค๋ฒจํธ์ ์ปดํ์ผ๋ฌ๋ HMR ์ ๋ฐ์ดํธ๋ฅผ ํจ์จ์ ์ผ๋ก ์๋ ์ฒ๋ฆฌํฉ๋๋ค. ์ปดํฌ๋ํธ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฒด ํ์ด์ง ์๋ก๊ณ ์นจ ์์ด ์ฆ์ ๋ฐ์๋ฉ๋๋ค. HMR์ ์ค๋ฒจํธ ๊ฐ๋ฐ์ ๊ฒฝํ์ ํต์ฌ ๋ถ๋ถ์ ๋๋ค.
HMR์ ๋ฏธ๋
HMR์ ์ฑ๋ฅ, ์์ ์ฑ, ๊ทธ๋ฆฌ๊ณ ๋ค์ํ ๋๊ตฌ ๋ฐ ํ๋ ์์ํฌ์์ ํธํ์ฑ์ ๊ฐ์ ํ๊ธฐ ์ํ ์ง์์ ์ธ ๋ ธ๋ ฅ๊ณผ ํจ๊ป ๊ณ์ํด์ ์งํํ๊ณ ์์ต๋๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์ ๋ ๋ณต์กํด์ง์ ๋ฐ๋ผ, HMR์ ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํ๊ณ ๊ฐ๋ฐ์ ์์ฐ์ฑ์ ํฅ์์ํค๋ ๋ฐ ํจ์ฌ ๋ ์ค์ํ ์ญํ ์ ํ ๊ฒ์ ๋๋ค.
๋ฏธ๋์ ๋ฐ์ ์๋ ๋ค์์ด ํฌํจ๋ ์ ์์ต๋๋ค:
- ๊ฐ์ ๋ HMR ์๊ณ ๋ฆฌ์ฆ: ์ฝ๋ ๋ณ๊ฒฝ์ ๊ฐ์งํ๊ณ ์ ์ฉํ๋ ๋ ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ.
- ๊ฐํ๋ ์ํ ๋ณด์กด: HMR ์ ๋ฐ์ดํธ ์ค ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ๋ณด์กดํ๋ ๋ ๊ฐ๋ ฅํ ๊ธฐ์ .
- ๋น๋ ๋๊ตฌ์์ ๋ ๋์ ํตํฉ: ํ๋์ ์ธ ๋น๋ ๋๊ตฌ ๋ฐ ํ๋ ์์ํฌ์์ ์ํํ ํตํฉ.
- ์๋ฒ ์ฌ์ด๋ HMR ์ง์: ์๋ฒ ์ฌ์ด๋ ์ฝ๋๋ก HMR์ ํ์ฅํ์ฌ ๋ฐฑ์๋ ๋ก์ง์ ๋์ ์ ๋ฐ์ดํธ ํ์ฉ.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํซ ๋ฆฌ๋ก๋ฉ(HMR)์ ๊ฐ๋ฐ ํจ์จ์ฑ์ ํฌ๊ฒ ๋์ด๊ณ , ๋๋ฒ๊น ์๊ฐ์ ์ค์ด๋ฉฐ, ์ ๋ฐ์ ์ธ ๊ฐ๋ฐ ๊ฒฝํ์ ํฅ์์ํฌ ์ ์๋ ๊ฐ๋ ฅํ ๊ธฐ์ ์ ๋๋ค. ์ ์ฒด ํ์ด์ง ์๋ก๊ณ ์นจ ์์ด ๋์ ์ ๋ฐ์ดํธ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํจ์ผ๋ก์จ HMR์ ๊ฐ๋ฐ์๊ฐ ๋ ๋น ๋ฅด๊ฒ ๋ฐ๋ณตํ๊ณ , ๋ ํจ๊ณผ์ ์ผ๋ก ๋๋ฒ๊น ํ๋ฉฐ, ๊ถ๊ทน์ ์ผ๋ก ๊ณ ํ์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์ ์ํ๊ฒ ์ ๊ณตํ ์ ์๋๋ก ํฉ๋๋ค.
์๊ท๋ชจ ๊ฐ์ธ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ ๋๊ท๋ชจ ์ํฐํ๋ผ์ด์ฆ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ , HMR์ ๊ฐ๋ฐ ํดํท์์ ๊ท์คํ ์์ฐ์ด ๋ ์ ์์ต๋๋ค. HMR์ ์ฑํํ๊ณ ๋ ํจ์จ์ ์ด๊ณ ์ฆ๊ฑฐ์ด ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ์ ์ด์ ์ ๊ฒฝํํด ๋ณด์ธ์.
์ค๋ ๋ฐ๋ก HMR์ ํ์ํ๊ณ ๊ฐ๋ฐ ์ ์ฌ๋ ฅ์ ๋ฐํํด ๋ณด์ธ์!