π [Spring] π» μ€νλ§ ν΅μ¬μ리 - 3. IoC, DI, κ·Έλ¦¬κ³ μ»¨ν μ΄λ
π» [Spring] μ€νλ§ ν΅μ¬μ리 - 3. IoC, DI, κ·Έλ¦¬κ³ μ»¨ν μ΄λ
μλ
νμΈμ. π
μ€νλ§μΌλ‘ μ¬λ¬ νλ‘μ νΈλ₯Ό κ°λ°νμλλ°
λ¬Έλ μ€νλ§ μ체 ν΅μ¬ μ리μ λν 볡μ΅μ΄ νκ³ μΆμμ΅λλ€.
κ·Έλμ κΉμνλμ μ€νλ§ ν΅μ¬μ리 κ°μλ₯Ό λ€μΌλ©°
μ€νλ§μ μ μ¬μ©ν΄μΌνλμ§μ
μ€νλ§ ν΅μ¬μ리μ λν΄ νμ΅ν λ΄μ©μ
λλ€.
μΈλ²μ§Έ ν¬μ€νΈμ
λλ€.
μ΄μ λλ²μ§Έ ν¬μ€νΈμμ μ§μ μμ μλ°λ§μ μ΄μ©ν΄ κ°μ²΄ μ§ν₯ μ리λ₯Ό μ μ©ν΄ νλ‘μ νΈλ₯Ό κ°λ°ν΄λ³΄μμ΅λλ€. μ΄ κ³Όμ μμ μ IoC, DI, 컨ν μ΄λ κ°μ κ°λ λ€μ΄ νμν΄μ§κ³ λ±μ₯νκ² λμλμ§λ₯Ό μ μ μμμ΅λλ€. μ΄λ² μΈλ²μ§Έ ν¬μ€νΈμμλ μμ κ³Όμ μμ λ±μ₯νκ² λ IoC, DI, 컨ν μ΄λμ λν΄ μ 리νλ μκ°μ λλ€.
λλ²μ§Έ ν¬μ€νΈ μ ν¨κ» 보μλ©΄ μ΄ν΄νκΈ°κ° λ μ¬μΈ κ² μ λλ€.
1. μ μ΄μ μμ IoC (Inversion of Control)
β» νλ‘κ·Έλ¨μ μ μ΄ νλ¦μ μ§μ μ μ΄νλ κ²μ΄ μλλΌ μΈλΆμμ κ΄λ¦¬νλ κ² μ μ μ΄μ μμ (IoC) μ΄λΌ νλ€.
-
κΈ°μ‘΄ νλ‘κ·Έλ¨μ ν΄λΌμ΄μΈνΈ ꡬν κ°μ²΄κ° μ€μ€λ‘ νμν μλ² κ΅¬ν κ°μ²΄λ₯Ό μμ±νκ³ , μ°κ²°νκ³ , μ€ννλ€. ν λ§λλ‘ κ΅¬ν κ°μ²΄κ° νλ‘κ·Έλ¨μ μ μ΄ νλ¦μ μ€μ€λ‘ μ‘°μ’ νλ€. κ°λ°μ μ μ₯μμλ μμ°μ€λ¬μ΄ νλ¦μ΄λ€.
-
λ°λ©΄μ AppConfigκ° λ±μ₯ν μ΄νμ ꡬν κ°μ²΄λ μμ μ λ‘μ§μ μ€ννλ μν λ§ λ΄λΉνλ€. νλ‘κ·Έλ¨μ μ μ΄ νλ¦μ μ΄μ AppConfigκ° κ°μ Έκ°λ€. μλ₯Ό λ€μ΄μ OrderServiceImpl μ νμν μΈν°νμ΄μ€λ€μ νΈ μΆνμ§λ§ μ΄λ€ ꡬν κ°μ²΄λ€μ΄ μ€νλ μ§ λͺ¨λ₯Έλ€.
-
νλ‘κ·Έλ¨μ λν μ μ΄ νλ¦μ λν κΆνμ λͺ¨λ AppConfigκ° κ°μ§κ³ μλ€. μ¬μ§μ΄ OrderServiceImpl λ AppConfigκ° μμ±νλ€. κ·Έλ¦¬κ³ AppConfigλ OrderServiceImpl μ΄ μλ OrderService μΈν°ν μ΄μ€μ λ€λ₯Έ ꡬν κ°μ²΄λ₯Ό μμ±νκ³ μ€νν μ λ μλ€. κ·Έλ° μ¬μ€λ λͺ¨λ₯Έμ²΄ OrderServiceImpl μ 묡묡ν μμ μ λ‘μ§μ μ€νν λΏμ΄λ€.
-
μ΄λ λ― νλ‘κ·Έλ¨μ μ μ΄ νλ¦μ μ§μ μ μ΄νλ κ²μ΄ μλλΌ μΈλΆμμ κ΄λ¦¬νλ κ²μ μ μ΄μ μμ (IoC)μ΄λΌ νλ€.
2. νλ μμν¬ vs λΌμ΄λΈλ¬λ¦¬
β» μμ± λμ΄μλ μ½λλ₯Ό λ΄κ° μ§μ νΈμΆν΄ κ°μ Έλ€μ°λ©΄ λΌμ΄λΈλ¬λ¦¬μ΄κ³ λ°λλ‘ λ΄κ° μμ±ν μ½λλ₯Ό μΈλΆμμ μ μ΄νλ©΄ κ·Έ μΈλΆκ° νλ μμν¬λ€.
νλ μμν¬κ° λ΄κ° μμ±ν μ½λλ₯Ό μ μ΄νκ³ , λμ μ€ννλ©΄ κ·Έκ²μ νλ μμν¬κ° λ§λ€. (JUnit) λ°λ©΄μ λ΄κ° μμ±ν μ½λκ° μ§μ μ μ΄μ νλ¦μ λ΄λΉνλ€λ©΄ κ·Έκ²μ νλ μμν¬κ° μλλΌ λΌμ΄λΈλ¬λ¦¬λ€.
3. μμ‘΄κ΄κ³ μ£Όμ DI(Dependency Injection)
- OrderServiceImpl μ DiscountPolicy μΈν°νμ΄μ€μ μμ‘΄νλ€. μ€μ μ΄λ€ ꡬν κ°μ²΄κ° μ¬μ©λ μ§λ λͺ¨λ₯Έλ€.
- μμ‘΄κ΄κ³λ μ μ μΈ ν΄λμ€ μμ‘΄ κ΄κ³μ, μ€ν μμ μ κ²°μ λλ λμ μΈ κ°μ²΄(μΈμ€ν΄μ€) μμ‘΄ κ΄κ³ λμ λΆλ¦¬ ν΄μ μκ°ν΄μΌ νλ€.
μ μ μΈ ν΄λμ€ μμ‘΄κ΄κ³
ν΄λμ€κ° μ¬μ©νλ import μ½λλ§ λ³΄κ³ μμ‘΄κ΄κ³λ₯Ό μ½κ² νλ¨ν μ μλ€ (μ μ ). μ μ μΈ μμ‘΄κ΄κ³λ μ ν리μΌμ΄μ μ μ€ννμ§ μμλ λΆμν μ μλ€. ν΄λμ€ λ€μ΄μ΄κ·Έλ¨μ 보μ. OrderServiceImpl μ MemberRepository , DiscountPolicy μ μμ‘΄νλ€λ κ²μ μ μ μλ€.
κ·Έλ°λ° μ΄λ¬ν ν΄λμ€ μμ‘΄κ΄κ³ λ§μΌλ‘λ μ€μ μ΄λ€ κ°μ²΄κ° OrderServiceImpl μ μ£Όμ λ μ§ μ μ μλ€.
ν΄λμ€ λ€μ΄μ΄κ·Έλ¨
λμ μΈ κ°μ²΄ μΈμ€ν΄μ€ μμ‘΄ κ΄κ³
μ ν리μΌμ΄μ μ€ν μμ μ μ€μ μμ±λ κ°μ²΄ μΈμ€ν΄μ€μ μ°Έμ‘°κ° μ°κ²°λ μμ‘΄ κ΄κ³λ€.
κ°μ²΄ λ€μ΄μ΄κ·Έλ¨
-
μ ν리μΌμ΄μ μ€ν μμ (λ°νμ)μ μΈλΆμμ μ€μ ꡬν κ°μ²΄λ₯Ό μμ±νκ³ ν΄λΌμ΄μΈνΈμ μ λ¬ν΄μ ν΄λΌμ΄μΈ νΈμ μλ²μ μ€μ μμ‘΄κ΄κ³κ° μ°κ²° λλ κ²μ μμ‘΄κ΄κ³ μ£Όμ μ΄λΌ νλ€.
-
κ°μ²΄ μΈμ€ν΄μ€λ₯Ό μμ±νκ³ , κ·Έ μ°Έμ‘°κ°μ μ λ¬ν΄μ μ°κ²°λλ€.
-
μμ‘΄κ΄κ³ μ£Όμ μ μ¬μ©νλ©΄ ν΄λΌμ΄μΈνΈ μ½λλ₯Ό λ³κ²½νμ§ μκ³ , ν΄λΌμ΄μΈνΈκ° νΈμΆνλ λμμ νμ μΈμ€ν΄μ€ λ₯Ό λ³κ²½ν μ μλ€.
-
μμ‘΄κ΄κ³ μ£Όμ μ μ¬μ©νλ©΄ μ μ μΈ ν΄λμ€ μμ‘΄κ΄κ³λ₯Ό λ³κ²½νμ§ μκ³ , λμ μΈ κ°μ²΄ μΈμ€ν΄μ€ μμ‘΄κ΄κ³λ₯Ό μ½ κ² λ³κ²½ν μ μλ€.
4. IoC 컨ν μ΄λ, DI 컨ν μ΄λ
- AppConfig μ²λΌ κ°μ²΄λ₯Ό μμ±νκ³ κ΄λ¦¬νλ©΄μ μμ‘΄κ΄κ³λ₯Ό μ°κ²°ν΄ μ£Όλ κ²μ IoC 컨ν μ΄λ λλ DI 컨ν μ΄λλΌ νλ€.
- μμ‘΄κ΄κ³ μ£Όμ μ μ΄μ μ λ§μΆμ΄ μ΅κ·Όμλ μ£Όλ‘ DI 컨ν μ΄λλΌ νλ€.
- μ ν리μΌμ΄μ μ 체μ λν ꡬμ±μ 쑰립μ νλ€κ³ ν΄μ μ΄μλΈλ¬λΌκ³ λ νλ€.
- μ€λΈμ νΈλ₯Ό μμ±ν΄λΈλ€κ³ ν΄μ μ€λΈμ νΈ ν©ν 리 λ±μΌλ‘ λΆλ¦¬κΈ°λ νλ€.
5. μ€νλ§ μ»¨ν μ΄λ
-
μ€νλ§ μ»¨ν μ΄λλ₯Ό λΆλ₯Ό λ BeanFactory , ApplicationContext λ‘ κ΅¬λΆν΄μ μ΄μΌκΈ° νλ€. νμ§λ§ BeanFactory λ₯Ό μ§μ μ¬μ©νλ κ²½μ°λ κ±°μ μμΌλ―λ‘ μΌλ°μ μΌλ‘ ApplicationContext λ₯Ό μ€νλ§ μ»¨ν μ΄λλΌ νλ€.
-
κΈ°μ‘΄μλ κ°λ°μκ° AppConfig λ₯Ό μ¬μ©ν΄μ μ§μ κ°μ²΄λ₯Ό μμ±νκ³ DIλ₯Ό νμ§λ§, μ΄μ λΆν°λ μ€νλ§ μ»¨ν μ΄ λλ₯Ό ν΅ν΄μ μ¬μ©νλ€.
-
μ€νλ§ μ»¨ν μ΄λλ @Configuration μ΄ λΆμ AppConfig λ₯Ό μ€μ (ꡬμ±) μ λ³΄λ‘ μ¬μ©νλ€. μ¬κΈ°μ @Bean μ΄λΌ μ ν λ©μλλ₯Ό λͺ¨λ νΈμΆν΄μ λ°νλ κ°μ²΄λ₯Ό μ€νλ§ μ»¨ν μ΄λμ λ±λ‘νλ€. μ΄λ κ² μ€νλ§ μ»¨ν μ΄λμ λ±λ‘λ κ°μ²΄λ₯Ό μ€νλ§ λΉμ΄λΌ νλ€.
-
μ€νλ§ λΉμ @Bean μ΄ λΆμ λ©μλμ λͺ μ μ€νλ§ λΉμ μ΄λ¦μΌλ‘ μ¬μ©νλ€. ( memberService ,orderService )
-
μ΄μ μλ κ°λ°μκ° νμν κ°μ²΄λ₯Ό AppConfig λ₯Ό μ¬μ©ν΄μ μ§μ μ‘°ννμ§λ§, μ΄μ λΆν°λ μ€νλ§ μ»¨ν μ΄λ λ₯Ό ν΅ν΄μ νμν μ€νλ§ λΉ(κ°μ²΄)λ₯Ό μ°ΎμμΌ νλ€. μ€νλ§ λΉμ applicationContext.getBean() λ©μλ λ₯Ό μ¬μ©ν΄μ μ°Ύμ μ μλ€.
-
κΈ°μ‘΄μλ κ°λ°μκ° μ§μ μλ°μ½λλ‘ λͺ¨λ κ²μ νλ€λ©΄ μ΄μ λΆν°λ μ€νλ§ μ»¨ν μ΄λμ κ°μ²΄λ₯Ό μ€νλ§ λΉμΌλ‘ λ±λ‘νκ³ , μ€νλ§ μ»¨ν μ΄λμμ μ€νλ§ λΉμ μ°Ύμμ μ¬μ©νλλ‘ λ³κ²½λμλ€.
λ
μ€νλ§μ λ μ¬λ°λ₯΄κ² μ¬μ©νκΈ° μν΄ κΉμνλμ μ€νλ§ ν΅μ¬ μ리 κ°μλ₯Ό λ€μΌλ©° μ 리ν
μΈλ²μ§Έ ν¬μ€νΈμμ΅λλ€.
κ°μ¬ν©λλ€. π
μ€νλ§ ν΅μ¬μ리 ν¬μ€νΈ
1. κ°μ²΄ μ§ν₯ μ€κ³μ μ€νλ§
2. μ€νλ§ ν΅μ¬ μ리 μ΄ν΄ 1,2
Reference