λ§μ΄ν¬λ‘ νλ‘ νΈμλ μν€ν μ²μ λͺ¨λ νλλ μ΄μ μ κ°λ , μ₯μ , λμ κ³Όμ , ꡬν μ λ΅ λ° νμ₯ κ°λ₯νκ³ μ μ§ λ³΄μ κ°λ₯ν μΉ μ ν리μΌμ΄μ μ μν΄ μΈμ μ νν΄μΌ νλμ§ μμ보μΈμ.
νλ‘ νΈμλ μν€ν μ²: λ§μ΄ν¬λ‘ νλ‘ νΈμλμ λͺ¨λ νλλ μ΄μ β μ’ ν© κ°μ΄λ
μ€λλ μ 볡μ‘ν μΉ κ°λ° νκ²½μμ λκ·λͺ¨ νλ‘ νΈμλ μ ν리μΌμ΄μ μ ꡬμΆνκ³ μ μ§ κ΄λ¦¬νλ κ²μ μ΄λ €μΈ μ μμ΅λλ€. μ ν΅μ μΈ λͺ¨λ리μ νλ‘ νΈμλ μν€ν μ²λ μ½λ λΉλν, λλ¦° λΉλ μκ° λ° ν νμ μ μ΄λ €μμ μ΄λνλ κ²½μ°κ° λ§μ΅λλ€. λ§μ΄ν¬λ‘ νλ‘ νΈμλμ λͺ¨λ νλλ μ΄μ μ λκ·λͺ¨ μ ν리μΌμ΄μ μ λ μκ³ λ 립μ μ΄λ©° κ΄λ¦¬νκΈ° μ¬μ΄ λΆλΆμΌλ‘ λΆν΄νμ¬ μ΄λ¬ν λ¬Έμ μ λν κ°λ ₯ν μ루μ μ μ 곡ν©λλ€. μ΄ μ’ ν© κ°μ΄λλ λ§μ΄ν¬λ‘ νλ‘ νΈμλ μν€ν μ²μ λͺ¨λ νλλ μ΄μ μ κ°λ , μ₯μ , λμ κ³Όμ , ꡬν μ λ΅ λ° μΈμ μ νν΄μΌ νλμ§μ λν΄ λ€λ£Ήλλ€.
λ§μ΄ν¬λ‘ νλ‘ νΈμλλ 무μμΈκ°μ?
λ§μ΄ν¬λ‘ νλ‘ νΈμλλ νλ‘ νΈμλ μ ν리μΌμ΄μ μ κ°κ° λ³λμ νμ΄ μμ νλ λ 립μ μΈ μ체 ν¬ν¨ λ¨μμ 컬λ μ μΌλ‘ ꡬμ±νλ μν€ν μ² μ€νμΌμ λλ€. μ΄λ¬ν λ¨μλ λ 립μ μΌλ‘ κ°λ°, ν μ€νΈ λ° λ°°ν¬ν μ μμΌλ―λ‘ λ ν° μ μ°μ±κ³Ό νμ₯μ±μ μ 곡ν©λλ€. μ΄λ₯Ό λ¨μΌ μ¬μ©μ κ²½νμΌλ‘ μννκ² ν΅ν©λ λ 립μ μΈ μΉμ¬μ΄νΈ λͺ¨μμ΄λΌκ³ μκ°ν΄λ³΄μΈμ.
λ§μ΄ν¬λ‘ νλ‘ νΈμλμ ν΅μ¬ μμ΄λμ΄λ λ§μ΄ν¬λ‘μλΉμ€ μμΉμ νλ‘ νΈμλμ μ μ©νλ κ²μ λλ€. λ§μ΄ν¬λ‘μλΉμ€κ° λ°±μλλ₯Ό λ μκ³ κ΄λ¦¬νκΈ° μ¬μ΄ μλΉμ€λ‘ λΆν΄νλ κ²μ²λΌ, λ§μ΄ν¬λ‘ νλ‘ νΈμλλ νλ‘ νΈμλλ₯Ό λ μκ³ κ΄λ¦¬νκΈ° μ¬μ΄ μ ν리μΌμ΄μ λλ κΈ°λ₯μΌλ‘ λΆν΄ν©λλ€.
λ§μ΄ν¬λ‘ νλ‘ νΈμλμ μ₯μ :
- νμ₯μ± μ¦κ°: λ§μ΄ν¬λ‘ νλ‘ νΈμλμ λ 립μ μΈ λ°°ν¬λ₯Ό ν΅ν΄ νμ λ€λ₯Έ νμ΄λ μ 체 μ ν리μΌμ΄μ μ μν₯μ μ£Όμ§ μκ³ μ ν리μΌμ΄μ μ νΉμ λΆλΆμ νμ₯ν μ μμ΅λλ€.
- μ μ§ λ³΄μμ± ν₯μ: λ μμ μ½λλ² μ΄μ€λ μ΄ν΄νκ³ ν μ€νΈνλ©° μ μ§ λ³΄μνκΈ° λ μ½μ΅λλ€. κ° νμ μ체 λ§μ΄ν¬λ‘ νλ‘ νΈμλμ λν μ± μμ΄ μμΌλ―λ‘ λ¬Έμ λ₯Ό μλ³νκ³ ν΄κ²°νκΈ°κ° λ μ¬μμ§λλ€.
- κΈ°μ λ€μμ±: νμ νΉμ λ§μ΄ν¬λ‘ νλ‘ νΈμλμ κ°μ₯ μ ν©ν κΈ°μ μ€νμ μ νν μ μμΌλ―λ‘ λ ν° μ μ°μ±κ³Ό νμ μ΄ κ°λ₯ν©λλ€. μ΄λ λ€λ₯Έ νμ΄ λ€λ₯Έ νλ μμν¬μ μ λ¬Έ μ§μμ κ°μ§κ³ μμ μ μλ λκ·λͺ¨ μ‘°μ§μμ λ§€μ° μ€μν μ μμ΅λλ€.
- λ 립μ μΈ λ°°ν¬: λ§μ΄ν¬λ‘ νλ‘ νΈμλλ λ 립μ μΌλ‘ λ°°ν¬ν μ μμΌλ―λ‘ λ¦΄λ¦¬μ€ μ£ΌκΈ°κ° λ¨μΆλκ³ μνμ΄ μ€μ΄λλλ€. μ΄λ λΉλ²ν μ λ°μ΄νΈκ° νμν λκ·λͺ¨ μ ν리μΌμ΄μ μ νΉν μ€μν©λλ€.
- ν μμ¨μ±: νμ μ체 λ§μ΄ν¬λ‘ νλ‘ νΈμλμ λν μμ ν μμ κΆμ κ°μ§λ―λ‘ μ± μκ°κ³Ό μ± λ¬΄μ±μ΄ κ°νλ©λλ€. μ΄λ₯Ό ν΅ν΄ νμ μμ¬ κ²°μ μ λ΄λ¦¬κ³ λΉ λ₯΄κ² λ°λ³΅ μμ μ μνν μ μμ΅λλ€.
- μ½λ μ¬μ¬μ©μ±: κ³΅ν΅ κ΅¬μ± μμμ λΌμ΄λΈλ¬λ¦¬λ₯Ό λ§μ΄ν¬λ‘ νλ‘ νΈμλ κ°μ 곡μ νμ¬ μ½λ μ¬μ¬μ© λ° μΌκ΄μ±μ μ΄μ§ν μ μμ΅λλ€.
λ§μ΄ν¬λ‘ νλ‘ νΈμλμ λμ κ³Όμ :
- 볡μ‘μ± μ¦κ°: λ§μ΄ν¬λ‘ νλ‘ νΈμλ μν€ν μ²λ₯Ό ꡬννλ©΄ μ 체 μμ€ν μ 볡μ‘μ±μ΄ μ¦κ°ν©λλ€. μ¬λ¬ νμ μ‘°μ νκ³ λ§μ΄ν¬λ‘ νλ‘ νΈμλ κ° ν΅μ μ κ΄λ¦¬νλ κ²μ΄ μ΄λ €μΈ μ μμ΅λλ€.
- ν΅ν© κ³Όμ : λ§μ΄ν¬λ‘ νλ‘ νΈμλ κ°μ μνν ν΅ν©μ 보μ₯νλ €λ©΄ μ μ€ν κ³νκ³Ό μ‘°μ μ΄ νμν©λλ€. 곡μ μ’ μμ±, λΌμ°ν λ° μ€νμΌλ§κ³Ό κ°μ λ¬Έμ λ₯Ό ν΄κ²°ν΄μΌ ν©λλ€.
- μ±λ₯ μ€λ²ν€λ: μ¬λ¬ λ§μ΄ν¬λ‘ νλ‘ νΈμλλ₯Ό λ‘λνλ©΄ νΉν μ΅μ νλμ§ μμ κ²½μ° μ±λ₯ μ€λ²ν€λκ° λ°μν μ μμ΅λλ€. λ‘λ© μκ° λ° λ¦¬μμ€ νμ©μ μΈμ¬ν μ£Όμλ₯Ό κΈ°μΈμ¬μΌ ν©λλ€.
- 곡μ μν κ΄λ¦¬: λ§μ΄ν¬λ‘ νλ‘ νΈμλ κ°μ 곡μ μνλ₯Ό κ΄λ¦¬νλ κ²μ 볡μ‘ν μ μμ΅λλ€. 곡μ λΌμ΄λΈλ¬λ¦¬, μ΄λ²€νΈ λ²μ€ λλ μ€μ μ§μ€μ μν κ΄λ¦¬ μ루μ κ³Ό κ°μ μ λ΅μ΄ μμ£Ό νμν©λλ€.
- μ΄μ μ€λ²ν€λ: μ¬λ¬ λ§μ΄ν¬λ‘ νλ‘ νΈμλμ λν μΈνλΌλ₯Ό κ΄λ¦¬νλ κ²μ λ¨μΌ λͺ¨λ리μ μ ν리μΌμ΄μ μ κ΄λ¦¬νλ κ²λ³΄λ€ λ 볡μ‘ν μ μμ΅λλ€.
- κ΅μ°¨ κ΄μ¬μ¬: μΈμ¦, κΆν λΆμ¬ λ° λΆμκ³Ό κ°μ κ΅μ°¨ κ΄μ¬μ¬λ₯Ό μ²λ¦¬νλ €λ©΄ ν κ°μ μ μ€ν κ³νκ³Ό μ‘°μ μ΄ νμν©λλ€.
λͺ¨λ νλλ μ΄μ μ΄λ 무μμΈκ°μ?
λͺ¨λ νλλ μ΄μ μ Webpack 5μμ λμ λ JavaScript μν€ν μ²λ‘, κ°λ³μ μΌλ‘ λΉλ λ° λ°°ν¬λ μ ν리μΌμ΄μ κ°μ μ½λλ₯Ό 곡μ ν μ μλλ‘ ν©λλ€. λ°νμμ λ€λ₯Έ μ ν리μΌμ΄μ μ μ½λλ₯Ό λμ μΌλ‘ λ‘λνκ³ μ€ννμ¬ λ§μ΄ν¬λ‘ νλ‘ νΈμλλ₯Ό μμ±ν μ μκ² ν©λλ€. λ³Έμ§μ μΌλ‘ μλ‘ λ€λ₯Έ JavaScript μ ν리μΌμ΄μ μ΄ μλ‘μ λΉλ© λΈλ‘ μν μ ν μ μλλ‘ ν©λλ€.
iframeμ΄λ μΉ μ»΄ν¬λνΈμ μμ‘΄νλ κ²½μ°κ° λ§μ μ ν΅μ μΈ λ§μ΄ν¬λ‘ νλ‘ νΈμλ μ κ·Ό λ°©μκ³Ό λ¬λ¦¬, λͺ¨λ νλλ μ΄μ μ λ§μ΄ν¬λ‘ νλ‘ νΈμλ κ°μ μνν ν΅ν©κ³Ό 곡μ μνλ₯Ό νμ©ν©λλ€. 곡μ ν¨ν€μ§ λ μ§μ€νΈλ¦¬μ κ²μν νμ μμ΄ ν μ ν리μΌμ΄μ μμ λ€λ₯Έ μ ν리μΌμ΄μ μΌλ‘ κ΅¬μ± μμ, ν¨μ λλ μ 체 λͺ¨λμ λ ΈμΆν μ μμ΅λλ€.
λͺ¨λ νλλ μ΄μ μ μ£Όμ κ°λ :
- νΈμ€νΈ(Host): λ€λ₯Έ μ ν리μΌμ΄μ (μ격)μμ λͺ¨λμ μλΉνλ μ ν리μΌμ΄μ .
- μ격(Remote): λ€λ₯Έ μ ν리μΌμ΄μ (νΈμ€νΈ)μμ μλΉν λͺ¨λμ λ ΈμΆνλ μ ν리μΌμ΄μ .
- 곡μ μ’ μμ±(Shared Dependencies): νΈμ€νΈ λ° μ격 μ ν리μΌμ΄μ κ°μ 곡μ λλ μ’ μμ±μ λλ€. λͺ¨λ νλλ μ΄μ μ μ¬μ©νλ©΄ 곡μ μ’ μμ±μ 볡μ νλ κ²μ λ°©μ§νμ¬ μ±λ₯μ κ°μ νκ³ λ²λ€ ν¬κΈ°λ₯Ό μ€μΌ μ μμ΅λλ€.
- Webpack ꡬμ±(Webpack Configuration): λͺ¨λ νλλ μ΄μ μ Webpack κ΅¬μ± νμΌμ ν΅ν΄ ꡬμ±λλ©°, μ¬κΈ°μμ λ ΈμΆν λͺ¨λκ³Ό μλΉν μ격μ μ μν©λλ€.
λͺ¨λ νλλ μ΄μ μ μ₯μ :
- μ½λ 곡μ : λͺ¨λ νλλ μ΄μ μ μ¬μ©νλ©΄ κ°λ³μ μΌλ‘ λΉλ λ° λ°°ν¬λ μ ν리μΌμ΄μ κ°μ μ½λλ₯Ό 곡μ νμ¬ μ½λ μ€λ³΅μ μ€μ΄κ³ μ½λ μ¬μ¬μ©μ κ°μ ν μ μμ΅λλ€.
- λ 립μ μΈ λ°°ν¬: λ§μ΄ν¬λ‘ νλ‘ νΈμλλ λ 립μ μΌλ‘ λ°°ν¬ν μ μμΌλ―λ‘ λ¦΄λ¦¬μ€ μ£ΌκΈ°κ° λ¨μΆλκ³ μνμ΄ μ€μ΄λλλ€. ν λ§μ΄ν¬λ‘ νλ‘ νΈμλμ λ³κ²½ μ¬νμ λ€λ₯Έ λ§μ΄ν¬λ‘ νλ‘ νΈμλλ₯Ό μ¬λ°°ν¬ν νμκ° μμ΅λλ€.
- κΈ°μ λΆκ°μ§λ‘ (μ΄λ μ λ): μ£Όλ‘ Webpack κΈ°λ° μ ν리μΌμ΄μ κ³Ό ν¨κ» μ¬μ©λμ§λ§, λͺ¨λ νλλ μ΄μ μ λ€λ₯Έ λΉλ λꡬ λ° νλ μμν¬μλ μ΄λ μ λ ν΅ν©λ μ μμ΅λλ€.
- μ±λ₯ ν₯μ: μ’ μμ±μ 곡μ νκ³ λͺ¨λμ λμ μΌλ‘ λ‘λν¨μΌλ‘μ¨ λͺ¨λ νλλ μ΄μ μ μ ν리μΌμ΄μ μ±λ₯μ ν₯μμν€κ³ λ²λ€ ν¬κΈ°λ₯Ό μ€μΌ μ μμ΅λλ€.
- κ°μνλ κ°λ°: λͺ¨λ νλλ μ΄μ μ νμ΄ ν΅ν© λ¬Έμ μ λν΄ κ±±μ ν νμ μμ΄ λ 립μ μΈ λ§μ΄ν¬λ‘ νλ‘ νΈμλμμ μμ ν μ μλλ‘ νμ¬ κ°λ° νλ‘μΈμ€λ₯Ό κ°μνν©λλ€.
λͺ¨λ νλλ μ΄μ μ λμ κ³Όμ :
- Webpack μ’ μμ±: λͺ¨λ νλλ μ΄μ μ μ£Όλ‘ Webpack κΈ°λ₯μ΄λ―λ‘ λΉλ λκ΅¬λ‘ Webpackμ μ¬μ©ν΄μΌ ν©λλ€.
- κ΅¬μ± λ³΅μ‘μ±: λͺ¨λ νλλ μ΄μ μ ꡬμ±νλ κ²μ νΉν λ§μ λ§μ΄ν¬λ‘ νλ‘ νΈμλκ° μλ λκ·λͺ¨ μ ν리μΌμ΄μ μ κ²½μ° λ³΅μ‘ν μ μμ΅λλ€.
- λ²μ κ΄λ¦¬: 곡μ μ’ μμ± λ° λ ΈμΆλ λͺ¨λμ λ²μ μ κ΄λ¦¬νλ κ²μ μ΄λ €μΈ μ μμ΅λλ€. μΆ©λμ νΌνκ³ νΈνμ±μ 보μ₯νλ €λ©΄ μ μ€ν κ³νκ³Ό μ‘°μ μ΄ νμν©λλ€.
- λ°νμ μ€λ₯: μ격 λͺ¨λμ λ¬Έμ λ‘ μΈν΄ νΈμ€νΈ μ ν리μΌμ΄μ μμ λ°νμ μ€λ₯κ° λ°μν μ μμ΅λλ€. μ μ ν μ€λ₯ μ²λ¦¬ λ° λͺ¨λν°λ§μ΄ νμμ μ λλ€.
- 보μ κ³ λ € μ¬ν: λ€λ₯Έ μ ν리μΌμ΄μ μ λͺ¨λμ λ ΈμΆνλ©΄ 보μ κ³ λ € μ¬νμ΄ λ°μν©λλ€. μ΄λ€ λͺ¨λμ λ ΈμΆνκ³ λ¬΄λ¨ μ‘μΈμ€λ‘λΆν° 보νΈνλ λ°©λ²μ μ μ€νκ² κ³ λ €ν΄μΌ ν©λλ€.
λ§μ΄ν¬λ‘ νλ‘ νΈμλ μν€ν μ²: λ€μν μ κ·Ό λ°©μ
λ§μ΄ν¬λ‘ νλ‘ νΈμλ μν€ν μ²λ₯Ό ꡬννλ λ°μλ μ¬λ¬ κ°μ§ μ κ·Ό λ°©μμ΄ μμΌλ©°, κ°κΈ° μ₯λ¨μ μ΄ μμ΅λλ€. κ°μ₯ μΌλ°μ μΈ μ κ·Ό λ°©μμ λ€μκ³Ό κ°μ΅λλ€.
- λΉλ νμ ν΅ν©: λ§μ΄ν¬λ‘ νλ‘ νΈμλκ° λΉλ νμμ λ¨μΌ μ ν리μΌμ΄μ μΌλ‘ λΉλ λ° ν΅ν©λ©λλ€. μ΄ μ κ·Ό λ°©μμ ꡬνμ΄ κ°λ¨νμ§λ§ λ€λ₯Έ μ κ·Ό λ°©μμ μ μ°μ±μ΄ λΆμ‘±ν©λλ€.
- Iframesλ₯Ό ν΅ν λ°νμ ν΅ν©: λ§μ΄ν¬λ‘ νλ‘ νΈμλκ° λ°νμμ iframeμΌλ‘ λ‘λλ©λλ€. μ΄ μ κ·Ό λ°©μμ κ°λ ₯ν 격리λ₯Ό μ 곡νμ§λ§ μ±λ₯ λ¬Έμ λ° λ§μ΄ν¬λ‘ νλ‘ νΈμλ κ° ν΅μ μ΄λ €μμΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
- μΉ μ»΄ν¬λνΈλ₯Ό ν΅ν λ°νμ ν΅ν©: λ§μ΄ν¬λ‘ νλ‘ νΈμλκ° μΉ μ»΄ν¬λνΈλ‘ ν¨ν€μ§λμ΄ λ°νμμ λ©μΈ μ ν리μΌμ΄μ μΌλ‘ λ‘λλ©λλ€. μ΄ μ κ·Ό λ°©μμ μ°μν 격리 λ° μ¬μ¬μ©μ±μ μ 곡νμ§λ§ ꡬνμ΄ λ 볡μ‘ν μ μμ΅λλ€.
- JavaScriptλ₯Ό ν΅ν λ°νμ ν΅ν©: λ§μ΄ν¬λ‘ νλ‘ νΈμλκ° λ°νμμ JavaScript λͺ¨λλ‘ λ‘λλ©λλ€. μ΄ μ κ·Ό λ°©μμ κ°μ₯ ν° μ μ°μ±κ³Ό μ±λ₯μ μ 곡νμ§λ§ μ μ€ν κ³νκ³Ό μ‘°μ μ΄ νμν©λλ€. λͺ¨λ νλλ μ΄μ μ μ΄ λ²μ£Όμ μν©λλ€.
- Edge Side Includes (ESI): CDNμ μ£μ§μμ HTML μ‘°κ°μ 쑰립νλ μλ² μΈ‘ μ κ·Ό λ°©μμ λλ€.
λͺ¨λ νλλ μ΄μ μ μ¬μ©ν λ§μ΄ν¬λ‘ νλ‘ νΈμλ ꡬν μ λ΅
λͺ¨λ νλλ μ΄μ μ μ¬μ©νμ¬ λ§μ΄ν¬λ‘ νλ‘ νΈμλλ₯Ό ꡬννλ €λ©΄ μ μ€ν κ³νκ³Ό μ€νμ΄ νμν©λλ€. κ³ λ €ν΄μΌ ν λͺ κ°μ§ μ£Όμ μ λ΅μ λ€μκ³Ό κ°μ΅λλ€.
- λͺ νν κ²½κ³ μ μ: λ§μ΄ν¬λ‘ νλ‘ νΈμλ κ°μ κ²½κ³λ₯Ό λͺ ννκ² μ μνμμμ€. κ° λ§μ΄ν¬λ‘ νλ‘ νΈμλλ νΉμ λλ©μΈ λλ κΈ°λ₯μ λν μ± μμ΄ μμ΄μΌ ν©λλ€.
- 곡μ μ»΄ν¬λνΈ λΌμ΄λΈλ¬λ¦¬ ꡬμΆ: λͺ¨λ λ§μ΄ν¬λ‘ νλ‘ νΈμλμμ μ¬μ©ν μ μλ 곡μ μ»΄ν¬λνΈ λΌμ΄λΈλ¬λ¦¬λ₯Ό λ§λμμμ€. μ΄λ μΌκ΄μ±μ μ΄μ§νκ³ μ½λ μ€λ³΅μ μ€μ λλ€. μ»΄ν¬λνΈ λΌμ΄λΈλ¬λ¦¬ μ체λ νλλ μ΄μ λ λͺ¨λμ΄ λ μ μμ΅λλ€.
- μ€μ μ§μ€μ λΌμ°ν μμ€ν ꡬν: λ§μ΄ν¬λ‘ νλ‘ νΈμλ κ° νμμ μ²λ¦¬νλ μ€μ μ§μ€μ λΌμ°ν μμ€ν μ ꡬννμμμ€. μ΄λ μνν μ¬μ©μ κ²½νμ 보μ₯ν©λλ€.
- μν κ΄λ¦¬ μ λ΅ μ ν: μ ν리μΌμ΄μ μ μ ν©ν μν κ΄λ¦¬ μ λ΅μ μ ννμμμ€. μ΅μ μλ 곡μ λΌμ΄λΈλ¬λ¦¬, μ΄λ²€νΈ λ²μ€ λλ Reduxλ Vuexμ κ°μ μ€μ μ§μ€μ μν κ΄λ¦¬ μ루μ μ΄ ν¬ν¨λ©λλ€.
- κ°λ ₯ν λΉλ λ° λ°°ν¬ νμ΄νλΌμΈ ꡬν: λ§μ΄ν¬λ‘ νλ‘ νΈμλμ λΉλ, ν μ€νΈ λ° λ°°ν¬ νλ‘μΈμ€λ₯Ό μλννλ κ°λ ₯ν λΉλ λ° λ°°ν¬ νμ΄νλΌμΈμ ꡬννμμμ€.
- λͺ νν ν΅μ μ±λ ꡬμΆ: μλ‘ λ€λ₯Έ λ§μ΄ν¬λ‘ νλ‘ νΈμλμμ μμ νλ ν κ°μ λͺ νν ν΅μ μ±λμ ꡬμΆνμμμ€. μ΄λ λͺ¨λ μ¬λμ΄ λμΌν νμ΄μ§μ μκ³ λ¬Έμ κ° μ μνκ² ν΄κ²°λλλ‘ λ³΄μ₯ν©λλ€.
- μ±λ₯ λͺ¨λν°λ§ λ° μΈ‘μ : λ§μ΄ν¬λ‘ νλ‘ νΈμλ μν€ν μ²μ μ±λ₯μ λͺ¨λν°λ§νκ³ μΈ‘μ νμμμ€. μ΄λ₯Ό ν΅ν΄ μ±λ₯ λ³λͺ© νμμ μλ³νκ³ ν΄κ²°ν μ μμ΅λλ€.
μμ: λͺ¨λ νλλ μ΄μ μ μ¬μ©ν κ°λ¨ν λ§μ΄ν¬λ‘ νλ‘ νΈμλ ꡬν (React)
React λ° Webpack λͺ¨λ νλλ μ΄μ μ μ¬μ©ν κ°λ¨ν μμλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€. νΈμ€νΈ μ ν리μΌμ΄μ κ³Ό μ격 μ ν리μΌμ΄μ λ κ°μ§κ° μμ΅λλ€.
μ격 μ ν리μΌμ΄μ (RemoteApp) - μ»΄ν¬λνΈ λ ΈμΆ
1. μ’ μμ± μ€μΉ:
npm install react react-dom webpack webpack-cli webpack-dev-server html-webpack-plugin --save-dev
2. κ°λ¨ν μ»΄ν¬λνΈ μμ± (RemoteComponent.jsx
):
import React from 'react';
const RemoteComponent = () => {
return <div style={{ border: '2px solid blue', padding: '10px', margin: '10px' }}>
<h2>Remote Component</h2>
<p>This component is being served from the Remote App!</p>
</div>;
};
export default RemoteComponent;
3. index.js
μμ±:
import React from 'react';
import ReactDOM from 'react-dom';
import RemoteComponent from './RemoteComponent';
ReactDOM.render(<RemoteComponent />, document.getElementById('root'));
4. webpack.config.js
μμ±:
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');
const path = require('path');
module.exports = {
entry: './index',
mode: 'development',
devServer: {
port: 3001,
},
output: {
publicPath: 'auto',
},
resolve: {
extensions: ['.js', '.jsx'],
},
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-react', '@babel/preset-env'],
},
},
},
],
},
plugins: [
new ModuleFederationPlugin({
name: 'RemoteApp',
filename: 'remoteEntry.js',
exposes: {
'./RemoteComponent': './RemoteComponent',
},
shared: {
...require('./package.json').dependencies,
react: { singleton: true, eager: true, requiredVersion: require('./package.json').dependencies['react'] },
'react-dom': { singleton: true, eager: true, requiredVersion: require('./package.json').dependencies['react-dom'] },
},
}),
new HtmlWebpackPlugin({
template: './index.html',
}),
],
};
5. index.html
μμ±:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Remote App</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
6. Babel κ΅¬μ± μΆκ° (.babelrc λλ babel.config.js):
{
"presets": ["@babel/preset-env", "@babel/preset-react"]
}
7. μ격 μ± μ€ν:
npx webpack serve
νΈμ€νΈ μ ν리μΌμ΄μ (HostApp) - μ격 μ»΄ν¬λνΈ μλΉ
1. μ’ μμ± μ€μΉ:
npm install react react-dom webpack webpack-cli webpack-dev-server html-webpack-plugin --save-dev
2. κ°λ¨ν μ»΄ν¬λνΈ μμ± (Home.jsx
):
import React, { Suspense } from 'react';
const RemoteComponent = React.lazy(() => import('RemoteApp/RemoteComponent'));
const Home = () => {
return (
<div style={{ border: '2px solid green', padding: '10px', margin: '10px' }}>
<h1>Host Application</h1>
<p>This is the main application consuming a remote component.</p>
<Suspense fallback={<div>Loading Remote Component...</div>}>
<RemoteComponent />
</Suspense>
</div>
);
};
export default Home;
3. index.js
μμ±:
import React from 'react';
import ReactDOM from 'react-dom';
import Home from './Home';
ReactDOM.render(<Home />, document.getElementById('root'));
4. webpack.config.js
μμ±:
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');
const path = require('path');
module.exports = {
entry: './index',
mode: 'development',
devServer: {
port: 3000,
},
output: {
publicPath: 'auto',
},
resolve: {
extensions: ['.js', '.jsx'],
},
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-react', '@babel/preset-env'],
},
},
},
],
},
plugins: [
new ModuleFederationPlugin({
name: 'HostApp',
remotes: {
RemoteApp: 'RemoteApp@http://localhost:3001/remoteEntry.js',
},
shared: {
...require('./package.json').dependencies,
react: { singleton: true, eager: true, requiredVersion: require('./package.json').dependencies['react'] },
'react-dom': { singleton: true, eager: true, requiredVersion: require('./package.json').dependencies['react-dom'] },
},
}),
new HtmlWebpackPlugin({
template: './index.html',
}),
],
};
5. index.html
μμ±:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Host App</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
6. Babel κ΅¬μ± μΆκ° (.babelrc λλ babel.config.js):
{
"presets": ["@babel/preset-env", "@babel/preset-react"]
}
7. νΈμ€νΈ μ± μ€ν:
npx webpack serve
μ΄ μμλ νΈμ€νΈ μ±μ΄ λ°νμμ μ격 μ±μ RemoteComponentλ₯Ό μ΄λ»κ² μλΉν μ μλμ§ λ³΄μ¬μ€λλ€. μ£Όμ μΈ‘λ©΄μΌλ‘λ νΈμ€νΈμ webpack ꡬμ±μμ μ격 μ§μ μ μ μ μνλ κ²κ³Ό React.lazy λ° Suspenseλ₯Ό μ¬μ©νμ¬ μ격 μ»΄ν¬λνΈλ₯Ό λΉλκΈ°μ μΌλ‘ λ‘λνλ κ²μ΄ ν¬ν¨λ©λλ€.
λ§μ΄ν¬λ‘ νλ‘ νΈμλμ λͺ¨λ νλλ μ΄μ μ μ νν΄μΌ ν λ
λ§μ΄ν¬λ‘ νλ‘ νΈμλμ λͺ¨λ νλλ μ΄μ μ λ§λ₯ μ루μ μ΄ μλλλ€. μ¬λ¬ νμ΄ λ³λ ¬λ‘ μμ νλ λκ·λͺ¨μ 볡μ‘ν μ ν리μΌμ΄μ μ κ°μ₯ μ ν©ν©λλ€. λ§μ΄ν¬λ‘ νλ‘ νΈμλμ λͺ¨λ νλλ μ΄μ μ΄ μ μ΅ν μ μλ λͺ κ°μ§ μλ리μ€λ λ€μκ³Ό κ°μ΅λλ€.
- λκ·λͺ¨ ν: μ¬λ¬ νμ΄ λμΌν μ ν리μΌμ΄μ μμ μμ ν λ λ§μ΄ν¬λ‘ νλ‘ νΈμλλ μ½λλ₯Ό 격리νκ³ μΆ©λμ μ€μ΄λ λ° λμμ΄ λ μ μμ΅λλ€.
- λ κ±°μ μ ν리μΌμ΄μ : λ§μ΄ν¬λ‘ νλ‘ νΈμλλ λ κ±°μ μ ν리μΌμ΄μ μ μ΅μ μν€ν μ²λ‘ μ μ§μ μΌλ‘ λ§μ΄κ·Έλ μ΄μ νλ λ° μ¬μ©λ μ μμ΅λλ€.
- λ 립μ μΈ λ°°ν¬: μ ν리μΌμ΄μ μ λ€λ₯Έ λΆλΆμ μν₯μ μ£Όμ§ μκ³ μ λ°μ΄νΈλ₯Ό μμ£Ό λ°°ν¬ν΄μΌ ν λ λ§μ΄ν¬λ‘ νλ‘ νΈμλλ νμν 격리λ₯Ό μ 곡ν μ μμ΅λλ€.
- κΈ°μ λ€μμ±: μ ν리μΌμ΄μ μ λ€λ₯Έ λΆλΆμ λ€λ₯Έ κΈ°μ μ μ¬μ©νλ €λ κ²½μ° λ§μ΄ν¬λ‘ νλ‘ νΈμλλ₯Ό μ¬μ©νλ©΄ κ·Έλ κ² ν μ μμ΅λλ€.
- νμ₯μ± μꡬ μ¬ν: μ ν리μΌμ΄μ μ λ€λ₯Έ λΆλΆμ λ 립μ μΌλ‘ νμ₯ν΄μΌ ν λ λ§μ΄ν¬λ‘ νλ‘ νΈμλλ νμν μ μ°μ±μ μ 곡ν μ μμ΅λλ€.
κ·Έλ¬λ λ§μ΄ν¬λ‘ νλ‘ νΈμλμ λͺ¨λ νλλ μ΄μ μ΄ νμ μ΅μ μ μ νμ μλλλ€. μκ³ κ°λ¨ν μ ν리μΌμ΄μ μ κ²½μ° μΆκ°λ 볡μ‘μ±μ΄ μ΄μ λ³΄λ€ ν΄ μ μμ΅λλ€. μ΄λ¬ν κ²½μ° λͺ¨λ리μ μν€ν μ²κ° λ μ ν©ν μ μμ΅λλ€.
λ§μ΄ν¬λ‘ νλ‘ νΈμλμ λν λμ μ κ·Ό λ°©μ
λͺ¨λ νλλ μ΄μ μ λ§μ΄ν¬λ‘ νλ‘ νΈμλλ₯Ό ꡬμΆνκΈ° μν κ°λ ₯ν λꡬμ΄μ§λ§, μ μΌν μ κ·Ό λ°©μμ μλλλ€. λ€μμ λͺ κ°μ§ λμ μ λ΅μ λλ€.
- Iframes: λ¨μνμ§λ§ μ’ μ’ μ±λ₯μ΄ λ¨μ΄μ§λ μ κ·Ό λ°©μμΌλ‘, κ°λ ₯ν 격리λ₯Ό μ 곡νμ§λ§ ν΅μ λ° μ€νμΌλ§μ μ΄λ €μμ΄ μμ΅λλ€.
- μΉ μ»΄ν¬λνΈ: μ¬μ¬μ© κ°λ₯ν UI μμλ₯Ό μμ±νκΈ° μν νμ€ κΈ°λ° μ κ·Ό λ°©μμ λλ€. νλ μμν¬μ ꡬμ λ°μ§ μλ λ§μ΄ν¬λ‘ νλ‘ νΈμλλ₯Ό ꡬμΆνλ λ° μ¬μ©λ μ μμ΅λλ€.
- Single-SPA: λ¨μΌ νμ΄μ§μμ μ¬λ¬ JavaScript μ ν리μΌμ΄μ μ μ€μΌμ€νΈλ μ΄μ νκΈ° μν νλ μμν¬μ λλ€.
- Server-Side Includes (SSI) / Edge-Side Includes (ESI): HTML μ‘°κ°μ ꡬμ±νκΈ° μν μλ² μΈ‘ κΈ°μ μ λλ€.
λ§μ΄ν¬λ‘ νλ‘ νΈμλ μν€ν μ²λ₯Ό μν λͺ¨λ² μ¬λ‘
λ§μ΄ν¬λ‘ νλ‘ νΈμλ μν€ν μ²λ₯Ό ν¨κ³Όμ μΌλ‘ ꡬννλ €λ©΄ λͺ¨λ² μ¬λ‘λ₯Ό μ€μν΄μΌ ν©λλ€.
- λ¨μΌ μ± μ μμΉ: κ° λ§μ΄ν¬λ‘ νλ‘ νΈμλλ λͺ ννκ³ μ μ μλ μ± μμ κ°μ ΈμΌ ν©λλ€.
- λ 립μ μΈ λ°°ν¬ κ°λ₯μ±: κ° λ§μ΄ν¬λ‘ νλ‘ νΈμλλ λ 립μ μΌλ‘ λ°°ν¬ν μ μμ΄μΌ ν©λλ€.
- κΈ°μ λΆκ°μ§λ‘ (κ°λ₯ν κ²½μ°): νμ΄ μμ μ κ°μ₯ μ ν©ν λꡬλ₯Ό μ νν μ μλλ‘ κΈ°μ λΆκ°μ§λ‘ μ μ§ν₯νμμμ€.
- κ³μ½ κΈ°λ° ν΅μ : λ§μ΄ν¬λ‘ νλ‘ νΈμλ κ° ν΅μ μ μν λͺ νν κ³μ½μ μ μνμμμ€.
- μλνλ ν μ€νΈ: κ° λ§μ΄ν¬λ‘ νλ‘ νΈμλ λ° μ 체 μμ€ν μ νμ§μ 보μ₯νκΈ° μν΄ ν¬κ΄μ μΈ μλνλ ν μ€νΈλ₯Ό ꡬννμμμ€.
- μ€μ μ§μ€μ λ‘κΉ λ° λͺ¨λν°λ§: λ§μ΄ν¬λ‘ νλ‘ νΈμλ μν€ν μ²μ μ±λ₯ λ° μνλ₯Ό μΆμ νκΈ° μν΄ μ€μ μ§μ€μ λ‘κΉ λ° λͺ¨λν°λ§μ ꡬννμμμ€.
κ²°λ‘
λ§μ΄ν¬λ‘ νλ‘ νΈμλμ λͺ¨λ νλλ μ΄μ μ νμ₯ κ°λ₯νκ³ μ μ§ λ³΄μ κ°λ₯νλ©° μ μ°ν νλ‘ νΈμλ μ ν리μΌμ΄μ μ ꡬμΆνκΈ° μν κ°λ ₯ν μ κ·Ό λ°©μμ μ 곡ν©λλ€. λκ·λͺ¨ μ ν리μΌμ΄μ μ λ μκ³ λ 립μ μΈ λ¨μλ‘ λΆν΄ν¨μΌλ‘μ¨ νμ λ ν¨μ¨μ μΌλ‘ μμ νκ³ , μ λ°μ΄νΈλ₯Ό λ μμ£Ό 릴리μ€νλ©°, λ λΉ λ₯΄κ² νμ ν μ μμ΅λλ€. λ§μ΄ν¬λ‘ νλ‘ νΈμλ μν€ν μ² κ΅¬νκ³Ό κ΄λ ¨λ λμ κ³Όμ κ° μμ§λ§, νΉν λκ·λͺ¨μ 볡μ‘ν μ ν리μΌμ΄μ μ κ²½μ° μ΄μ μ΄ λΉμ©λ³΄λ€ ν° κ²½μ°κ° λ§μ΅λλ€. λͺ¨λ νλλ μ΄μ μ λ§μ΄ν¬λ‘ νλ‘ νΈμλ κ°μ μ½λμ κ΅¬μ± μμλ₯Ό 곡μ νκΈ° μν νΉν μ°μνκ³ ν¨μ¨μ μΈ μ루μ μ μ 곡ν©λλ€. λ§μ΄ν¬λ‘ νλ‘ νΈμλ μ λ΅μ μ μ€νκ² κ³ννκ³ μ€νν¨μΌλ‘μ¨ μ‘°μ§ λ° μ¬μ©μμ μꡬ μ¬νμ μ λ§λ νλ‘ νΈμλ μν€ν μ²λ₯Ό ꡬμΆν μ μμ΅λλ€.
μΉ κ°λ° νκ²½μ΄ κ³μ λ°μ ν¨μ λ°λΌ λ§μ΄ν¬λ‘ νλ‘ νΈμλμ λͺ¨λ νλλ μ΄μ μ μ μ λ μ€μν μν€ν μ² ν¨ν΄μ΄ λ κ²μ λλ€. μ΄λ¬ν μ κ·Ό λ°©μμ κ°λ , μ΄μ λ° λμ κ³Όμ λ₯Ό μ΄ν΄ν¨μΌλ‘μ¨ λ€μ μΈλμ μΉ μ ν리μΌμ΄μ μ ꡬμΆν μ μλ μμΉλ₯Ό ν보ν μ μμ΅λλ€.