IoC (Inversion of Controll)
π κ°μ
- IoCλ κ°μ²΄ μμ±/μ΄κΈ°ν/μμ‘΄μ± μ°κ²°μ μ μ΄κΆμ μ ν리μΌμ΄μ μμ 컨ν μ΄λλ‘ λ€μ§λ μμΉμ΄λ€. (μ: νλ μμν¬)
- Springμμ IoC 컨ν μ΄λ(BeanFactory/ApplicationContext) κ° μ΄λ Έν μ΄μ μ μ½μ΄ Beanμ μμ±Β·μ£Όμ Β·κ΄λ¦¬ νλ€.
- DI(μμ‘΄μ± μ£Όμ ) λ IoCλ₯Ό ꡬννλ ν΅μ¬ λ©μ»€λμ¦μ΄λ€.
βπ» νμ€ μμ½
IoC λ κ°μ²΄μ μμ±Β·μλͺ Β·μμ‘΄μ± κ΄λ¦¬λ₯Ό κ°λ°μκ° μλ νλ μμν¬κ° λ΄λΉνλλ‘ μ€κ³νλ μμΉμ΄λ€.
π€ μ νμνκ°?
new
ν€μλλ‘ μ§μ μμ±νλ©΄ ꡬν ν κ΅μ²΄κ° μ΄λ €μ κ²°ν©λβ (ν μ€νΈ/νμ₯/νκ²½ μ νμ΄ νλ¦)- κ°μ²΄ μλͺ μ£ΌκΈ° κ΄λ¦¬(μ΄κΈ°ν, μ 리)μ aop μ μ©μ νκ³
Spring IoCΒ :Β Spring Container & Bean
κ·Έλ λ€λ©΄ μ€νλ§μ μ΄λ»κ² κ°μ²΄λ₯Ό μμ±νκ³ μ£Όμ ν μ μκ² ν΄μ£Όλ κ²μΈκ°?
κ²°λ‘ λΆν° λ§νμλ©΄,Β Spring Container λΌλ λ μμ΄ βκ°μ²΄ μ μβλ₯Ό 미리 μ½κ³ , κ·Έ μ μλ₯Ό κΈ°λ°μΌλ‘ κ°μ²΄λ₯Ό μμ±νκ³ , μμ‘΄μ±μ μ£Όμ νλ©°, μμ±μ£ΌκΈ°λ₯Ό κ΄λ¦¬νλ€.
- ApplicationContext : BeanFactoryμ νμ₯. λ©μμ§μμ€, μ΄λ²€νΈ, νκ²½, AOP λ± μΈνλΌλ₯Ό ν¬ν¨νλ€.
Spring Bootμ μλκ΅¬μ± μ 쑰건(@Conditional
)μ λ°λΌ κΈ°λ³Έ λΉμ μ 곡νλ λ μ΄μ΄λ‘, IoC 컨ν
μ΄λ μμμ λμνλ€.
π§ μμ
(A) μ§μ μμ± - κ²°ν©λ λμ
public class Communication implements Steps {
private final Greeting greeting;
private final Farewell farewell;
private final Sender sender;
public Communication() {
this.greeting = new EnglishGreeting();
this.farewell = new EnglishFarewell();
this.sender = new ConsoleSender();
}
// ...
}
μ μ½λμμ κ° κ΅¬ν체 ν΄λμ€λ€μ λ€λ₯Έ ν΄λμ€λ‘ μμ νκ³ μΆμΌλ©΄ μ΄λ»κ² ν΄μΌν κΉ?
public Communication() {
this.greeting = new KoreanGreeting();
this.farewell = new EnglishFarewell();
this.sender = new ConsoleSender();
}
λ¬Όλ‘ μμ²λΌ μ½κ² μμ ν μ μλ€.
κ·Έλ¬λ, μ΄ communication()
κ³Ό κ°μ ν΄λμ€κ° λ§μμ§λ€λ©΄, μΌμΌμ΄ λ€ νλμ© μμ ν΄μ€μΌ νλ€λ λΆνΈν¨μ΄ μκΈ΄λ€.
μ΄ κ³Όμ μ κ°λ°μκ° νμ§μκ² νλ μμν¬κ° λμ νλ κ²μ IoCΒ λΌ νκ³ , μ€νλ§μμλ μ΄λ₯ΌΒ @AutowiredΒ λΒ @ComponentΒ κ°μΒ μμ‘΄μ±μ£Όμ (DI)Β μΌλ‘ ν΄κ²°νλ€.
(B) IoC/DI μ μ© - μμ±μ μ£Όμ
@Component
public class Communication {
private final Greeting greeting;
private final Farewell farewell;
private final Sender sender;
public Communication(Greeting greeting, Farewell farewell, Sender sender) {
this.greeting = greeting;
this.farewell = farewell;
this.sender = sender;
}
}
@Configuration
@ComponentScan // Greeting/Farewell/Sender ꡬν체μ @Component
public class AppConfig { }
β οΈ μ£Όμν μ
- IoC β DI β AOP: DIλ IoCμ ꡬνμ΄κ³ , AOPλ ν‘λ¨ κ΄μ¬μ¬ λΆλ¦¬ κΈ°λ² μ€ νλμΌ λΏμ΄λ€!
@Autowired
νλ μ£Όμ λ³΄λ€ μμ±μ μ£Όμ κΆμ₯ (λΆλ³μ±/ν μ€νΈ μ©μ΄)- β컨ν μ΄λκ° βκ°μ²΄ μ μβλ₯Ό 미리 μ½λλ€β β μ ννλ κ΅¬μ± λ©νλ°μ΄ν°λ₯Ό μ€μΊ/νμ±ν΄ λΉ μ μλ₯Ό λ§λ€κ³ κ΄λ¦¬νλ€.
π κ΄λ ¨
- DI - IoCλ₯Ό ꡬννλ ν¨ν΄
- auto-configuration - 쑰건μ λ°λ₯Έ Bean μλ λ±λ‘
- external-configuration - νκ²½/νλ‘ν κΈ°λ° μ€μ λΆλ¦¬