μμ‘΄μ± κ·Έλνλ‘ νλ°νΈμλ λΉλ μ±λ₯μ λ§μ€ν°νμΈμ. λΉλ μμ μ΅μ ν, λ³λ ¬ν, μ€λ§νΈ μΊμ± λ° Webpack, Vite, Nx, Turborepoμ κ°μ κ³ κΈ λκ΅¬κ° μ μΈκ³ κΈλ‘λ² κ°λ°νκ³Ό μ§μμ ν΅ν© νμ΄νλΌμΈμ ν¨μ¨μ±μ μ΄λ»κ² νκΈ°μ μΌλ‘ κ°μ νλμ§ μμ보μΈμ.
νλ°νΈμλ λΉλ μμ€ν μμ‘΄μ± κ·Έλν: κΈλ‘λ² νμ μν μ΅μ μ λΉλ μμ ν보
μ ν리μΌμ΄μ μ 볡μ‘μ±μ΄ μ¦κ°νκ³ κ°λ°νμ΄ μ¬λ¬ λλ₯μ κ±Έμ³ μλ μλμ μΈ μΉ κ°λ° μΈκ³μμ λΉλ μκ°μ μ΅μ ννλ κ²μ λ¨μν μμΌλ©΄ μ’μ κ²μ΄ μλλΌ νμμ μΈ κ³Όμ μ λλ€. λλ¦° λΉλ νλ‘μΈμ€λ κ°λ°μ μμ°μ±μ μ ν΄νκ³ , λ°°ν¬λ₯Ό μ§μ°μν€λ©°, κΆκ·Ήμ μΌλ‘λ μ‘°μ§μ΄ μ μνκ² νμ νκ³ κ°μΉλ₯Ό μ λ¬νλ λ₯λ ₯μ μν₯μ λ―ΈμΉ©λλ€. κΈλ‘λ² νμ κ²½μ°, λ€μν λ‘컬 νκ²½, λ€νΈμν¬ μ§μ° μκ°, λ°©λν μμ νμ λ³κ²½ μ¬νκ³Ό κ°μ μμΈλ€λ‘ μΈν΄ μ΄λ¬ν μ΄λ €μμ λμ± κ°μ€λ©λλ€.
ν¨μ¨μ μΈ νλ°νΈμλ λΉλ μμ€ν μ ν΅μ¬μλ μ’ μ’ κ³Όμνκ°λλ κ°λ μΈ μμ‘΄μ± κ·Έλν(dependency graph)κ° μμ΅λλ€. μ΄ λ³΅μ‘ν μΉμ μ½λλ² μ΄μ€μ κ°λ³ μ‘°κ°λ€μ΄ μ΄λ»κ² μνΈ μ°κ΄λλμ§, κ·Έλ¦¬κ³ κ²°μ μ μΌλ‘ μ΄λ€ μμλ‘ μ²λ¦¬λμ΄μΌ νλμ§λ₯Ό μ ννκ² μ§μν©λλ€. μ΄ κ·Έλνλ₯Ό μ΄ν΄νκ³ νμ©νλ κ²μ΄ λΉλ μκ°μ ν¬κ² λ¨μΆνκ³ , μνν νμ μ κ°λ₯νκ² νλ©°, μ μΈκ³ λͺ¨λ κΈ°μ μμ μΌκ΄λκ³ κ³ νμ§μ λ°°ν¬λ₯Ό 보μ₯νλ μ΄μ μ λλ€.
μ΄ μ’ ν© κ°μ΄λμμλ νλ°νΈμλ μμ‘΄μ± κ·Έλνμ λ©μ»€λμ¦μ κΉμ΄ νκ³ λ€κ³ , λΉλ μμ μ΅μ νλ₯Ό μν κ°λ ₯ν μ λ΅μ νꡬνλ©°, νΉν κ΅μ μ μΌλ‘ λΆμ°λ κ°λ° μΈλ ₯μ μν΄ μ΅κ³ μ λꡬμ κ΄νμ΄ μ΄λ¬ν κ°μ μ μ΄λ»κ² μ΄μ§νλμ§ μ΄ν΄λ³Ό κ²μ λλ€. μλ ¨λ μν€ν νΈ, λΉλ μμ§λμ΄, λλ μν¬νλ‘μ°λ₯Ό λν κ°μ νκ³ μ νλ κ°λ°μμ΄λ , μμ‘΄μ± κ·Έλνλ₯Ό λ§μ€ν°νλ κ²μ μ¬λ¬λΆμ λ€μ νμ λ¨κ³μ λλ€.
νλ°νΈμλ λΉλ μμ€ν μ΄ν΄νκΈ°
νλ°νΈμλ λΉλ μμ€ν μ΄λ?
νλ°νΈμλ λΉλ μμ€ν μ λ³Έμ§μ μΌλ‘ μ¬λμ΄ μ½μ μ μλ μμ€ μ½λλ₯Ό μΉ λΈλΌμ°μ κ° μ€νν μ μλ κ³ λλ‘ μ΅μ νλ νλ‘λμ μ€λΉ μμ°μΌλ‘ λ³ννλλ‘ μ€κ³λ μ κ΅ν λꡬ λ° κ΅¬μ± μΈνΈμ λλ€. μ΄ λ³ν νλ‘μΈμ€λ μΌλ°μ μΌλ‘ λ€μκ³Ό κ°μ λͺ κ°μ§ μ€μν λ¨κ³λ₯Ό ν¬ν¨ν©λλ€:
- νΈλμ€νμΌλ§(Transpilation): μ΅μ JavaScript(ES6+) λλ TypeScriptλ₯Ό λΈλΌμ°μ μ νΈνλλ JavaScriptλ‘ λ³νν©λλ€.
- λ²λ€λ§(Bundling): μ¬λ¬ λͺ¨λ νμΌ(μ: JavaScript, CSS)μ λ μ μ μμ μ΅μ νλ λ²λ€λ‘ κ²°ν©νμ¬ HTTP μμ²μ μ€μ λλ€.
- μ΅μν(Minification): νμΌ ν¬κΈ°λ₯Ό μ€μ΄κΈ° μν΄ μ½λμμ λΆνμν λ¬Έμ(곡백, μ£Όμ, μ§§μ λ³μ μ΄λ¦)λ₯Ό μ κ±°ν©λλ€.
- μ΅μ ν(Optimization): μ΄λ―Έμ§, κΈκΌ΄ λ° κΈ°ν μμ°μ μμΆνκ³ , νΈλ¦¬ μ °μ΄νΉ(μ¬μ©νμ§ μλ μ½λ μ κ±°), μ½λ μ€ν리ν μ μνν©λλ€.
- μμ° ν΄μ±(Asset Hashing): ν¨κ³Όμ μΈ μ₯κΈ° μΊμ±μ μν΄ νμΌ μ΄λ¦μ κ³ μ ν ν΄μλ₯Ό μΆκ°ν©λλ€.
- λ¦°ν λ° ν μ€νΈ(Linting and Testing): μ½λ νμ§κ³Ό μ νμ±μ 보μ₯νκΈ° μν΄ λΉλ μ λ¨κ³λ‘ ν΅ν©λλ κ²½μ°κ° λ§μ΅λλ€.
νλ°νΈμλ λΉλ μμ€ν μ λ°μ μ λ§€μ° λΉ¨λμ΅λλ€. Grunt λ° Gulpμ κ°μ μ΄κΈ° νμ€ν¬ λ¬λλ λ°λ³΅μ μΈ μμ μ μλννλ λ° μ€μ μ λμμ΅λλ€. κ·Έ ν Webpack, Rollup, Parcelκ³Ό κ°μ λͺ¨λ λ²λ€λ¬κ° λ±μ₯νμ¬ μ κ΅ν μμ‘΄μ± ν΄κ²° λ° λͺ¨λ λ²λ€λ§μ μ λ©΄μ λ΄μΈμ μ΅λλ€. μ΅κ·Όμλ Vite λ° esbuildμ κ°μ λꡬλ€μ΄ λ€μ΄ν°λΈ ES λͺ¨λ μ§μκ³Ό λλλλ‘ λΉ λ₯Έ μ»΄νμΌ μλλ‘ νκ³λ₯Ό λμ± λνμΌλ©°, ν΅μ¬ μμ μ Goλ Rustμ κ°μ μΈμ΄λ₯Ό νμ©ν©λλ€. μ΄λ€ λͺ¨λμ 곡ν΅μ μ μμ‘΄μ±μ ν¨μ¨μ μΌλ‘ κ΄λ¦¬νκ³ μ²λ¦¬ν΄μΌ νλ€λ κ²μ λλ€.
ν΅μ¬ κ΅¬μ± μμ:
λꡬλ§λ€ νΉμ μ©μ΄κ° λ€λ₯Ό μ μμ§λ§, λλΆλΆμ μ΅μ νλ°νΈμλ λΉλ μμ€ν μ μ΅μ’ κ²°κ³Όλ¬Όμ μμ±νκΈ° μν΄ μνΈ μμ©νλ κΈ°λ³Έ κ΅¬μ± μμλ₯Ό 곡μ ν©λλ€:
- μ§μ μ (Entry Points): μ ν리μΌμ΄μ λλ νΉμ λ²λ€μ μμ νμΌλ‘, λΉλ μμ€ν μ΄ μμ‘΄μ±μ μννκΈ° μμνλ μ§μ μ λλ€.
- 리쑸λ²(Resolvers): κ°μ Έμ€κΈ°(import) λ¬Έμ κΈ°λ°μΌλ‘ λͺ¨λμ μ 체 κ²½λ‘λ₯Ό κ²°μ νλ λ©μ»€λμ¦μ λλ€(μ: "lodash"κ° `node_modules/lodash/index.js`μ λ§€νλλ λ°©μ).
- λ‘λ/νλ¬κ·ΈμΈ/νΈλμ€ν¬λ¨Έ(Loaders/Plugins/Transformers): κ°λ³ νμΌμ΄λ λͺ¨λμ μ²λ¦¬νλ μΌκΎΌλ€μ λλ€.
- Webpackμ νμΌμ μ μ²λ¦¬νκΈ° μν΄ "λ‘λ"(μ: JavaScriptμ© `babel-loader`, CSSμ© `css-loader`)λ₯Ό μ¬μ©νκ³ , λ κ΄λ²μν μμ μ μν΄ "νλ¬κ·ΈμΈ"(μ: HTMLμ μμ±νλ `HtmlWebpackPlugin`, μ΅μνλ₯Ό μν `TerserPlugin`)μ μ¬μ©ν©λλ€.
- Viteλ Rollupμ νλ¬κ·ΈμΈ μΈν°νμ΄μ€λ₯Ό νμ©νλ "νλ¬κ·ΈμΈ"κ³Ό μ΄κ³ μ μ»΄νμΌμ μν΄ esbuildμ κ°μ λ΄λΆ "νΈλμ€ν¬λ¨Έ"λ₯Ό μ¬μ©ν©λλ€.
- μΆλ ₯ ꡬμ±(Output Configuration): μ»΄νμΌλ μμ°μ μ΄λμ λ°°μΉν μ§, νμΌ μ΄λ¦μ 무μμΌλ‘ ν μ§, μ΄λ»κ² μ²ν¬λ‘ λλμ§ μ§μ ν©λλ€.
- μ΅μ ν λꡬ(Optimizers): νΈλ¦¬ μ °μ΄νΉ, μ€μ½ν νΈμ΄μ€ν λλ μ΄λ―Έμ§ μμΆκ³Ό κ°μ κ³ κΈ μ±λ₯ ν₯μμ μ μ©νλ μ μ© λͺ¨λ λλ ν΅ν© κΈ°λ₯μ λλ€.
μ΄λ¬ν κ° κ΅¬μ± μμλ μ€μν μν μ νλ©°, μ΄λ€μ ν¨μ¨μ μΈ μ‘°μ¨μ΄ κ°μ₯ μ€μν©λλ€. νμ§λ§ λΉλ μμ€ν μ μμ² κ°μ νμΌμ κ±Έμ³ μ΄λ¬ν λ¨κ³λ₯Ό μ€νν μ΅μ μ μμλ₯Ό μ΄λ»κ² μ μ μμκΉμ?
μ΅μ νμ μ¬μ₯: μμ‘΄μ± κ·Έλν
μμ‘΄μ± κ·Έλνλ?
μ 체 νλ°νΈμλ μ½λλ² μ΄μ€λ₯Ό 볡μ‘ν λ€νΈμν¬λΌκ³ μμν΄ λ³΄μμμ€. μ΄ λ€νΈμν¬μμ κ° νμΌ, λͺ¨λ λλ μμ°(JavaScript νμΌ, CSS νμΌ, μ΄λ―Έμ§ λλ 곡μ κ΅¬μ± λ±)μ λ Έλ(node)μ λλ€. ν νμΌμ΄ λ€λ₯Έ νμΌμ μμ‘΄ν λλ§λ€βμλ₯Ό λ€μ΄, JavaScript νμΌ `A`κ° νμΌ `B`μ ν¨μλ₯Ό κ°μ Έμ€κ±°λ, CSS νμΌμ΄ λ€λ₯Έ CSS νμΌμ κ°μ Έμ¬ λβνμΌ `A`μμ νμΌ `B`λ‘ νμ΄ν, μ¦ μ£μ§(edge)κ° κ·Έλ €μ§λλ€. μ΄λ¬ν μνΈ μ°κ²°μ 볡μ‘ν μ§λλ₯Ό μμ‘΄μ± κ·Έλν(dependency graph)λΌκ³ ν©λλ€.
μ€μν κ²μ νλ°νΈμλ μμ‘΄μ± κ·Έλνλ μΌλ°μ μΌλ‘ λ°©ν₯μ± λΉμν κ·Έλν(Directed Acyclic Graph, DAG)λΌλ μ μ λλ€. "λ°©ν₯μ±"μ νμ΄νκ° λͺ νν λ°©ν₯μ κ°μ§μ μλ―Έν©λλ€(Aλ Bμ μμ‘΄νμ§λ§, λ°λμ Bκ° Aμ μμ‘΄νλ κ²μ μλ). "λΉμν"μ μν μμ‘΄μ±μ΄ μμμ μλ―Έν©λλ€(Aκ° Bμ μμ‘΄νκ³ , Bκ° Aμ μμ‘΄νμ¬ λ¬΄ν 루νλ₯Ό λ§λλ κ²½μ°λ μμ). μ΄λ λΉλ νλ‘μΈμ€λ₯Ό μ€λ¨μν€κ³ μ μλμ§ μμ λμμ μ λ°ν μ μμ΅λλ€. λΉλ μμ€ν μ import λ° export λ¬Έ, `require()` νΈμΆ, μ¬μ§μ΄ CSS `@import` κ·μΉμ νμ±νμ¬ μ μ λΆμμ ν΅ν΄ μ΄ κ·Έλνλ₯Ό κΌΌκΌΌνκ² κ΅¬μ±νκ³ , λͺ¨λ λ¨μΌ κ΄κ³λ₯Ό ν¨κ³Όμ μΌλ‘ λ§€νν©λλ€.
μλ₯Ό λ€μ΄, κ°λ¨ν μ ν리μΌμ΄μ μ μκ°ν΄ λ³΄κ² μ΅λλ€:
- `main.js`λ `app.js`μ `styles.css`λ₯Ό κ°μ Έμ΅λλ€.
- `app.js`λ `components/button.js`μ `utils/api.js`λ₯Ό κ°μ Έμ΅λλ€.
- `components/button.js`λ `components/button.css`λ₯Ό κ°μ Έμ΅λλ€.
- `utils/api.js`λ `config.js`λ₯Ό κ°μ Έμ΅λλ€.
μ΄μ λν μμ‘΄μ± κ·Έλνλ `main.js`μμ μμνμ¬ κ·Έ μμ‘΄ μμλ‘, κ·Έλ¦¬κ³ λ€μ κ·Έλ€μ μμ‘΄ μμλ‘, λͺ¨λ 리ν λ Έλ(λ μ΄μ λ΄λΆ μμ‘΄μ±μ΄ μλ νμΌ)μ λλ¬ν λκΉμ§ μ 보μ λͺ νν νλ¦μ 보μ¬μ€ κ²μ λλ€.
λΉλ μμμ μ μ€μνκ°?
μμ‘΄μ± κ·Έλνλ λ¨μ§ μ΄λ‘ μ μΈ κ°λ μ΄ μλλλ€. μ΄κ²μ μ ννκ³ ν¨μ¨μ μΈ λΉλ μμλ₯Ό μ§μνλ κΈ°λ³Έ μ²μ¬μ§μ λλ€. μ΄κ²μ΄ μλ€λ©΄ λΉλ μμ€ν μ μ μ μ‘°κ±΄μ΄ μ€λΉλμλμ§ λͺ¨λ₯Έ μ± νμΌμ μ»΄νμΌνλ €κ³ μλνλ©° κΈΈμ μμ κ²μ λλ€. μ΄κ²μ΄ μ κ·Έλ κ² μ€μνμ§μ λν μ΄μ λ λ€μκ³Ό κ°μ΅λλ€:
- μ νμ± λ³΄μ₯: λ§μ½ `λͺ¨λ A`κ° `λͺ¨λ B`μ μμ‘΄νλ€λ©΄, `λͺ¨λ B`λ `λͺ¨λ A`κ° μ ννκ² μ²λ¦¬λκΈ° μ μ λ°λμ μ²λ¦¬λκ³ μ¬μ© κ°λ₯ν΄μΌ ν©λλ€. κ·Έλνλ μ΄ "μ -ν" κ΄κ³λ₯Ό λͺ μμ μΌλ‘ μ μν©λλ€. μ΄ μμλ₯Ό 무μνλ©΄ "λͺ¨λμ μ°Ύμ μ μμ"κ³Ό κ°μ μ€λ₯λ λΆμ νν μ½λ μμ±μ μ΄λν μ μμ΅λλ€.
- κ²½μ 쑰건 λ°©μ§: λ€μ€ μ€λ λ λλ λ³λ ¬ λΉλ νκ²½μμλ λ§μ νμΌμ΄ λμμ μ²λ¦¬λ©λλ€. μμ‘΄μ± κ·Έλνλ λͺ¨λ μμ‘΄μ±μ΄ μ±κ³΅μ μΌλ‘ μλ£λμμ λλ§ μμ μ΄ μμλλλ‘ λ³΄μ₯νμ¬, ν μμ μ΄ μμ§ μ€λΉλμ§ μμ μΆλ ₯μ μ κ·Όνλ €λ κ²½μ 쑰건μ λ°©μ§ν©λλ€.
- μ΅μ νμ κΈ°λ°: κ·Έλνλ λͺ¨λ κ³ κΈ λΉλ μ΅μ νκ° κ΅¬μΆλλ κΈ°λ°μ λλ€. λ³λ ¬ν, μΊμ±, μ¦λΆ λΉλμ κ°μ μ λ΅μ λ 립μ μΈ μμ λ¨μλ₯Ό μλ³νκ³ μ€μ λ‘ λ¬΄μμ λ€μ λΉλν΄μΌ νλμ§ κ²°μ νκΈ° μν΄ μ μ μΌλ‘ κ·Έλνμ μμ‘΄ν©λλ€.
- μμΈ‘ κ°λ₯μ± λ° μ¬νμ±: μ μ μλ μμ‘΄μ± κ·Έλνλ μμΈ‘ κ°λ₯ν λΉλ κ²°κ³Όλ‘ μ΄μ΄μ§λλ€. λμΌν μ λ ₯μ΄ μ£Όμ΄μ§λ©΄ λΉλ μμ€ν μ λμΌν μμμ λ¨κ³λ₯Ό λ°λ₯΄λ©° λ§€λ² λμΌν μΆλ ₯ μν°ν©νΈλ₯Ό μμ±ν©λλ€. μ΄λ μ μΈκ³μ μΌλ‘ λ€λ₯Έ νκ²½κ³Ό νμ κ±Έμ³ μΌκ΄λ λ°°ν¬λ₯Ό μν΄ λ§€μ° μ€μν©λλ€.
λ³Έμ§μ μΌλ‘, μμ‘΄μ± κ·Έλνλ νΌλμ€λ¬μ΄ νμΌ λͺ¨μμ μ‘°μ§νλ μν¬νλ‘μ°λ‘ λ³νν©λλ€. μ΄λ₯Ό ν΅ν΄ λΉλ μμ€ν μ μ½λλ² μ΄μ€λ₯Ό μ§λ₯μ μΌλ‘ νμνκ³ , μ²λ¦¬ μμ, λμμ μ²λ¦¬ν μ μλ νμΌ, μμ ν 건λλΈ μ μλ λΉλ λΆλΆμ λν΄ μ 보μ μ κ°ν κ²°μ μ λ΄λ¦΄ μ μμ΅λλ€.
λΉλ μμ μ΅μ ν μ λ΅
μμ‘΄μ± κ·Έλνλ₯Ό ν¨κ³Όμ μΌλ‘ νμ©νλ©΄ νλ°νΈμλ λΉλ μκ°μ μ΅μ ννκΈ° μν 무μν μ λ΅μ λ¬Έμ΄ μ΄λ¦½λλ€. μ΄λ¬ν μ λ΅μ λ λ§μ μμ μ λμμ μννκ³ , μ€λ³΅ μμ μ νΌνλ©°, μμ λ²μλ₯Ό μ΅μννμ¬ μ΄ μ²λ¦¬ μκ°μ μ€μ΄λ κ²μ λͺ©νλ‘ ν©λλ€.
1. λ³λ ¬ν: ν λ²μ λ λ§μ μμ μννκΈ°
λΉλ μλλ₯Ό λμ΄λ κ°μ₯ μν₯λ ₯ μλ λ°©λ² μ€ νλλ μ¬λ¬ λ 립μ μΈ μμ μ λμμ μννλ κ²μ λλ€. μμ‘΄μ± κ·Έλνλ λΉλμ μ΄λ€ λΆλΆμ΄ μνΈ μμ‘΄μ±μ΄ μμ΄ λ³λ ¬λ‘ μ²λ¦¬λ μ μλμ§λ₯Ό λͺ ννκ² μλ³νκΈ° λλ¬Έμ μ¬κΈ°μ μ€μν μν μ ν©λλ€.
μ΅μ λΉλ μμ€ν μ λ©ν°μ½μ΄ CPUλ₯Ό νμ©νλλ‘ μ€κ³λμμ΅λλ€. μμ‘΄μ± κ·Έλνκ° κ΅¬μ±λλ©΄ λΉλ μμ€ν μ μ΄λ₯Ό μννμ¬ "리ν λ Έλ"(λ―Έν΄κ²° μμ‘΄μ±μ΄ μλ νμΌ) λλ λ 립μ μΈ λΈλμΉλ₯Ό μ°Ύμ μ μμ΅λλ€. μ΄λ¬ν λ 립μ μΈ λ Έλ/λΈλμΉλ λμ μ²λ¦¬λ₯Ό μν΄ λ€λ₯Έ CPU μ½μ΄λ μ컀 μ€λ λμ ν λΉλ μ μμ΅λλ€. μλ₯Ό λ€μ΄, `λͺ¨λ A`μ `λͺ¨λ B`κ° λͺ¨λ `λͺ¨λ C`μ μμ‘΄νμ§λ§, `λͺ¨λ A`μ `λͺ¨λ B`κ° μλ‘ μμ‘΄νμ§ μλ κ²½μ°, `λͺ¨λ C`κ° λ¨Όμ λΉλλμ΄μΌ ν©λλ€. `λͺ¨λ C`κ° μ€λΉλ νμλ `λͺ¨λ A`μ `λͺ¨λ B`λ₯Ό λ³λ ¬λ‘ λΉλν μ μμ΅λλ€.
- Webpackμ `thread-loader`: μ΄ λ‘λλ λΉμ©μ΄ λ§μ΄ λλ λ‘λ(μ: `babel-loader` λλ `ts-loader`) μμ λ°°μΉνμ¬ λ³λμ μ컀 νμμ μ€νν μ μμΌλ©°, νΉν λκ·λͺ¨ μ½λλ² μ΄μ€μ μ»΄νμΌ μλλ₯Ό ν¬κ² ν₯μμν΅λλ€.
- Rollup λ° Terser: Terserμ κ°μ λκ΅¬λ‘ JavaScript λ²λ€μ μ΅μνν λ, μ¬λ¬ CPU μ½μ΄μ κ±Έμ³ μ΅μνλ₯Ό λ³λ ¬ννκΈ° μν΄ μ컀 νλ‘μΈμ€ μ(`numWorkers`)λ₯Ό ꡬμ±ν μ μλ κ²½μ°κ° λ§μ΅λλ€.
- κ³ κΈ λͺ¨λ Έλ ν¬ λꡬ(Nx, Turborepo, Bazel): μ΄ λꡬλ€μ λ λμ μμ€μμ μλνμ¬, νμΌ μμ€μ μμ‘΄μ±μ λμ΄ λͺ¨λ Έλ ν¬ λ΄μ νλ‘μ νΈ κ° μμ‘΄μ±μ ν¬κ΄νλ "νλ‘μ νΈ κ·Έλν"λ₯Ό μμ±ν©λλ€. λ³κ²½ μ¬νμ μν΄ λͺ¨λ Έλ ν¬μ μ΄λ€ νλ‘μ νΈκ° μν₯μ λ°λμ§ λΆμν λ€μ, μν₯μ λ°λ νλ‘μ νΈμ λν λΉλ, ν μ€νΈ λλ λ¦°νΈ μμ μ λ¨μΌ λ¨Έμ λΏλ§ μλλΌ λΆμ°λ λΉλ μμ΄μ νΈμμλ λ³λ ¬λ‘ μ€νν μ μμ΅λλ€. μ΄λ λ§μ μνΈ μ°κ²°λ μ ν리μΌμ΄μ κ³Ό λΌμ΄λΈλ¬λ¦¬λ₯Ό κ°μ§ λκ·λͺ¨ μ‘°μ§μ νΉν κ°λ ₯ν©λλ€.
λ³λ ¬νμ μ΄μ μ μλΉν©λλ€. μμ² κ°μ λͺ¨λμ΄ μλ νλ‘μ νΈμ κ²½μ°, μ¬μ© κ°λ₯ν λͺ¨λ CPU μ½μ΄λ₯Ό νμ©νλ©΄ λΉλ μκ°μ λͺ λΆμμ λͺ μ΄λ‘ λ¨μΆνμ¬ κ°λ°μ κ²½νκ³Ό CI/CD νμ΄νλΌμΈ ν¨μ¨μ±μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€. κΈλ‘λ² νμ κ²½μ°, λ λΉ λ₯Έ λ‘컬 λΉλλ λ€λ₯Έ μκ°λμ μλ κ°λ°μλ€μ΄ λ μ μνκ² λ°λ³΅ μμ μ μνν μ μμμ μλ―Ένλ©°, CI/CD μμ€ν μ κ±°μ μ¦κ°μ μΌλ‘ νΌλλ°±μ μ 곡ν μ μμ΅λλ€.
2. μΊμ±: μ΄λ―Έ λΉλλ κ²μ λ€μ λΉλνμ§ μκΈ°
μ΄λ―Έ ν μμ μ μ λ ν΄μΌ ν κΉμ? μΊμ±μ λΉλ μ΅μ νμ μ΄μμΌλ‘, λΉλ μμ€ν μ΄ λ§μ§λ§ λΉλ μ΄ν μ λ ₯μ΄ λ³κ²½λμ§ μμ νμΌμ΄λ λͺ¨λμ μ²λ¦¬λ₯Ό 건λλΈ μ μκ² ν΄μ€λλ€. μ΄ μ λ΅μ 무μμ μμ νκ² μ¬μ¬μ©ν μ μλμ§ μ ννκ² μλ³νκΈ° μν΄ μμ‘΄μ± κ·Έλνμ ν¬κ² μμ‘΄ν©λλ€.
λͺ¨λ μΊμ±:
κ°μ₯ μΈλΆνλ μμ€μμ λΉλ μμ€ν μ κ°λ³ λͺ¨λ μ²λ¦¬ κ²°κ³Όλ₯Ό μΊμν μ μμ΅λλ€. νμΌμ΄ λ³νλ λ(μ: TypeScriptμμ JavaScriptλ‘), κ·Έ μΆλ ₯μ μ μ₯λ μ μμ΅λλ€. μμ€ νμΌκ³Ό λͺ¨λ μ§μ μ μΈ μμ‘΄μ±μ΄ λ³κ²½λμ§ μμλ€λ©΄, μΊμλ μΆλ ₯μ νμ λΉλμμ μ§μ μ¬μ¬μ©λ μ μμ΅λλ€. μ΄λ μ’ μ’ λͺ¨λμ λ΄μ©κ³Ό ꡬμ±μ ν΄μλ₯Ό κ³μ°νμ¬ λ¬μ±λ©λλ€. ν΄μκ° μ΄μ μ μΊμλ λ²μ κ³Ό μΌμΉνλ©΄ λ³ν λ¨κ³κ° μλ΅λ©λλ€.
- Webpackμ `cache` μ΅μ : Webpack 5λ κ°λ ₯ν μꡬ μΊμ±μ λμ νμ΅λλ€. `cache.type: 'filesystem'`μ μ€μ νλ©΄, Webpackμ λΉλ λͺ¨λκ³Ό μμ°μ μ§λ ¬νλ₯Ό λμ€ν¬μ μ μ₯νμ¬, κ°λ° μλ²λ₯Ό λ€μ μμν νμλ νμ λΉλλ₯Ό ν¨μ¬ λΉ λ₯΄κ² λ§λλλ€. λ΄μ©μ΄λ μμ‘΄μ±μ΄ λ³κ²½λλ©΄ μΊμλ λͺ¨λμ μ§λ₯μ μΌλ‘ 무ν¨νν©λλ€.
- `cache-loader` (Webpack): μ’ μ’ λ€μ΄ν°λΈ Webpack 5 μΊμ±μΌλ‘ λ체λμ§λ§, μ΄ λ‘λλ λ€λ₯Έ λ‘λ(μ: `babel-loader`)μ κ²°κ³Όλ₯Ό λμ€ν¬μ μΊμνμ¬ μ¬λΉλ μ μ²λ¦¬ μκ°μ μ€μμ΅λλ€.
μ¦λΆ λΉλ:
κ°λ³ λͺ¨λμ λμ΄, μ¦λΆ λΉλλ μ ν리μΌμ΄μ μ "μν₯μ λ°λ" λΆλΆλ§ μ¬λΉλνλ λ° μ€μ μ λ‘λλ€. κ°λ°μκ° λ¨μΌ νμΌμ μ½κ° λ³κ²½νλ©΄, λΉλ μμ€ν μ μμ‘΄μ± κ·Έλνμ μλ΄μ λ°λΌ ν΄λΉ νμΌκ³Ό κ·Έ νμΌμ μ§κ°μ μ μΌλ‘ μμ‘΄νλ λ€λ₯Έ νμΌλ§ λ€μ μ²λ¦¬νλ©΄ λ©λλ€. κ·Έλνμ μν₯μ λ°μ§ μλ λͺ¨λ λΆλΆμ κ·Έλλ‘ λ μ μμ΅λλ€.
- μ΄κ²μ Webpackμ `watch` λͺ¨λλ Viteμ HMR(ν« λͺ¨λ κ΅μ²΄)κ³Ό κ°μ λꡬμμ λΉ λ₯Έ κ°λ° μλ²μ ν΅μ¬ λ©μ»€λμ¦μΌλ‘, μ 체 νμ΄μ§ μλ‘κ³ μΉ¨ μμ΄ νμν λͺ¨λλ§ μ¬μ»΄νμΌλμ΄ μ€ν μ€μΈ μ ν리μΌμ΄μ μ ν«μ€μλ©λλ€.
- λꡬλ€μ νμΌ μμ€ν λ³κ²½ μ¬νμ λͺ¨λν°λ§νκ³ (νμΌ μμ€ν κ°μμλ₯Ό ν΅ν΄) λ΄μ© ν΄μλ₯Ό μ¬μ©νμ¬ νμΌ λ΄μ©μ΄ μ€μ λ‘ λ³κ²½λμλμ§ νμΈνλ©°, νμν λλ§ μ¬λΉλλ₯Ό νΈλ¦¬κ±°ν©λλ€.
μ격 μΊμ±(λΆμ° μΊμ±):
κΈλ‘λ² νκ³Ό λκ·λͺ¨ μ‘°μ§μκ²λ λ‘컬 μΊμ±λ§μΌλ‘λ μΆ©λΆνμ§ μμ΅λλ€. λ€λ₯Έ μμΉμ μλ κ°λ°μλ μ¬λ¬ λ¨Έμ μ κ±ΈμΉ CI/CD μμ΄μ νΈλ€μ μ’ μ’ λμΌν μ½λλ₯Ό λΉλν΄μΌ ν©λλ€. μ격 μΊμ±μ μ¬μ©νλ©΄ λΉλ μν°ν©νΈ(μ»΄νμΌλ JavaScript νμΌ, λ²λ€λ CSS, μ¬μ§μ΄ ν μ€νΈ κ²°κ³Ό λ±)λ₯Ό λΆμ°λ ν μ 체μμ 곡μ ν μ μμ΅λλ€. λΉλ μμ μ΄ μ€νλ λ, μμ€ν μ λ¨Όμ μ€μ μΊμ μλ²λ₯Ό νμΈν©λλ€. μΌμΉνλ μν°ν©νΈ(μ λ ₯μ ν΄μλ‘ μλ³λ¨)κ° λ°κ²¬λλ©΄, λ‘컬μμ μ¬λΉλνλ λμ λ€μ΄λ‘λνμ¬ μ¬μ¬μ©ν©λλ€.
- λͺ¨λ Έλ ν¬ λꡬ(Nx, Turborepo, Bazel): μ΄ λꡬλ€μ μ격 μΊμ±μ νμν©λλ€. κ·Έλ€μ λͺ¨λ μμ (μ: "`my-app` λΉλ")μ λν΄ μμ€ μ½λ, μμ‘΄μ± λ° κ΅¬μ±μ κΈ°λ°μΌλ‘ κ³ μ ν ν΄μλ₯Ό κ³μ°ν©λλ€. μ΄ ν΄μκ° κ³΅μ μ격 μΊμ(μ’ μ’ Amazon S3, Google Cloud Storageμ κ°μ ν΄λΌμ°λ μ€ν λ¦¬μ§ λλ μ μ© μλΉμ€)μ μ‘΄μ¬νλ©΄, μΆλ ₯μ΄ μ¦μ 볡μλ©λλ€.
- κΈλ‘λ² νμ μν μ΄μ : λ°λμ κ°λ°μκ° κ³΅μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬λΉλν΄μΌ νλ λ³κ²½ μ¬νμ νΈμνλ€κ³ μμν΄ λ³΄μμμ€. μΌλ¨ λΉλλκ³ μΊμλλ©΄, μλλμ κ°λ°μλ μ΅μ μ½λλ₯Ό νκ³ μ¦μ μΊμλ λΌμ΄λΈλ¬λ¦¬μ μ΄μ μ λ릴 μ μμ΄ κΈ΄ μ¬λΉλλ₯Ό νΌν μ μμ΅λλ€. μ΄λ μ§λ¦¬μ μμΉλ κ°λ³ λ¨Έμ μ±λ₯μ κ΄κ³μμ΄ λΉλ μκ°μ κ·Ήμ μΌλ‘ νμ€νν©λλ€. λν λΉλκ° λ§€λ² μ²μλΆν° μμλ νμκ° μμΌλ―λ‘ CI/CD νμ΄νλΌμΈμ μλλ₯Ό ν¬κ² ν₯μμν΅λλ€.
μΊμ±, νΉν μ격 μΊμ±μ λͺ¨λ κ·λͺ¨ μλ μ‘°μ§, νΉν μ¬λ¬ μκ°λμ μ§μμ κ±Έμ³ μ΄μλλ μ‘°μ§μμ κ°λ°μ κ²½νκ³Ό CI ν¨μ¨μ±μ μν κ²μ 체μΈμ μ λλ€.
3. μΈλΆνλ μμ‘΄μ± κ΄λ¦¬: λ μ€λ§νΈν κ·Έλν ꡬμ±
λΉλ μμλ₯Ό μ΅μ ννλ κ²μ κΈ°μ‘΄ κ·Έλνλ₯Ό λ ν¨μ¨μ μΌλ‘ μ²λ¦¬νλ κ²λΏλ§ μλλΌ, κ·Έλν μ체λ₯Ό λ μκ³ μ€λ§νΈνκ² λ§λλ κ²μ κ΄ν κ²μ΄κΈ°λ ν©λλ€. μμ‘΄μ±μ μ μ€νκ² κ΄λ¦¬ν¨μΌλ‘μ¨ λΉλ μμ€ν μ΄ μνν΄μΌ ν μ 체 μμ λμ μ€μΌ μ μμ΅λλ€.
νΈλ¦¬ μ °μ΄νΉ λ° λ°λ μ½λ μ κ±°:
νΈλ¦¬ μ °μ΄νΉμ "λ°λ μ½λ"βκΈ°μ μ μΌλ‘λ λͺ¨λμ μ‘΄μ¬νμ§λ§ μ ν리μΌμ΄μ μμ μ€μ λ‘ μ¬μ©λκ±°λ κ°μ Έμ€μ§ μλ μ½λβλ₯Ό μ κ±°νλ μ΅μ ν κΈ°λ²μ λλ€. μ΄ κΈ°λ²μ λͺ¨λ κ°μ Έμ€κΈ° λ° λ΄λ³΄λ΄κΈ°λ₯Ό μΆμ νκΈ° μν΄ μμ‘΄μ± κ·Έλνμ μ μ λΆμμ μμ‘΄ν©λλ€. λͺ¨λ λλ λͺ¨λ λ΄μ ν¨μκ° λ΄λ³΄λ΄μ‘μ§λ§ κ·Έλνμ μ΄λμμλ κ°μ Έμ€μ§ μμΌλ©΄ λ°λ μ½λλ‘ κ°μ£Όλμ΄ μ΅μ’ λ²λ€μμ μμ νκ² μλ΅λ μ μμ΅λλ€.
- μν₯: λ²λ€ ν¬κΈ°λ₯Ό μ€μ¬ μ ν리μΌμ΄μ λ‘λ μκ°μ κ°μ ν λΏλ§ μλλΌ, λΉλ μμ€ν μ μμ‘΄μ± κ·Έλνλ₯Ό λ¨μννμ¬ λλ¨Έμ§ μ½λμ μ»΄νμΌ λ° μ²λ¦¬ μλλ₯Ό μ μ¬μ μΌλ‘ λμΌ μ μμ΅λλ€.
- λλΆλΆμ μ΅μ λ²λ€λ¬(Webpack, Rollup, Vite)λ ES λͺ¨λμ λν΄ κΈ°λ³Έμ μΌλ‘ νΈλ¦¬ μ °μ΄νΉμ μνν©λλ€.
μ½λ μ€ν리ν :
μ 체 μ ν리μΌμ΄μ μ νλμ ν° JavaScript νμΌλ‘ λ²λ€λ§νλ λμ , μ½λ μ€ν리ν μ μ¬μ©νλ©΄ μ½λλ₯Ό λ μκ³ κ΄λ¦¬νκΈ° μ¬μ΄ "μ²ν¬"λ‘ λλμ΄ νμν λ λ‘λν μ μμ΅λλ€. μ΄λ μΌλ°μ μΌλ‘ λμ `import()` λ¬Έ(μ: `import('./my-module.js')`)μ μ¬μ©νμ¬ λ¬μ±λλ©°, μ΄λ λΉλ μμ€ν μ `my-module.js`μ κ·Έ μμ‘΄μ±μ μν λ³λμ λ²λ€μ μμ±νλλ‘ μ§μν©λλ€.
- μ΅μ ν κ΄μ : μ£Όλ‘ μ΄κΈ° νμ΄μ§ λ‘λ μ±λ₯ ν₯μμ μ€μ μ λμ§λ§, μ½λ μ€ν리ν μ λν νλμ κ±°λν μμ‘΄μ± κ·Έλνλ₯Ό μ¬λ¬ κ°μ λ μκ³ κ²©λ¦¬λ κ·Έλνλ‘ λΆν΄νμ¬ λΉλ μμ€ν μ λμ΅λλ€. μμ κ·Έλνλ₯Ό λΉλνλ κ²μ΄ λ ν¨μ¨μ μΌ μ μμΌλ©°, ν μ²ν¬μ λ³κ²½μ μ 체 μ ν리μΌμ΄μ μ΄ μλ ν΄λΉ νΉμ μ²ν¬μ κ·Έ μ§μ μ μΈ μμ‘΄μ±μ λν΄μλ§ μ¬λΉλλ₯Ό νΈλ¦¬κ±°ν©λλ€.
- λν λΈλΌμ°μ κ° λ¦¬μμ€λ₯Ό λ³λ ¬λ‘ λ€μ΄λ‘λν μ μκ² ν΄μ€λλ€.
λͺ¨λ Έλ ν¬ μν€ν μ² λ° νλ‘μ νΈ κ·Έλν:
λ§μ κ΄λ ¨ μ ν리μΌμ΄μ κ³Ό λΌμ΄λΈλ¬λ¦¬λ₯Ό κ΄λ¦¬νλ μ‘°μ§μ κ²½μ°, λͺ¨λ Έλ ν¬(μ¬λ¬ νλ‘μ νΈλ₯Ό ν¬ν¨νλ λ¨μΌ μ μ₯μ)λ μλΉν μ΄μ μ μ 곡ν μ μμ΅λλ€. κ·Έλ¬λ μ΄λ λΉλ μμ€ν μ 볡μ‘μ±μ λνκΈ°λ ν©λλ€. λ°λ‘ μ¬κΈ°μ Nx, Turborepo, Bazelκ³Ό κ°μ λꡬλ€μ΄ "νλ‘μ νΈ κ·Έλν"λΌλ κ°λ μΌλ‘ λ±μ₯ν©λλ€.
- νλ‘μ νΈ κ·Έλνλ λͺ¨λ Έλ ν¬ λ΄μ λ€λ₯Έ νλ‘μ νΈ(μ: `my-frontend-app`, `shared-ui-library`, `api-client`)κ° μλ‘ μ΄λ»κ² μμ‘΄νλμ§λ₯Ό λ§€ννλ λ λμ μμ€μ μμ‘΄μ± κ·Έλνμ λλ€.
- 곡μ λΌμ΄λΈλ¬λ¦¬(μ: `shared-ui-library`)μμ λ³κ²½μ΄ λ°μνλ©΄, μ΄ λꡬλ€μ μ΄λ€ μ ν리μΌμ΄μ (`my-frontend-app` λ±)μ΄ κ·Έ λ³κ²½μ μν΄ "μν₯μ λ°λμ§" μ ννκ² νλ¨ν μ μμ΅λλ€.
- μ΄λ₯Ό ν΅ν΄ κ°λ ₯ν μ΅μ νκ° κ°λ₯ν΄μ§λλ€: μν₯μ λ°λ νλ‘μ νΈλ§ μ¬λΉλ, ν μ€νΈ λλ λ¦°νΈνλ©΄ λ©λλ€. μ΄λ κ° λΉλμ μμ λ²μλ₯Ό ν¬κ² μ€μ¬μ£Όλ©°, μλ°± κ°μ νλ‘μ νΈκ° μλ λκ·λͺ¨ λͺ¨λ Έλ ν¬μμ νΉν μ μ©ν©λλ€. μλ₯Ό λ€μ΄, λ¬Έμ μ¬μ΄νΈμ λ³κ²½μ μμ ν λ€λ₯Έ κ΅¬μ± μμ μΈνΈλ₯Ό μ¬μ©νλ μ€μν λΉμ¦λμ€ μ ν리μΌμ΄μ μ΄ μλ ν΄λΉ μ¬μ΄νΈμ λν λΉλλ§ νΈλ¦¬κ±°ν μ μμ΅λλ€.
- κΈλ‘λ² νμ κ²½μ°, μ΄λ λͺ¨λ Έλ ν¬μ μ μΈκ³ κ°λ°μλ€μ κΈ°μ¬κ° ν¬ν¨λμ΄ μλλΌλ λΉλ μμ€ν μ΄ λ³κ²½ μ¬νμ 격리νκ³ μ¬λΉλλ₯Ό μ΅μννμ¬ λͺ¨λ CI/CD μμ΄μ νΈμ λ‘컬 κ°λ° λ¨Έμ μμ λ λΉ λ₯Έ νΌλλ°± 루νμ λ ν¨μ¨μ μΈ λ¦¬μμ€ νμ©μΌλ‘ μ΄μ΄μ§λ€λ κ²μ μλ―Έν©λλ€.
4. λꡬ λ° κ΅¬μ± μ΅μ ν
κ³ κΈ μ λ΅μ μ¬μ©νλλΌλ λΉλ λꡬμ μ νκ³Ό ꡬμ±μ μ λ°μ μΈ λΉλ μ±λ₯μ μ€μν μν μ ν©λλ€.
- μ΅μ λ²λ€λ¬ νμ©:
- Vite/esbuild: μ΄ λꡬλ€μ κ°λ° μ€ λ€μ΄ν°λΈ ES λͺ¨λμ μ¬μ©νκ³ (κ°λ° μ€ λ²λ€λ§μ 건λλ) νλ‘λμ λΉλλ₯Ό μν΄ κ³ λλ‘ μ΅μ νλ μ»΄νμΌλ¬(esbuildλ Goλ‘ μμ±λ¨)λ₯Ό μ¬μ©νμ¬ μλλ₯Ό μ°μ μν©λλ€. μν€ν μ² μ νκ³Ό ν¨μ¨μ μΈ μΈμ΄ ꡬν λλΆμ λΉλ νλ‘μΈμ€κ° λ³Έμ§μ μΌλ‘ λ λΉ λ¦ λλ€.
- Webpack 5: μꡬ μΊμ±(λ Όμλ λ°μ κ°μ΄), λ§μ΄ν¬λ‘ νλ°νΈμλλ₯Ό μν λ λμ λͺ¨λ νλλ μ΄μ , κ°μ λ νΈλ¦¬ μ °μ΄νΉ κΈ°λ₯ λ± μλΉν μ±λ₯ κ°μ μ λμ νμ΅λλ€.
- Rollup: ν¨μ¨μ μΈ μΆλ ₯κ³Ό κ°λ ₯ν νΈλ¦¬ μ °μ΄νΉμΌλ‘ μΈν΄ JavaScript λΌμ΄λΈλ¬λ¦¬ λΉλμ μ’ μ’ μ νΈλλ©°, λ μμ λ²λ€μ μμ±ν©λλ€.
- λ‘λ/νλ¬κ·ΈμΈ κ΅¬μ± μ΅μ ν (Webpack):
- `include`/`exclude` κ·μΉ: λ‘λκ° μ λμ μΌλ‘ νμν νμΌλ§ μ²λ¦¬νλλ‘ λ³΄μ₯ν©λλ€. μλ₯Ό λ€μ΄, `babel-loader`κ° `node_modules`λ₯Ό μ²λ¦¬νμ§ μλλ‘ `include: /src/`λ₯Ό μ¬μ©ν©λλ€. μ΄λ λ‘λκ° νμ±νκ³ λ³νν΄μΌ νλ νμΌ μλ₯Ό κ·Ήμ μΌλ‘ μ€μ λλ€.
- `resolve.alias`: κ°μ Έμ€κΈ° κ²½λ‘λ₯Ό λ¨μννμ¬ λλλ‘ λͺ¨λ νμΈ μλλ₯Ό λμΌ μ μμ΅λλ€.
- `module.noParse`: μμ‘΄μ±μ΄ μλ λκ·λͺ¨ λΌμ΄λΈλ¬λ¦¬μ κ²½μ°, Webpackμ κ°μ Έμ€κΈ°λ₯Ό μν΄ νμ±νμ§ μλλ‘ μ§μνμ¬ μκ°μ λ μ μ½ν μ μμ΅λλ€.
- μ±λ₯ μ’μ λμ μ ν: TypeScript μ»΄νμΌμ μν΄ λ λλ¦° λ‘λ(μ: `ts-loader`λ₯Ό `esbuild-loader` λλ `swc-loader`λ‘ κ΅μ²΄)λ₯Ό κ³ λ €νμμμ€. μλΉν μλ ν₯μμ μ 곡ν μ μμ΅λλ€.
- λ©λͺ¨λ¦¬ λ° CPU ν λΉ:
- λ‘컬 κ°λ° λ¨Έμ κ³Ό νΉν CI/CD νκ²½μμ λΉλ νλ‘μΈμ€κ° μ μ ν CPU μ½μ΄μ λ©λͺ¨λ¦¬λ₯Ό ν보νλλ‘ νμμμ€. 리μμ€κ° λΆμ‘±νλ©΄ κ°μ₯ μ΅μ νλ λΉλ μμ€ν μ‘°μ°¨ λ³λͺ© νμμ μΌμΌν¬ μ μμ΅λλ€.
- 볡μ‘ν μμ‘΄μ± κ·Έλνλ κ΄λ²μν μμ° μ²λ¦¬κ° μλ λκ·λͺ¨ νλ‘μ νΈλ λ©λͺ¨λ¦¬λ₯Ό λ§μ΄ μ¬μ©ν μ μμ΅λλ€. λΉλ μ€ λ¦¬μμ€ μ¬μ©λμ λͺ¨λν°λ§νλ©΄ λ³λͺ© νμμ λ°κ²¬ν μ μμ΅λλ€.
μ΅μ κΈ°λ₯κ³Ό μ΅μ νλ₯Ό νμ©νκΈ° μν΄ λΉλ λꡬ ꡬμ±μ μ κΈ°μ μΌλ‘ κ²ν νκ³ μ λ°μ΄νΈνλ κ²μ μμ°μ±κ³Ό λΉμ© μ κ°μ 보μμ μ£Όλ μ§μμ μΈ νλ‘μΈμ€μ΄λ©°, νΉν κΈλ‘λ² κ°λ° μ΄μμ μ€μν©λλ€.
μ€μ©μ μΈ κ΅¬ν λ° λꡬ
μ΄λ¬ν μ΅μ ν μ λ΅μ΄ μΈκΈ° μλ νλ°νΈμλ λΉλ λꡬ λ΄μμ μ΄λ»κ² μ€μ©μ μΈ κ΅¬μ±κ³Ό κΈ°λ₯μΌλ‘ λ³νλλμ§ μ΄ν΄λ³΄κ² μ΅λλ€.
Webpack: μ΅μ ν μ¬μΈ΅ λΆμ
κ³ λλ‘ κ΅¬μ± κ°λ₯ν λͺ¨λ λ²λ€λ¬μΈ Webpackμ λΉλ μμ μ΅μ νλ₯Ό μν κ΄λ²μν μ΅μ μ μ 곡ν©λλ€:
- `optimization.splitChunks` λ° `optimization.runtimeChunk`: μ΄ μ€μ λ€μ μ κ΅ν μ½λ μ€ν리ν μ κ°λ₯νκ² ν©λλ€. `splitChunks`λ κ³΅ν΅ λͺ¨λ(λ²€λ λΌμ΄λΈλ¬λ¦¬ λ±)μ΄λ λμ μΌλ‘ κ°μ Έμ¨ λͺ¨λμ μλ³νμ¬ λ³λμ λ²λ€λ‘ λΆλ¦¬ν¨μΌλ‘μ¨ μ€λ³΅μ μ€μ΄κ³ λ³λ ¬ λ‘λ©μ κ°λ₯νκ² ν©λλ€. `runtimeChunk`λ Webpackμ λ°νμ μ½λλ₯Ό μν λ³λμ μ²ν¬λ₯Ό μμ±νμ¬ μ ν리μΌμ΄μ μ½λμ μ₯κΈ° μΊμ±μ μ 리ν©λλ€.
- μꡬ μΊμ± (`cache.type: 'filesystem'`): μμ μΈκΈνλ―μ΄, Webpack 5μ λ΄μ₯ νμΌ μμ€ν μΊμ±μ μ§λ ¬νλ λΉλ μν°ν©νΈλ₯Ό λμ€ν¬μ μ μ₯νμ¬ νμ λΉλ μλλ₯Ό κ·Ήμ μΌλ‘ ν₯μμν΅λλ€. `cache.buildDependencies` μ΅μ μ Webpack ꡬμ±μ΄λ μμ‘΄μ±μ λ³κ²½ μ¬νμ΄ μΊμλ₯Ό μ μ νκ² λ¬΄ν¨ννλλ‘ λ³΄μ₯ν©λλ€.
- λͺ¨λ νμΈ μ΅μ ν (`resolve.alias`, `resolve.extensions`): `alias`λ₯Ό μ¬μ©νλ©΄ 볡μ‘ν κ°μ Έμ€κΈ° κ²½λ‘λ₯Ό λ κ°λ¨ν κ²½λ‘λ‘ λ§€ννμ¬ λͺ¨λ νμΈμ μμλλ μκ°μ μ€μΌ μ μμ΅λλ€. `resolve.extensions`λ₯Ό κ΄λ ¨ νμΌ νμ₯μ(μ: `['.js', '.jsx', '.ts', '.tsx', '.json']`)λ§ ν¬ν¨νλλ‘ κ΅¬μ±νλ©΄ Webpackμ΄ μ‘΄μ¬νμ§ μλ `foo.vue`λ₯Ό νμΈνλ €λ μλλ₯Ό λ°©μ§ν©λλ€.
- `module.noParse`: νμ±ν λ΄λΆ μμ‘΄μ±μ΄ μλ jQueryμ κ°μ ν¬κ³ μ μ μΈ λΌμ΄λΈλ¬λ¦¬μ κ²½μ°, `noParse`λ₯Ό μ¬μ©νμ¬ Webpackμ΄ νμ±μ 건λλ°λλ‘ μ§μνμ¬ μλΉν μκ°μ μ μ½ν μ μμ΅λλ€.
- `thread-loader` λ° `cache-loader`: `cache-loader`λ μ’ μ’ Webpack 5μ λ€μ΄ν°λΈ μΊμ±μΌλ‘ λ체λμ§λ§, `thread-loader`λ CPU μ§μ½μ μΈ μμ (Babel λλ TypeScript μ»΄νμΌ λ±)μ μ컀 μ€λ λλ‘ μ€νλ‘λνμ¬ λ³λ ¬ μ²λ¦¬λ₯Ό κ°λ₯νκ² νλ κ°λ ₯ν μ΅μ μΌλ‘ λ¨μ μμ΅λλ€.
- λΉλ νλ‘νμΌλ§: `webpack-bundle-analyzer`μ κ°μ λꡬμ Webpackμ λ΄μ₯ `--profile` νλκ·Έλ λ²λ€ ꡬμ±μ μκ°ννκ³ λΉλ νλ‘μΈμ€ λ΄μ μ±λ₯ λ³λͺ© νμμ μλ³νμ¬ μΆκ°μ μΈ μ΅μ ν λ Έλ ₯μ μλ΄νλ λ° λμμ΄ λ©λλ€.
Vite: μ€κ³μ μν μλ
Viteλ κ°λ° μ€ λ€μ΄ν°λΈ ES λͺ¨λ(ESM)μ νμ©νκ³ μμ‘΄μ± μ¬μ λ²λ€λ§μ `esbuild`λ₯Ό μ¬μ©νμ¬ μλμ λ€λ₯Έ μ κ·Ό λ°©μμ μ·¨ν©λλ€:
- κ°λ°μ μν λ€μ΄ν°λΈ ESM: κ°λ° λͺ¨λμμ Viteλ λ€μ΄ν°λΈ ESMμ ν΅ν΄ μμ€ νμΌμ μ§μ μ 곡νλ―λ‘ λΈλΌμ°μ κ° λͺ¨λ νμΈμ μ²λ¦¬ν©λλ€. μ΄λ κ°λ° μ€ μ ν΅μ μΈ λ²λ€λ§ λ¨κ³λ₯Ό μμ ν 건λλ°κ² νμ¬ λλλλ‘ λΉ λ₯Έ μλ² μμκ³Ό μ¦κ°μ μΈ ν« λͺ¨λ κ΅μ²΄(HMR)λ₯Ό κ°λ₯νκ² ν©λλ€. μμ‘΄μ± κ·Έλνλ μ¬μ€μ λΈλΌμ°μ μ μν΄ κ΄λ¦¬λ©λλ€.
- μ¬μ λ²λ€λ§μ μν `esbuild`: npm μμ‘΄μ±μ κ²½μ°, Viteλ `esbuild`(Go κΈ°λ° λ²λ€λ¬)λ₯Ό μ¬μ©νμ¬ μ΄λ₯Ό λ¨μΌ ESM νμΌλ‘ μ¬μ λ²λ€λ§ν©λλ€. μ΄ λ¨κ³λ λ§€μ° λΉ λ₯΄λ©° λΈλΌμ°μ κ° μλ°± κ°μ μ€μ²©λ `node_modules` κ°μ Έμ€κΈ°λ₯Ό ν΄κ²°ν νμκ° μλλ‘ λ³΄μ₯νλλ°, μ΄λ λ릴 μ μμ΅λλ€. μ΄ μ¬μ λ²λ€λ§ λ¨κ³λ `esbuild`μ κ³ μ ν μλμ λ³λ ¬μ±μ μ΄μ μ μ»μ΅λλ€.
- νλ‘λμ λΉλλ₯Ό μν Rollup: νλ‘λμ μ μν΄ Viteλ μ΅μ νλκ³ νΈλ¦¬ μ °μ΄νΉλ λ²λ€μ μμ±νλ κ²μΌλ‘ μλ €μ§ ν¨μ¨μ μΈ λ²λ€λ¬μΈ Rollupμ μ¬μ©ν©λλ€. Viteμ μ§λ₯μ μΈ κΈ°λ³Έκ°κ³Ό Rollup ꡬμ±μ μ½λ μ€ν리ν λ° μμ° μ΅μ νλ₯Ό ν¬ν¨νμ¬ μμ‘΄μ± κ·Έλνκ° ν¨μ¨μ μΌλ‘ μ²λ¦¬λλλ‘ λ³΄μ₯ν©λλ€.
λͺ¨λ Έλ ν¬ λꡬ (Nx, Turborepo, Bazel): 볡μ‘μ± μ‘°μ¨
λκ·λͺ¨ λͺ¨λ Έλ ν¬λ₯Ό μ΄μνλ μ‘°μ§μκ² μ΄λ¬ν λꡬλ νλ‘μ νΈ κ·Έλνλ₯Ό κ΄λ¦¬νκ³ λΆμ° λΉλ μ΅μ νλ₯Ό ꡬννλ λ° νμμ μ λλ€:
- νλ‘μ νΈ κ·Έλν μμ±: μ΄ λͺ¨λ λꡬλ λͺ¨λ Έλ ν¬μ μμ 곡κ°μ λΆμνμ¬ μ ν리μΌμ΄μ κ³Ό λΌμ΄λΈλ¬λ¦¬ κ°μ μμ‘΄μ±μ λ§€ννλ μμΈν νλ‘μ νΈ κ·Έλνλ₯Ό ꡬμ±ν©λλ€. μ΄ κ·Έλνλ λͺ¨λ μ΅μ ν μ λ΅μ κΈ°λ°μ΄ λ©λλ€.
- μμ μ‘°μ¨ λ° λ³λ ¬ν: μν₯μ λ°λ νλ‘μ νΈμ λν μμ (λΉλ, ν μ€νΈ, λ¦°νΈ)μ λ‘컬 λ° CI/CD νκ²½μ μ¬λ¬ λ¨Έμ μμ μ§λ₯μ μΌλ‘ λ³λ ¬ μ€νν μ μμ΅λλ€. νλ‘μ νΈ κ·Έλνλ₯Ό κΈ°λ°μΌλ‘ μ¬λ°λ₯Έ μ€ν μμλ₯Ό μλμΌλ‘ κ²°μ ν©λλ€.
- λΆμ° μΊμ± (μ격 μΊμ): ν΅μ¬ κΈ°λ₯μ λλ€. μμ μ λ ₯μ ν΄μ±νκ³ κ³΅μ μ격 μΊμμμ μΆλ ₯μ μ μ₯/κ²μν¨μΌλ‘μ¨, μ΄ λꡬλ€μ ν κ°λ°μλ CI μμ΄μ νΈκ° μνν μμ μ΄ μ μΈκ³ λͺ¨λ μ¬λμκ² μ΄μ΅μ΄ λλλ‘ λ³΄μ₯ν©λλ€. μ΄λ μ€λ³΅ λΉλλ₯Ό ν¬κ² μ€μ΄κ³ νμ΄νλΌμΈ μλλ₯Ό λμ λλ€.
- μν₯μ λ°λ λͺ λ Ήμ΄: `nx affected:build` λλ `turbo run build --filter="[HEAD^...HEAD]"`μ κ°μ λͺ λ Ήμ΄λ₯Ό μ¬μ©νλ©΄ μ΅κ·Ό λ³κ²½ μ¬νμ μν΄ μ§κ°μ μ μΌλ‘ μν₯μ λ°μ νλ‘μ νΈμ λν΄μλ§ μμ μ μ€νν μ μμ΄ μ¦λΆ μ λ°μ΄νΈμ λΉλ μκ°μ λν λ¨μΆν μ μμ΅λλ€.
- ν΄μ κΈ°λ° μν°ν©νΈ κ΄λ¦¬: μΊμμ 무결μ±μ λͺ¨λ μ λ ₯(μμ€ μ½λ, μμ‘΄μ±, ꡬμ±)μ μ νν ν΄μ±μ μμ‘΄ν©λλ€. μ΄λ μΊμλ μν°ν©νΈκ° μ 체 μ λ ₯ κ³λ³΄κ° λμΌν κ²½μ°μλ§ μ¬μ©λλλ‘ λ³΄μ₯ν©λλ€.
CI/CD ν΅ν©: λΉλ μ΅μ νμ μΈκ³ν
λΉλ μμ μ΅μ νμ μμ‘΄μ± κ·Έλνμ μ§μ ν νμ CI/CD νμ΄νλΌμΈ, νΉν κΈλ‘λ² νμκ²μ λΉμ λ°ν©λλ€:
- CIμμ μ격 μΊμ νμ©: CI νμ΄νλΌμΈ(μ: GitHub Actions, GitLab CI/CD, Azure DevOps, Jenkins)μ λͺ¨λ Έλ ν¬ λꡬμ μ격 μΊμμ ν΅ν©νλλ‘ κ΅¬μ±νμμμ€. μ΄λ CI μμ΄μ νΈμ λΉλ μμ μ΄ μ²μλΆν° λΉλνλ λμ 미리 λΉλλ μν°ν©νΈλ₯Ό λ€μ΄λ‘λν μ μμμ μλ―Έν©λλ€. μ΄λ νμ΄νλΌμΈ μ€ν μκ°μ λͺ λΆ λλ μ¬μ§μ΄ λͺ μκ°κΉμ§ λ¨μΆν μ μμ΅λλ€.
- μμ κ° λΉλ λ¨κ³ λ³λ ¬ν: λΉλ μμ€ν μ΄ μ΄λ₯Ό μ§μνλ κ²½μ°(Nx λ° Turborepoκ° νλ‘μ νΈμ λν΄ λ³Έμ§μ μΌλ‘ μ§μνλ κ²μ²λΌ), CI/CD νλ«νΌμ ꡬμ±νμ¬ μ¬λ¬ μμ΄μ νΈμμ λ 립μ μΈ λΉλ λλ ν μ€νΈ μμ μ λ³λ ¬λ‘ μ€νν μ μμ΅λλ€. μλ₯Ό λ€μ΄, `app-europe`μ `app-asia` λΉλλ μ€μν μμ‘΄μ±μ 곡μ νμ§ μκ±°λ 곡μ μμ‘΄μ±μ΄ μ΄λ―Έ μ격μΌλ‘ μΊμλ κ²½μ° λμμ μ€νλ μ μμ΅λλ€.
- 컨ν μ΄λνλ λΉλ: Docker λλ κΈ°ν 컨ν μ΄λν κΈ°μ μ μ¬μ©νλ©΄ μ§λ¦¬μ μμΉμ κ΄κ³μμ΄ λͺ¨λ λ‘컬 λ¨Έμ κ³Ό CI/CD μμ΄μ νΈμμ μΌκ΄λ λΉλ νκ²½μ 보μ₯ν©λλ€. μ΄λ "λ΄ μ»΄ν¨ν°μμλ λλλ°" λ¬Έμ λ₯Ό μ κ±°νκ³ μ¬ν κ°λ₯ν λΉλλ₯Ό 보μ₯ν©λλ€.
μ΄λ¬ν λꡬμ μ λ΅μ κ°λ° λ° λ°°ν¬ μν¬νλ‘μ°μ μ μ€νκ² ν΅ν©ν¨μΌλ‘μ¨ μ‘°μ§μ ν¨μ¨μ±μ ν¬κ² ν₯μμν€κ³ , μ΄μ λΉμ©μ μ κ°νλ©°, μ μΈκ³μ λΆμ°λ νμ΄ λ λΉ λ₯΄κ³ μμ μ μΌλ‘ μννΈμ¨μ΄λ₯Ό μ 곡ν μ μλλ‘ μ§μν μ μμ΅λλ€.
κΈλ‘λ² νμ μν κ³Όμ λ° κ³ λ € μ¬ν
μμ‘΄μ± κ·Έλν μ΅μ νμ μ΄μ μ λΆλͺ νμ§λ§, μ μΈκ³μ λΆμ°λ νμμ μ΄λ¬ν μ λ΅μ ν¨κ³Όμ μΌλ‘ ꡬννλ κ²μ λ νΉν κ³Όμ λ₯Ό μ μν©λλ€:
- μ격 μΊμ±μ μν λ€νΈμν¬ μ§μ° μκ°: μ격 μΊμ±μ κ°λ ₯ν μ루μ μ΄μ§λ§, κ·Έ ν¨κ³Όλ κ°λ°μ/CI μμ΄μ νΈμ μΊμ μλ² κ°μ μ§λ¦¬μ 거리μ μν΄ μν₯μ λ°μ μ μμ΅λλ€. λΌν΄ μλ©λ¦¬μΉ΄μ κ°λ°μκ° λΆμ λ½μ μΊμ μλ²μμ μν°ν©νΈλ₯Ό κ°μ Έμ€λ κ²½μ°, κ°μ μ§μμ λλ£λ³΄λ€ λ λμ μ§μ° μκ°μ κ²½νν μ μμ΅λλ€. μ‘°μ§μ μΊμ μλ² μμΉλ₯Ό μ μ€νκ² κ³ λ €νκ±°λ κ°λ₯ν κ²½μ° μΊμ λ°°ν¬λ₯Ό μν΄ μ½ν μΈ μ μ‘ λ€νΈμν¬(CDN)λ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
- μΌκ΄λ λꡬ λ° νκ²½: μμΉμ κ΄κ³μμ΄ λͺ¨λ κ°λ°μκ° μ νν λμΌν Node.js λ²μ , ν¨ν€μ§ κ΄λ¦¬μ(npm, Yarn, pnpm) λ° λΉλ λꡬ λ²μ (Webpack, Vite, Nx λ±)μ μ¬μ©νλλ‘ λ³΄μ₯νλ κ²μ μ΄λ €μΈ μ μμ΅λλ€. λΆμΌμΉλ "λ΄ μ»΄ν¨ν°μμλ λλλ°, λ€ μ»΄ν¨ν°μμλ μ λΌ" μλ리μ€λ μΌκ΄μ± μλ λΉλ κ²°κ³Όλ‘ μ΄μ΄μ§ μ μμ΅λλ€. ν΄κ²°μ± μ λ€μκ³Ό κ°μ΅λλ€:
- λ²μ κ΄λ¦¬μ: Node.js λ²μ μ κ΄λ¦¬νκΈ° μν `nvm`(Node Version Manager) λλ `volta`μ κ°μ λꡬ.
- μ κΈ νμΌ: `package-lock.json` λλ `yarn.lock`μ μμ μ μΌλ‘ 컀λ°.
- 컨ν μ΄λνλ κ°λ° νκ²½: Docker, Gitpod λλ Codespacesλ₯Ό μ¬μ©νμ¬ λͺ¨λ κ°λ°μμκ² μμ ν μΌκ΄λκ³ μ¬μ ꡬμ±λ νκ²½μ μ 곡. μ΄λ μ€μ μκ°μ ν¬κ² μ€μ΄κ³ κ· μΌμ±μ 보μ₯ν©λλ€.
- μ¬λ¬ μκ°λμ κ±ΈμΉ λκ·λͺ¨ λͺ¨λ Έλ ν¬: μ¬λ¬ μκ°λμ κ±Έμ³ κΈ°μ¬μκ° μλ λκ·λͺ¨ λͺ¨λ Έλ ν¬μμ λ³κ²½ μ¬νμ μ‘°μ νκ³ λ³ν©μ κ΄λ¦¬νλ €λ©΄ κ²¬κ³ ν νλ‘μΈμ€κ° νμν©λλ€. λΉ λ₯Έ μ¦λΆ λΉλμ μ격 μΊμ±μ μ΄μ μ λͺ¨λ κ°λ°μμ λΉλ μκ°μ λν μ¦μ μ½λ λ³κ²½μ μν₯μ μννκΈ° λλ¬Έμ μ¬κΈ°μ λμ± λλλ¬μ§λλ€. λͺ νν μ½λ μμ κΆκ³Ό κ²ν νλ‘μΈμ€λ νμμ μ λλ€.
- κ΅μ‘ λ° λ¬Έμν: μ΅μ λΉλ μμ€ν κ³Ό λͺ¨λ Έλ ν¬ λꡬμ 볡μ‘μ±μ λΆλ΄μ€λ¬μΈ μ μμ΅λλ€. ν¬κ΄μ μ΄κ³ λͺ ννλ©° μ½κ² μ κ·Όν μ μλ λ¬Έμλ μ μΈκ³μ μΌλ‘ μλ‘μ΄ νμμ μ¨λ³΄λ©νκ³ κΈ°μ‘΄ κ°λ°μκ° λΉλ λ¬Έμ λ₯Ό ν΄κ²°νλ λ° λμμ΄ λκΈ° μν΄ λ§€μ° μ€μν©λλ€. μ κΈ°μ μΈ κ΅μ‘ μΈμ μ΄λ λ΄λΆ μν¬μ λν λͺ¨λ μ¬λμ΄ μ΅μ νλ μ½λλ² μ΄μ€μ κΈ°μ¬νκΈ° μν λͺ¨λ² μ¬λ‘λ₯Ό μ΄ν΄νλλ‘ λ³΄μ₯ν μ μμ΅λλ€.
- λΆμ° μΊμμ λν κ·μ μ€μ λ° λ³΄μ: μ격 μΊμλ₯Ό μ¬μ©ν λ, νΉν ν΄λΌμ°λμμ μ¬μ©ν κ²½μ°, λ°μ΄ν° μμ£Ό μꡬ μ¬νκ³Ό 보μ νλ‘ν μ½μ΄ μΆ©μ‘±λλμ§ νμΈν΄μΌ ν©λλ€. μ΄λ μ격ν λ°μ΄ν° λ³΄νΈ κ·μ (μ: μ λ½μ GDPR, λ―Έκ΅μ CCPA, μμμ λ° μν리카 μ μμ λ€μν κ΅κ° λ°μ΄ν° λ²λ₯ ) νμμ μ΄μλλ μ‘°μ§μ νΉν κ΄λ ¨μ΄ μμ΅λλ€.
μ΄λ¬ν κ³Όμ λ₯Ό μ μ μ μΌλ‘ ν΄κ²°νλ©΄ λΉλ μμ μ΅μ νμ λν ν¬μκ° μ 체 κΈλ‘λ² μμ§λμ΄λ§ μ‘°μ§μ μ§μ μΌλ‘ μ΄μ΅μ΄ λμ΄ λ μμ°μ μ΄κ³ μ‘°νλ‘μ΄ κ°λ° νκ²½μ μ‘°μ±ν μ μμ΅λλ€.
λΉλ μμ μ΅μ νμ λ―Έλ λν₯
νλ°νΈμλ λΉλ μμ€ν μ νκ²½μ λμμμ΄ μ§ννκ³ μμ΅λλ€. λΉλ μμ μ΅μ νμ νκ³λ₯Ό λμ± λν κ²μΌλ‘ κΈ°λλλ λͺ κ°μ§ λν₯μ λ€μκ³Ό κ°μ΅λλ€:
- λμ± λΉ λ₯Έ μ»΄νμΌλ¬: Rust(μ: SWC, Rome)λ Go(μ: esbuild)μ κ°μ κ³ μ±λ₯ μΈμ΄λ‘ μμ±λ μ»΄νμΌλ¬λ‘μ μ νμ κ³μλ κ²μ λλ€. μ΄λ¬ν λ€μ΄ν°λΈ μ½λ λꡬλ JavaScript κΈ°λ° μ»΄νμΌλ¬λ³΄λ€ μλΉν μλ μ΄μ μ μ 곡νμ¬ νΈλμ€νμΌλ§ λ° λ²λ€λ§μ μμλλ μκ°μ λμ± λ¨μΆμν΅λλ€. λ λ§μ λΉλ λκ΅¬κ° μ΄λ¬ν μΈμ΄λ₯Ό ν΅ν©νκ±°λ μ΄λ₯Ό μ¬μ©νμ¬ μ¬μμ±λ κ²μΌλ‘ μμλ©λλ€.
- λ μ κ΅ν λΆμ° λΉλ μμ€ν : λ¨μν μ격 μΊμ±μ λμ΄, λ―Έλμλ κ³μ°μ ν΄λΌμ°λ κΈ°λ° λΉλ νμΌλ‘ μ§μ μΌλ‘ μ€νλ‘λν μ μλ λ λ°μ λ λΆμ° λΉλ μμ€ν μ λ³΄κ² λ κ²μ λλ€. μ΄λ₯Ό ν΅ν΄ κ·Ήλμ λ³λ ¬νκ° κ°λ₯ν΄μ§κ³ λΉλ μ©λμ κ·Ήμ μΌλ‘ νμ₯νμ¬, λ°©λν ν΄λΌμ°λ 리μμ€λ₯Ό νμ©νμ¬ μ 체 νλ‘μ νΈλ λͺ¨λ Έλ ν¬λ₯Ό κ±°μ μ¦μ λΉλν μ μκ² λ κ²μ λλ€. μ격 μ€ν κΈ°λ₯μ κ°μΆ Bazelκ³Ό κ°μ λꡬλ μ΄λ¬ν λ―Έλλ₯Ό μΏλ³Ό μ μκ² ν©λλ€.
- μΈλΆνλ λ³κ²½ κ°μ§λ₯Ό ν΅ν λ μ€λ§νΈν μ¦λΆ λΉλ: νμ¬μ μ¦λΆ λΉλλ μ’ μ’ νμΌμ΄λ λͺ¨λ μμ€μμ μλν©λλ€. λ―Έλμ μμ€ν μ ν¨μ λ΄μ λ³κ²½ μ¬νμ΄λ μΆμ ꡬ문 νΈλ¦¬(AST) λ ΈλκΉμ§ λ κΉμ΄ λΆμνμ¬ μ λμ μΌλ‘ νμν μ΅μνλ§ μ¬μ»΄νμΌν μ μμ΅λλ€. μ΄λ μκ³ κ΅μμ μΈ μ½λ μμ μ λν μ¬λΉλ μκ°μ λμ± λ¨μΆμν¬ κ²μ λλ€.
- AI/ML μ§μ μ΅μ ν: λΉλ μμ€ν μ΄ λ°©λν μμ μ격 μΈ‘μ λ°μ΄ν°λ₯Ό μμ§ν¨μ λ°λΌ, AIμ λ¨Έμ λ¬λμ΄ κ³Όκ±°μ λΉλ ν¨ν΄μ λΆμν μ μ¬λ ₯μ΄ μμ΅λλ€. μ΄λ μ΅μ μ λΉλ μ λ΅μ μμΈ‘νκ±°λ, κ΅¬μ± μ‘°μ μ μ μνκ±°λ, μ¬μ§μ΄ λ³κ²½ μ¬νμ μ±κ²©κ³Ό μ¬μ© κ°λ₯ν μΈνλΌλ₯Ό κΈ°λ°μΌλ‘ κ°μ₯ λΉ λ₯Έ λΉλ μκ°μ λ¬μ±νκΈ° μν΄ λ¦¬μμ€ ν λΉμ λμ μΌλ‘ μ‘°μ νλ μ§λ₯ν μμ€ν μΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
- λΉλ λꡬλ₯Ό μν WebAssembly: WebAssembly(Wasm)κ° μ±μνκ³ λ λμ μ±νμ μ»κ² λ¨μ λ°λΌ, λ λ§μ λΉλ λꡬλ κ·Έ ν΅μ¬ κ΅¬μ± μμκ° WasmμΌλ‘ μ»΄νμΌλμ΄ μΉ κΈ°λ° κ°λ° νκ²½(λΈλΌμ°μ μ VS Code λ±) λ΄μμ λλ λΉ λ₯Έ νλ‘ν νμ΄νμ μν΄ λΈλΌμ°μ μμ μ§μ κ±°μ λ€μ΄ν°λΈμ κ°κΉμ΄ μ±λ₯μ μ 곡νλ κ²μ λ³΄κ² λ μ μμ΅λλ€.
μ΄λ¬ν λν₯μ λΉλ μκ°μ΄ κ±°μ 무μν μ μλ κ΄μ¬μ¬κ° λμ΄ μ μΈκ³ κ°λ°μλ€μ΄ λꡬλ₯Ό κΈ°λ€λ¦¬λ λμ κΈ°λ₯ κ°λ°κ³Ό νμ μ μ¨μ ν μ§μ€ν μ μλ λ―Έλλ₯Ό κ°λ¦¬ν΅λλ€.
κ²°λ‘
νλ μννΈμ¨μ΄ κ°λ°μ μΈκ³νλ μΈμμμ ν¨μ¨μ μΈ νλ°νΈμλ λΉλ μμ€ν μ λ μ΄μ μ¬μΉκ° μλ κΈ°λ³Έμ μΈ νμ μμμ λλ€. μ΄ ν¨μ¨μ±μ ν΅μ¬μλ μμ‘΄μ± κ·Έλνμ λν κΉμ μ΄ν΄μ μ§λ₯μ μΈ νμ©μ΄ μμ΅λλ€. μ΄ λ³΅μ‘ν μνΈ μ°κ²° μ§λλ λ¨μ§ μΆμμ μΈ κ°λ μ΄ μλλΌ, λΉκ΅ν μ μλ λΉλ μμ μ΅μ νλ₯Ό μν μ€ν κ°λ₯ν μ²μ¬μ§μ λλ€.
λ³λ ¬ν, κ°λ ₯ν μΊμ±(λΆμ° νμ μν μ€μν μ격 μΊμ± ν¬ν¨), κ·Έλ¦¬κ³ νΈλ¦¬ μ °μ΄νΉ, μ½λ μ€ν리ν , λͺ¨λ Έλ ν¬ νλ‘μ νΈ κ·Έλνμ κ°μ κΈ°μ μ ν΅ν μΈλΆνλ μμ‘΄μ± κ΄λ¦¬λ₯Ό μ λ΅μ μΌλ‘ μ¬μ©ν¨μΌλ‘μ¨ μ‘°μ§μ λΉλ μκ°μ κ·Ήμ μΌλ‘ λ¨μΆν μ μμ΅λλ€. Webpack, Vite, Nx, Turborepoμ κ°μ μ λμ μΈ λꡬλ€μ μ΄λ¬ν μ λ΅μ ν¨κ³Όμ μΌλ‘ ꡬννλ λ©μ»€λμ¦μ μ 곡νμ¬, νμλ€μ μμΉμ κ΄κ³μμ΄ κ°λ° μν¬νλ‘μ°κ° λΉ λ₯΄κ³ μΌκ΄λλ©° νμ₯ κ°λ₯νλλ‘ λ³΄μ₯ν©λλ€.
κΈλ‘λ² νμκ²λ λ€νΈμν¬ μ§μ° μκ°μ΄λ νκ²½ μΌκ΄μ±κ³Ό κ°μ κ³Όμ κ° μ‘΄μ¬νμ§λ§, μ μ μ μΈ κ³νκ³Ό νλμ μΈ κ΄ν λ° λꡬμ μ±νμΌλ‘ μ΄λ¬ν λ¬Έμ λ₯Ό μνν μ μμ΅λλ€. λ―Έλλ λ λΉ λ₯Έ μ»΄νμΌλ¬, λΆμ° μ€ν, κ·Έλ¦¬κ³ μ μΈκ³ κ°λ°μ μμ°μ±μ κ³μν΄μ ν₯μμν¬ AI κΈ°λ° μ΅μ νλ₯Ό κ°μΆ ν¨μ¬ λ μ κ΅ν λΉλ μμ€ν μ μ½μν©λλ€.
μμ‘΄μ± κ·Έλν λΆμμ κΈ°λ°ν λΉλ μμ μ΅μ νμ λν ν¬μλ κ°λ°μ κ²½ν, λ λΉ λ₯Έ μμ₯ μΆμ μκ°, κ·Έλ¦¬κ³ κΈλ‘λ² μμ§λμ΄λ§ λ Έλ ₯μ μ₯κΈ°μ μΈ μ±κ³΅μ λν ν¬μμ λλ€. μ΄λ μ¬λ¬ λλ₯μ κ±ΈμΉ νλ€μ΄ μννκ² νμ νκ³ , μ μνκ² λ°λ³΅νλ©°, μ λ‘ μλ μλμ μμ κ°μΌλ‘ λ°μ΄λ μΉ κ²½νμ μ 곡ν μ μλλ‘ νμ μ€μ΄μ€λλ€. μμ‘΄μ± κ·Έλνλ₯Ό λ°μλ€μ΄κ³ , μ¬λ¬λΆμ λΉλ νλ‘μΈμ€λ₯Ό λ³λͺ© νμμμ κ²½μ μ°μλ‘ μ ννμμμ€.