μ΅μμ μΉ μ±λ₯μ κ²½ννμΈμ. κ°λ ₯ν λꡬλ€μ μ¬μ©νμ¬ μλ°μ€ν¬λ¦½νΈ λ²λ€ ν¬κΈ°λ₯Ό λΆμνκ³ , μμ‘΄μ± κ·Έλνλ₯Ό μκ°ννλ©°, μ΅μ ν κΈ°νλ₯Ό μ°Ύλ λ°©λ²μ λ°°μ°μΈμ.
μλ°μ€ν¬λ¦½νΈ λ²λ€ λΆμ: μμ‘΄μ± κ·Έλν μκ°ν λꡬ μ¬μΈ΅ λΆμ
νλ μΉ κ°λ°μ μΈκ³μμ μλ°μ€ν¬λ¦½νΈλ μλμ μ΄κ³ μνΈμμ©μ μΈ μ¬μ©μ κ²½νμ ꡬλνλ μμ§μ λλ€. νμ§λ§ μ ν리μΌμ΄μ μ 볡μ‘μ±μ΄ μ¦κ°ν¨μ λ°λΌ μλ°μ€ν¬λ¦½νΈμ κ·λͺ¨λ 컀μ§λλ€. ν¬κ³ μ΅μ νλμ§ μμ μλ°μ€ν¬λ¦½νΈ λ²λ€μ μΉ μ±λ₯μ κ°μ₯ ν° λ³λͺ© νμμ΄ λ μ μμΌλ©°, μ΄λ λλ¦° λ‘λ© μκ°, μ¬μ©μμ λΆλ§, κ·Έλ¦¬κ³ κΈ°ν μμ€λ‘ μ΄μ΄μ§λλ€. μ΄λ μμΈμ μ΄κ³ μ κ΄μ¬μ μ°κ²°λΆν° μΈλ μ골μ κ°νμ μΈ λͺ¨λ°μΌ λ€νΈμν¬μ μ΄λ₯΄κΈ°κΉμ§ λͺ¨λ μ¬μ©μμκ² μν₯μ λ―ΈμΉλ 보νΈμ μΈ λ¬Έμ μ λλ€.
μ΄λ¬ν λμ§νΈ λΉλνλ₯Ό μ΄λ»κ² ν΄κ²°ν μ μμκΉμ? 첫 λ²μ§Έ λ¨κ³λ μΆμΈ‘μ΄ μλ μΈ‘μ μ λλ€. λ°λ‘ μ¬κΈ°μ μλ°μ€ν¬λ¦½νΈ λ²λ€ λΆμ λ° μμ‘΄μ± κ·Έλν μκ°ν λκ΅¬κ° νμν©λλ€. μ΄ κ°λ ₯ν μ νΈλ¦¬ν°λ€μ μ ν리μΌμ΄μ μ DNAμ λν μκ°μ μ§λλ₯Ό μ 곡νμ¬, λ²λ€ μμ μ νν 무μμ΄ λ€μ΄μλμ§, μ΄λ€ μμ‘΄μ±μ΄ κ°μ₯ ν°μ§, κ·Έλ¦¬κ³ μ μ¬μ μΈ μ΅μ ν μ§μ μ΄ μ΄λμ μλμ§λ₯Ό 보μ¬μ€λλ€. μ΄ κ°μ΄λλ μ΄λ¬ν λꡬλ€μ λν ν¬κ΄μ μΈ μλ΄λ₯Ό ν΅ν΄, μ¬λ¬λΆμ΄ μ±λ₯ λ¬Έμ λ₯Ό μ§λ¨νκ³ μ μΈκ³ μ¬μ©μλ₯Ό μν΄ λ κ°λ³κ³ λΉ λ₯Έ μΉ μ ν리μΌμ΄μ μ ꡬμΆν μ μλλ‘ λμμ€ κ²μ λλ€.
λ²λ€ λΆμμ΄ μΉ μ±λ₯μ μ μ€μνκ°?
λꡬμ λν΄ μμ보기 μ μ, μ΄ κ³Όμ μ΄ μ κ·Έν λ‘ μ€μνμ§λ₯Ό μ΄ν΄νλ κ²μ΄ νμμ μ λλ€. μλ°μ€ν¬λ¦½νΈ λ²λ€μ ν¬κΈ°λ μ¬μ©μ κ²½νμ μ μνλ ν΅μ¬ μ±λ₯ μ§νμ μ§μ μ μΈ μν₯μ λ―ΈμΉ©λλ€:
- First Contentful Paint (FCP): ν° λ²λ€μ λ©μΈ μ€λ λλ₯Ό μ°¨λ¨νμ¬ λΈλΌμ°μ κ° μ²« λ²μ§Έ μ½ν μΈ λ₯Ό λ λλ§νλ κ²μ μ§μ°μν¬ μ μμ΅λλ€.
- Time to Interactive (TTI): νμ΄μ§κ° μμ ν μνΈμμ© κ°λ₯ν΄μ§κΈ°κΉμ§ 걸리λ μκ°μ μΈ‘μ ν©λλ€. μ¬μ©μκ° λ²νΌμ ν΄λ¦νκ±°λ νΌκ³Ό μνΈμμ©νκΈ° μ μ μλ°μ€ν¬λ¦½νΈλ λ€μ΄λ‘λ, νμ±, μ»΄νμΌ, μ€νλμ΄μΌ ν©λλ€. λ²λ€μ΄ ν΄μλ‘ μ΄ κ³Όμ μ λ μ€λ 걸립λλ€.
- λ°μ΄ν° λΉμ© λ° μ κ·Όμ±: μ νμ μ΄κ±°λ μ’ λμ λͺ¨λ°μΌ λ°μ΄ν° μκΈμ λ₯Ό μ¬μ©νλ μ¬μ©μμκ² μ λ©κ°λ°μ΄νΈμ μλ°μ€ν¬λ¦½νΈ λ€μ΄λ‘λλ λ¨μν λΆνΈν¨μ΄ μλλΌ μ€μ μ μΈ κΈμ μ λΉμ©μ λλ€. λ²λ€μ μ΅μ ννλ κ²μ μ΄λμλ λͺ¨λ μ¬λμ μν ν¬μ©μ μ΄κ³ μ κ·Όμ± μλ μΉμ ꡬμΆνκΈ° μν μ€μν λ¨κ³μ λλ€.
λ³Έμ§μ μΌλ‘, λ²λ€ λΆμμ 'μλ°μ€ν¬λ¦½νΈμ λΉμ©'μ κ΄λ¦¬νλ λ° λμμ μ€λλ€. μ΄λ "λ΄ μ¬μ΄νΈκ° λ리λ€"λ μΆμμ μΈ λ¬Έμ λ₯Ό ꡬ체μ μ΄κ³ μ€ν κ°λ₯ν κ°μ κ³νμΌλ‘ μ νμμΌ μ€λλ€.
μμ‘΄μ± κ·Έλν μ΄ν΄νκΈ°
λͺ¨λ νλ μλ°μ€ν¬λ¦½νΈ μ ν리μΌμ΄μ μ μ€μ¬μλ μμ‘΄μ± κ·Έλνκ° μμ΅λλ€. μ΄λ₯Ό μ½λμ κ°κ³λλΌκ³ μκ°ν΄λ³΄μΈμ. `main.js`μ κ°μ μ§μ μ (entry point)μ΄ μκ³ , μ΄ νμΌμ λ€λ₯Έ λͺ¨λλ€μ κ°μ Έμ΅λλ€(import). μ΄ λͺ¨λλ€μ λ€μ μμ λ€μ μμ‘΄μ±μ κ°μ Έμ€λ©°, μνΈ μ°κ²°λ νμΌλ€μ κ±°λν λ€νΈμν¬λ₯Ό λ§λλλ€.
Webpack, Rollup, λλ Viteμ κ°μ λͺ¨λ λ²λ€λ¬λ₯Ό μ¬μ©ν λ, μ΄λ€μ μ£Όμ μ무λ μ§μ μ μμ μμνμ¬ μ΄ μ 체 κ·Έλνλ₯Ό μννκ³ , νμν λͺ¨λ μ½λλ₯Ό νλ μ΄μμ μΆλ ₯ νμΌ, μ¦ 'λ²λ€'λ‘ μ‘°λ¦½νλ κ²μ λλ€.
μμ‘΄μ± κ·Έλν μκ°ν λꡬλ μ΄ κ³Όμ μ κ°μ ν©λλ€. μ΄λ€μ μ΅μ’ λ²λ€μ΄λ λ²λ€λ¬μ λ©νλ°μ΄ν°λ₯Ό λΆμνμ¬ μ΄ κ·Έλνμ μκ°μ ννμ μμ±νλ©°, μΌλ°μ μΌλ‘ κ° λͺ¨λμ ν¬κΈ°λ₯Ό 보μ¬μ€λλ€. μ΄λ₯Ό ν΅ν΄ μ½λ κ°κ³λμ μ΄λ€ κ°μ§κ° μ΅μ’ 무κ²μ κ°μ₯ λ§μ΄ κΈ°μ¬νλμ§ νλμ νμ ν μ μμ΅λλ€.
λ²λ€ μ΅μ νμ ν΅μ¬ κ°λ
λΆμ λꡬμμ μ»μ ν΅μ°°λ ₯μ μ¬λ¬λΆμ΄ ꡬννλ λ° λμμ΄ λλ μ΅μ ν κΈ°λ²μ μ΄ν΄ν λ κ°μ₯ ν¨κ³Όμ μ λλ€. ν΅μ¬ κ°λ μ λ€μκ³Ό κ°μ΅λλ€:
- νΈλ¦¬ μμ΄νΉ(Tree Shaking): μ΅μ’ λ²λ€μμ μ¬μ©λμ§ μλ μ½λ('μ£½μ μ½λ')λ₯Ό μλμΌλ‘ μ κ±°νλ κ³Όμ μ λλ€. μλ₯Ό λ€μ΄, Lodashμ κ°μ μ νΈλ¦¬ν° λΌμ΄λΈλ¬λ¦¬λ₯Ό κ°μ Έμ€μ§λ§ λ¨ νλμ ν¨μλ§ μ¬μ©νλ κ²½μ°, νΈλ¦¬ μμ΄νΉμ μ 체 λΌμ΄λΈλ¬λ¦¬κ° μλ ν΄λΉ νΉμ ν¨μλ§ ν¬ν¨λλλ‘ λ³΄μ₯ν©λλ€.
- μ½λ μ€ν리ν (Code Splitting): νλμ κ±°λν λ²λ€μ λ§λλ λμ , μ½λ μ€ν리ν μ μ΄λ₯Ό λ μκ³ λ Όλ¦¬μ μΈ μ²ν¬(chunk)λ‘ λλλλ€. νμ΄μ§/λΌμ°νΈλ³(`home.js`, `profile.js`) λλ κΈ°λ₯λ³(`vendors.js`)λ‘ λΆν ν μ μμ΅λλ€. μ΄ μ²ν¬λ€μ νμν λ λ‘λλ μ μμ΄ μ΄κΈ° νμ΄μ§ λ‘λ μκ°μ κ·Ήμ μΌλ‘ κ°μ ν©λλ€.
- μ€λ³΅ μμ‘΄μ± μλ³: λμΌν ν¨ν€μ§κ° λ²λ€μ μ¬λ¬ λ² ν¬ν¨λλ κ²μ λλΌμΈ μ λλ‘ νν μΌμ΄λ©°, μ’ μ’ λ€λ₯Έ νμ μμ‘΄μ±μ΄ λ€λ₯Έ λ²μ μ μꡬνκΈ° λλ¬Έμ λ°μν©λλ€. μκ°ν λꡬλ μ΄λ¬ν μ€λ³΅μ λͺ ννκ² λ³΄μ¬μ€λλ€.
- λκ·λͺ¨ μμ‘΄μ± λΆμ: μΌλΆ λΌμ΄λΈλ¬λ¦¬λ μ λͺ λμ μ λλ‘ ν½λλ€. λΆμκΈ°λ κ²λ³΄κΈ°μ 무ν΄ν΄ 보μ΄λ λ μ§ νμ λΌμ΄λΈλ¬λ¦¬κ° μ¬λ¬λΆμ΄ νμ μλ μμ κΈ°κ°λ°μ΄νΈμ λ‘μΌμΌ λ°μ΄ν°λ₯Ό ν¬ν¨νκ³ μκ±°λ, μ°¨νΈ λΌμ΄λΈλ¬λ¦¬κ° μ 체 μ ν리μΌμ΄μ νλ μμν¬λ³΄λ€ 무κ²λ€λ κ²μ λ°νλΌ μ μμ΅λλ€.
μ£Όμ μμ‘΄μ± κ·Έλν μκ°ν λꡬ λλ¬λ³΄κΈ°
μ΄μ μ΄λ¬ν κ°λ λ€μ μ€μ λ‘ κ΅¬νν΄μ£Όλ λꡬλ€μ μ΄ν΄λ³΄κ² μ΅λλ€. λ§μ λκ΅¬κ° μ‘΄μ¬νμ§λ§, μ¬κΈ°μλ λ€μν μꡬμ μνκ³μ λ§μΆ° κ°μ₯ μΈκΈ° μκ³ κ°λ ₯ν μ΅μ μ μ΄μ μ λ§μΆ κ²μ λλ€.
1. webpack-bundle-analyzer
μκ°: Webpackμ μ¬μ©νλ λͺ¨λ μ¬λμ μν μ¬μ€μμ νμ€μ λλ€. μ΄ νλ¬κ·ΈμΈμ λΈλΌμ°μ μμ λ²λ€ μ½ν μΈ μ λνν νΈλ¦¬λ§΅ μκ°νλ₯Ό μμ±ν©λλ€.
μ£Όμ νΉμ§:
- λνν νΈλ¦¬λ§΅: λ²λ€μ λ€λ₯Έ λΆλΆμ ν΄λ¦νκ³ νλνμ¬ μ΄λ€ λͺ¨λμ΄ λ ν° λΆλΆμ μ°¨μ§νλμ§ νμΈν μ μμ΅λλ€.
- λ€μ€ ν¬κΈ° μ§ν: `stat` ν¬κΈ°(μ²λ¦¬ μ μλ³Έ νμΌ ν¬κΈ°), `parsed` ν¬κΈ°(νμ± ν μλ°μ€ν¬λ¦½νΈ μ½λ ν¬κΈ°), `gzipped` ν¬κΈ°(μμΆ ν ν¬κΈ°, μ¬μ©μκ° λ€μ΄λ‘λν ν¬κΈ°μ κ°μ₯ κ°κΉμ)λ₯Ό νμν μ μμ΅λλ€.
- μ¬μ΄ ν΅ν©: Webpack νλ¬κ·ΈμΈμ΄λ―λ‘ κΈ°μ‘΄ `webpack.config.js` νμΌμ μΆκ°νλ κ²μ΄ λ§€μ° κ°λ¨ν©λλ€.
μ¬μ© λ°©λ²:
λ¨Όμ , κ°λ° μμ‘΄μ±μΌλ‘ μ€μΉν©λλ€:
npm install --save-dev webpack-bundle-analyzer
κ·Έλ° λ€μ, Webpack μ€μ μ μΆκ°ν©λλ€:
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
module.exports = {
// ... λ€λ₯Έ μΉν© μ€μ
plugins: [
new BundleAnalyzerPlugin()
]
};
Webpack λΉλλ₯Ό μ€ννλ©΄ λνν λ³΄κ³ μκ° ν¬ν¨λ λΈλΌμ°μ μ°½μ΄ μλμΌλ‘ μ΄λ¦½λλ€.
μ¬μ© μμ : Webpackμ μ¬μ©νλ λͺ¨λ νλ‘μ νΈμ μλ²½ν μμμ μ λλ€. λ¨μμ±κ³Ό κ°λ ₯ν μκ°ν κΈ°λ₯ λλΆμ κ°λ° μ€ λΉ λ₯Έ μ§λ¨κ³Ό μ κΈ°μ μΈ μ κ²μ μ΄μμ μ λλ€.
2. source-map-explorer
μκ°: μλ°μ€ν¬λ¦½νΈ μμ€ λ§΅μ μ¬μ©νμ¬ νλ‘λμ λ²λ€μ λΆμνλ νλ μμν¬μ ꡬμ λ°μ§ μλ λꡬμ λλ€. μμ€ λ§΅μ μμ±νκΈ°λ§ νλ©΄ Webpack, Rollup, Vite, Parcel λ± λͺ¨λ λ²λ€λ¬μ ν¨κ» μλν©λλ€.
μ£Όμ νΉμ§:
- λ²λ€λ¬μ ꡬμ λ°μ§ μμ: κ°μ₯ ν° κ°μ μ λλ€. λΉλ λꡬμ κ΄κ³μμ΄ λͺ¨λ νλ‘μ νΈμμ μ¬μ©ν μ μμ΄ νμ©λκ° λ§€μ° λμ΅λλ€.
- μλ³Έ μμ€ μ½λμ μ§μ€: μμ€ λ§΅μ μ¬μ©νλ―λ‘ λ²λ€λ μ½λλ₯Ό μλ³Έ μμ€ νμΌμ λ€μ λ§€νν©λλ€. μ΄λ₯Ό ν΅ν΄ `node_modules`λΏλ§ μλλΌ μ체 μ½λλ² μ΄μ€μμ λΉλνκ° μ΄λμ λ°μνλμ§ λ μ½κ² μ΄ν΄ν μ μμ΅λλ€.
- κ°λ¨ν CLI μΈν°νμ΄μ€: 컀맨λ λΌμΈ λꡬμ΄λ―λ‘ νμν λ μ€ννκ±°λ μ€ν¬λ¦½νΈμ ν΅ν©νκΈ° μ½μ΅λλ€.
μ¬μ© λ°©λ²:
λ¨Όμ , λΉλ νλ‘μΈμ€μμ μμ€ λ§΅μ μμ±νλμ§ νμΈν©λλ€. κ·Έλ° λ€μ, λꡬλ₯Ό μ μ λλ λ‘μ»¬λ‘ μ€μΉν©λλ€:
npm install --save-dev source-map-explorer
λ²λ€ λ° μμ€ λ§΅ νμΌμ λν΄ μ€νν©λλ€:
npx source-map-explorer /path/to/your/bundle.js
μ΄λ `webpack-bundle-analyzer`μ μ μ¬ν HTML νΈλ¦¬λ§΅ μκ°νλ₯Ό μμ±νκ³ μ½λλ€.
μ¬μ© μμ : Webpackμ μ¬μ©νμ§ μλ νλ‘μ νΈ(μ: Vite, Rollup λλ Webpackμ μΆμννλ Create React AppμΌλ‘ λΉλλ νλ‘μ νΈ)μ μ΄μμ μ λλ€. λν μλνν° λΌμ΄λΈλ¬λ¦¬λΏλ§ μλλΌ μ체 μ ν리μΌμ΄μ μ½λμ κΈ°μ¬λλ₯Ό λΆμνκ³ μΆμ λλ νλ₯ν©λλ€.
3. Statoscope
μκ°: λ²λ€ λΆμμ μν ν¬κ΄μ μ΄κ³ λ§€μ° μ§λ³΄λ ν΄ν·μ λλ€. Statoscopeλ λ¨μν νΈλ¦¬λ§΅μ ν¨μ¬ λ°μ΄λμ΄ μμΈν λ³΄κ³ μ, λΉλ λΉκ΅, μ¬μ©μ μ μ κ·μΉ κ²μ¦μ μ 곡ν©λλ€.
μ£Όμ νΉμ§:
- μ¬μΈ΅ λ³΄κ³ μ: λͺ¨λ, ν¨ν€μ§, μ§μ μ λ° μ€λ³΅ λͺ¨λκ³Ό κ°μ μ μ¬μ λ¬Έμ μ λν μμΈ μ 보λ₯Ό μ 곡ν©λλ€.
- λΉλ λΉκ΅: μ΄κ²μ΄ ν΅μ¬ κΈ°λ₯μ λλ€. λ κ°μ λ€λ₯Έ λΉλ(μ: μμ‘΄μ± μ κ·Έλ μ΄λ μ ν)λ₯Ό λΉκ΅νμ¬ μ νν 무μμ΄ λ³κ²½λμκ³ λ²λ€ ν¬κΈ°μ μ΄λ€ μν₯μ λ―Έμ³€λμ§ νμΈν μ μμ΅λλ€.
- μ¬μ©μ μ μ κ·μΉ λ° λ¨μΈ: μ±λ₯ μμ°κ³Ό κ·μΉ(μ: "λ²λ€ ν¬κΈ°κ° 500KBλ₯Ό μ΄κ³Όνλ©΄ λΉλ μ€ν¨" λλ "μλ‘μ΄ λκ·λͺ¨ μμ‘΄μ±μ΄ μΆκ°λλ©΄ κ²½κ³ ")μ μ μν μ μμ΅λλ€.
- μνκ³ μ§μ: Webpack μ μ© νλ¬κ·ΈμΈμ΄ μμΌλ©° Rollup λ° λ€λ₯Έ λ²λ€λ¬μ ν΅κ³λ μ¬μ©ν μ μμ΅λλ€.
μ¬μ© λ°©λ²:
Webpackμ κ²½μ°, νλ¬κ·ΈμΈμ μΆκ°ν©λλ€:
npm install --save-dev @statoscope/webpack-plugin
κ·Έλ° λ€μ, `webpack.config.js`μ:
const StatoscopeWebpackPlugin = require('@statoscope/webpack-plugin').default;
module.exports = {
// ... λ€λ₯Έ μΉν© μ€μ
plugins: [
new StatoscopeWebpackPlugin()
]
};
λΉλ ν μΆλ ₯ λλ ν 리μ μμΈν HTML λ³΄κ³ μκ° μμ±λ©λλ€.
μ¬μ© μμ : Statoscopeλ μν°νλΌμ΄μ¦κΈ λꡬμ λλ€. μ±λ₯ μμ°μ κ°μ νκ³ , CI/CD νκ²½μμ μκ° κ²½κ³Όμ λ°λ₯Έ λ²λ€ ν¬κΈ°λ₯Ό μΆμ νκ±°λ, λΉλ κ°μ κΉμ΄ μλ λΉκ΅ λΆμμ μνν΄μΌ ν λ μ¬μ©ν©λλ€. μ±λ₯μ΄ κ°μ₯ μ€μν λκ·λͺ¨ νκ³Ό λ―Έμ ν¬λ¦¬ν°μ»¬ μ ν리μΌμ΄μ μ μ ν©ν©λλ€.
4. κΈ°ν μ£Όλͺ©ν λ§ν λꡬλ€
- rollup-plugin-visualizer (Vite/Rollupμ©): Rollup μνκ³(Viteκ° λ΄λΆμ μΌλ‘ μ¬μ©)λ₯Ό μν νλ₯νκ³ κ°λ¨ν νλ¬κ·ΈμΈμ λλ€. λνν μ λ²μ€νΈ λλ νΈλ¦¬λ§΅ μ°¨νΈλ₯Ό μ 곡νμ¬ Vite λ° Rollup μ¬μ©μλ₯Ό μν `webpack-bundle-analyzer`μ λλ±ν μν μ ν©λλ€.
- Bundle-buddy: μ€λλμμ§λ§ μ¬μ ν μ μ©ν λꡬλ‘, μ½λ μ€ν리ν μ€μ μμ νν λ°μνλ λ¬Έμ μΈ μ¬λ¬ λ²λ€ μ²ν¬μ κ±ΈμΉ μ€λ³΅ μμ‘΄μ±μ μ°Ύλ λ° λμμ μ€λλ€.
μ€μ μ°μ΅: λΆμμμ μ€νκΉμ§
μλ리μ€λ₯Ό μμν΄ λ΄ μλ€. νλ‘μ νΈμμ `webpack-bundle-analyzer`λ₯Ό μ€ννλλ λ λΌμ΄λΈλ¬λ¦¬, `moment.js`μ `lodash`κ° λ²λ€μ μλΉ λΆλΆμ μ°¨μ§νλ μκ°ν κ²°κ³Όλ₯Ό λ³΄κ² λμμ΅λλ€.
1λ¨κ³: μκ°ν λΆμ
- 컀λ€λ `moment.js` λΈλ‘ μλ‘ λ§μ°μ€λ₯Ό κ°μ Έκ° 보λ κ·Έ μμ κ±°λν `locales` λλ ν λ¦¬κ° μλ κ²μ λ°κ²¬ν©λλ€. μ ν리μΌμ΄μ μ μμ΄λ§ μ§μνλλ°, μμ κ°κ΅μ μΈμ΄ μ§μμ ν¨κ» μ 곡νκ³ μμλ κ²μ λλ€.
- `lodash`μ λν λ κ°μ κ°λ³ λΈλ‘μ΄ λ³΄μ λλ€. μμΈν μ΄ν΄λ³΄λ μ±μ ν λΆλΆμ `lodash@4.17.15`λ₯Ό μ¬μ©νκ³ , μ€μΉν λ€λ₯Έ μμ‘΄μ±μ `lodash-es@4.17.10`λ₯Ό μ¬μ©νκ³ μλ€λ κ²μ κΉ¨λ«μ΅λλ€. μ€λ³΅λ μμ‘΄μ±μ΄ μλ κ²μ λλ€.
2λ¨κ³: κ°μ€ μ립 λ° ν΄κ²°μ± ꡬν
κ°μ€ 1: μ¬μ©νμ§ μλ λ‘μΌμΌμ μ κ±°νμ¬ `moment.js`μ ν¬κΈ°λ₯Ό λν μ€μΌ μ μλ€.
ν΄κ²°μ± : `moment-locales-webpack-plugin`κ³Ό κ°μ μ μ© Webpack νλ¬κ·ΈμΈμ μ¬μ©νμ¬ λ‘μΌμΌμ μ κ±°ν©λλ€. λλ ν¨μ¬ λ κ°λ³κ³ νλμ μΈ λμμΈ Day.jsλ date-fnsλ‘ λ§μ΄κ·Έλ μ΄μ νλ κ²μ κ³ λ €ν©λλ€. μ΄ λΌμ΄λΈλ¬λ¦¬λ€μ λͺ¨λμμ΄λ©° νΈλ¦¬ μμ΄νΉμ΄ κ°λ₯νλλ‘ μ€κ³λμμ΅λλ€.
κ°μ€ 2: λ¨μΌ λ²μ μ κ°μ νμ¬ μ€λ³΅λ `lodash`λ₯Ό μ κ±°ν μ μλ€.
ν΄κ²°μ± : ν¨ν€μ§ κ΄λ¦¬μμ κΈ°λ₯μ μ¬μ©νμ¬ μΆ©λμ ν΄κ²°ν©λλ€. npmμ κ²½μ°, `package.json`μ `overrides` νλλ₯Ό μ¬μ©νμ¬ μ 체 νλ‘μ νΈμ λν΄ λ¨μΌ λ²μ μ `lodash`λ₯Ό μ§μ ν μ μμ΅λλ€. Yarnμ κ²½μ°, `resolutions` νλλ₯Ό μ¬μ©ν μ μμ΅λλ€. μ λ°μ΄νΈ ν `npm install` λλ `yarn install`μ λ€μ μ€νν©λλ€.
3λ¨κ³: κ°μ μ¬ν νμΈ
μ΄λ¬ν λ³κ²½ μ¬νμ ꡬνν ν, λ²λ€ λΆμκΈ°λ₯Ό λ€μ μ€νν©λλ€. `moment.js` λΈλ‘μ΄ νμ νκ² μμμ‘κ±°λ(λλ ν¨μ¬ μμ `date-fns`λ‘ λ체λμκ±°λ) λ¨μΌνλ `lodash` λΈλ‘λ§ λ³΄μ΄λ κ²μ νμΈν μ μμ κ²μ λλ€. μ¬λ¬λΆμ λ°©κΈ μκ°ν λꡬλ₯Ό μ±κ³΅μ μΌλ‘ μ¬μ©νμ¬ μ ν리μΌμ΄μ μ±λ₯μ μ€μ§μ μΈ κ°μ μ μ΄λ£¨μμ΅λλ€.
μν¬νλ‘μ°μ λ²λ€ λΆμ ν΅ν©νκΈ°
λ²λ€ λΆμμ μΌνμ± μκΈ μ²μΉμ¬μλ μ λ©λλ€. κ³ μ±λ₯ μ ν리μΌμ΄μ μ μ μ§νλ €λ©΄ μ κΈ°μ μΈ κ°λ° νλ‘μΈμ€μ ν΅ν©ν΄μΌ ν©λλ€.
- λ‘컬 κ°λ°: νΉμ λͺ λ Ήμ΄(μ: `npm run analyze`)λ‘ νμν λ λΆμκΈ°λ₯Ό μ€ννλλ‘ λΉλ λꡬλ₯Ό ꡬμ±ν©λλ€. μλ‘μ΄ μ£Όμ μμ‘΄μ±μ μΆκ°ν λλ§λ€ μ¬μ©νμΈμ.
- ν 리νμ€νΈ(Pull Request) νμΈ: λͺ¨λ ν 리νμ€νΈμ λ²λ€ λΆμ λ³΄κ³ μ λ§ν¬(λλ ν¬κΈ° λ³κ²½ μμ½)μ ν¨κ» λκΈμ κ²μνλ GitHub Action λλ λ€λ₯Έ CI μμ μ μ€μ ν©λλ€. μ΄λ μ±λ₯μ μ½λ 리뷰 νλ‘μΈμ€μ λͺ μμ μΈ λΆλΆμΌλ‘ λ§λλλ€.
- CI/CD νμ΄νλΌμΈ: Statoscopeλ μ¬μ©μ μ μ μ€ν¬λ¦½νΈμ κ°μ λꡬλ₯Ό μ¬μ©νμ¬ μ±λ₯ μμ°μ μ€μ ν©λλ€. λΉλλ‘ μΈν΄ λ²λ€μ΄ νΉμ ν¬κΈ° μκ³κ°μ μ΄κ³Όνλ©΄ CI νμ΄νλΌμΈμ΄ μ€ν¨νλλ‘ νμ¬ μ±λ₯ μ νκ° νλ‘λμ μ λλ¬νλ κ²μ λ°©μ§ν μ μμ΅λλ€.
κ²°λ‘ : λ¦°(Lean) μλ°μ€ν¬λ¦½νΈμ κΈ°μ
μΈκ³νλ λμ§νΈ νκ²½μμ μ±λ₯μ κΈ°λ₯μ λλ€. κ°λ³κ³ μ΅μ νλ μλ°μ€ν¬λ¦½νΈ λ²λ€μ μ¬μ©μμ κΈ°κΈ°, λ€νΈμν¬ μλ, μμΉμ κ΄κ³μμ΄ μ ν리μΌμ΄μ μ΄ λΉ λ₯΄κ³ , μ κ·Ό κ°λ₯νλ©°, μ¦κ±°μ΄ κ²½νμ μ 곡νλλ‘ λ³΄μ₯ν©λλ€. μμ‘΄μ± κ·Έλν μκ°ν λꡬλ μ΄ μ¬μ μμ μ¬λ¬λΆμ νμμ μΈ λλ°μμ λλ€. μ΄λ€μ μΆμΈ‘μ λ°μ΄ν°λ‘ λ체νμ¬ μ ν리μΌμ΄μ ꡬμ±μ λν λͺ ννκ³ μ€ν κ°λ₯ν ν΅μ°°λ ₯μ μ 곡ν©λλ€.
μ κΈ°μ μΌλ‘ λ²λ€μ λΆμνκ³ , μμ‘΄μ±μ μν₯μ μ΄ν΄νλ©°, μ΄λ¬ν κ΄νμ νμ μν¬νλ‘μ°μ ν΅ν©ν¨μΌλ‘μ¨ μ¬λ¬λΆμ λ¦° μλ°μ€ν¬λ¦½νΈμ κΈ°μ μ λ§μ€ν°ν μ μμ΅λλ€. μ€λ λ°λ‘ λ²λ€ λΆμμ μμνμΈμ. μ μΈκ³μ μ¬μ©μλ€μ΄ μ¬λ¬λΆμκ² κ°μ¬ν κ²μ λλ€.