π[Backend Development] μ μ΄μ μμ (IoC)μ μμ‘΄μ± μ£Όμ (DI)
β 1. μ μ΄μ μμ (IoC: Inversion of Control)
π μ μ
κ°μ μ μμ±, μλͺ μ£ΌκΈ°, μμ‘΄μ± κ΄λ¦¬ λ± μ μ΄κΆμ κ°λ°μκ° μλ νλ μμν¬κ° λ΄λΉνλ κ²
πμ½κ² λ§νλ©΄?
- μλλ κ°λ°μκ° new ν€μλλ‘ κ°μ²΄λ₯Ό μμ±νκ³ μ°κ²°ν΄μΌ νμ§λ§, μ΄μ λ κ·Έ μ± μμ μ€νλ§ νλ μμν¬μ λκΈ΄ κ²μ λλ€.
π μ ν΅μ λ°©μ (μ μ΄κΆ = κ°λ°μ)
UserService userService = new UserService();
ArticleService articleService = new ArticleService(userService);
β IoC λ°©μ (μ μ΄κΆ = μ€νλ§)
@Component
public class ArticleService {
private final UserService userService;
@Autowired
public ArticleService(UserService userService) {
this.userService = userService;
}
}
β κ°μ²΄ μμ± λ° μ£Όμ μ μ€νλ§ μ»¨ν μ΄λκ° μμμ ν΄μ€λλ€.
β 2. μμ‘΄μ± μ£Όμ (DI: Dependency Injection)
π μ μ
κ°μ²΄κ° μμ‘΄νλ λ€λ₯Έ κ°μ²΄λ₯Ό βμ§μ μμ±νμ§ μκ³ β μΈλΆμμ μ£Όμ λ°λ λ°©μ
- DIλ IoCμ ꡬν λ°©μ μ€ νλμ λλ€.
- λνμ μΌλ‘ μμ±μ μ£Όμ , νλ μ£Όμ , μΈν° μ£Όμ μ΄ μμ΅λλ€.
π§μ: μμ±μ μ£Όμ
@Component
public class ArticleService {
private final UserService userService;
@Autowired
public ArticleService(UserService userService) {
this.userService = userService;
}
}
π§μ: νλ μ£Όμ
@Component
public class ArticleService {
@Autowired
private UserService userService;
}
β IoC vs DI μμ½
κ΅¬λΆ | μ μ΄μ μμ (IoC) | μμ‘΄μ± μ£Όμ (DI) |
---|---|---|
κ°λ | μ μ΄κΆμ νλ μμν¬μ λκΉ | κ°μ²΄ κ° μμ‘΄μ±μ μΈλΆμμ μ£Όμ |
μν | μ 체 νλ¦μ μ μ΄λ₯Ό λ°κΏ | κ°μ²΄ κ° κ΄κ³λ₯Ό μ€μ ν¨ |
κ΄κ³ | DIλ IoCλ₯Ό ꡬννλ λ°©μ μ€ νλ | IoCλ³΄λ€ μ’μ κ°λ |
μμ | μ€νλ§μ΄ Beanμ λ§λ€κ³ κ΄λ¦¬ | μ€νλ§μ΄ νμν μμ‘΄ κ°μ²΄λ₯Ό μ£Όμ |
π― κ²°λ‘
- IoCλ λκ° κ°μ²΄λ₯Ό λ§λ€κ³ κ΄λ¦¬νλλμ λ¬Έμ β μ€νλ§μ΄ λμ ν¨
- DIλ μ΄λ»κ² κ°μ²΄ κ° μ°κ²°μ νλλμ λ¬Έμ β μμ±μ, νλ λ±μ ν΅ν΄ μ£Όμ