πΎ [CS] μμ‘΄μ± μ£Όμ (DI, Dependency Injection).
1οΈβ£ μμ‘΄μ± μ£Όμ (DI, Dependency Injection)
- μ±κΈν€ ν¨ν΄κ³Ό κ°μ΄ μ¬μ©νκΈ° μ½κ³ κ΅μ₯ν μ€μ©μ μ΄μ§λ§ λͺ¨λ κ°μ κ²°ν©μ κ°νκ² λ§λ€ μ μλ λ¨μ μ΄ μλ ν¨ν΄μ κ²½μ° μμ‘΄μ± μ£Όμ (DI, Dependency Injection)μ ν΅ν΄ λͺ¨λ κ°μ κ²°ν©μ μ‘°κΈ λ λμ¨νκ² λ§λ€μ΄ ν΄κ²°ν μ μμ΅λλ€.
- μμ‘΄μ±μ΄λ μ’ μμ±μ΄λΌκ³ λ νλ©° Aκ° Bμ μμ‘΄μ±μ΄ μλ€λ κ²μ Bμ λ³κ²½ μ¬νμ λν΄ A λν λ³ν΄μΌ λλ€λ κ²μ μλ―Έν©λλ€.
- μμ κ·Έλ¦Όμ²λΌ λ©μΈ λͺ¨λ(main module)μ΄ βμ§μ β λ€λ₯Έ νμ λͺ¨λμ λν μμ‘΄μ±μ 주기보λ€λ μ€κ°μ μμ‘΄μ± μ£Όμ
μ(dependency injector)κ° μ΄ λΆλΆμ κ°λ‘μ± λ©μΈ λͺ¨λμ΄
"κ°μ μ "
μΌλ‘ μμ‘΄μ±μ μ£Όμ νλ λ°©μμ λλ€.- μ΄λ₯Ό ν΅ν΄ λ©μΈ λͺ¨λ(μμ λͺ¨λ)μ νμ λͺ¨λμ λν μμ‘΄μ±μ΄ λ¨μ΄μ§κ² λ©λλ€.
- μ°Έκ³ λ‘ μ΄λ₯Ό βλ컀νλ§μ΄ λλ€β κ³ λ ν©λλ€.
- μ΄λ₯Ό ν΅ν΄ λ©μΈ λͺ¨λ(μμ λͺ¨λ)μ νμ λͺ¨λμ λν μμ‘΄μ±μ΄ λ¨μ΄μ§κ² λ©λλ€.
1οΈβ£ μμ‘΄μ± μ£Όμ μ μ₯μ
- λͺ¨λλ€μ μ½κ² κ΅μ²΄ν μ μλ κ΅¬μ‘°κ° λμ΄ ν
μ€ν
νκΈ° μ½κ³ λ§μ΄κ·Έλ μ΄μ
νκΈ°λ μμν©λλ€.
- λν, ꡬνν λ μΆμν λ μ΄μ΄λ₯Ό λ£κ³ μ΄λ₯Ό κΈ°λ°μΌλ‘ ꡬν체λ₯Ό λ£μ΄ μ£ΌκΈ° λλ¬Έμ μ ν리μΌμ΄μ μμ‘΄μ± λ°©ν₯μ΄ μΌκ΄λκ³ , μ ν리μΌμ΄μ μ μ½κ² μΆλ‘ ν μ μμΌλ©°, λͺ¨λ κ°μ κ΄κ³λ€μ΄ μ‘°κΈ λ λͺ νν΄μ§λλ€.
2οΈβ£ μμ‘΄μ± μ£Όμ μ λ¨μ
- λͺ¨λλ€μ΄ λμ±λ λΆλ¦¬λλ―λ‘ ν΄λμ€ μκ° λμ΄λ 볡μ‘μ±μ΄ μ¦κ°λ μ μμΌλ©° μ½κ°μ λ°νμ νλν°κ° μκΈ°κΈ°λ ν©λλ€.
3οΈβ£ μμ‘΄μ± μ£Όμ μμΉ
- μμ‘΄μ± μ£Όμ
μ
"μμ λͺ¨λμ νμ λͺ¨λμμ μ΄λ ν κ²λ κ°μ Έμ€μ§ μμμΌ ν©λλ€. λν, λ λ€ μΆμνμ μμ‘΄ν΄μΌ νλ©°, μ΄λ μΆμνλ μΈλΆ μ¬νμ μμ‘΄νμ§ λ§μμΌ ν©λλ€."
λΌλ μμ‘΄μ± μ£Όμ μμΉμ μ§μΌμ£Όλ©΄μ λ§λ€μ΄μΌ ν©λλ€.
μ λ¬Έμ₯μμ βμΆμνβμ μλ―Έ.
λ¬Έμ₯μμ βμΆμνβλ ꡬ체μ μΈ κ΅¬νμ μμ‘΄νμ§ μκ³ , μΌλ°νλ μΈν°νμ΄μ€λ μΆμ ν΄λμ€ λ±μ μμ‘΄ν΄μΌ νλ€λ κ²μ λ»ν©λλ€.
μ΄ μμΉμ μμ‘΄μ± μμ μμΉ(DIP, Dependency Inversion Principle) κ³Ό κ΄λ ¨μ΄ μμ΅λλ€.
- μμ λͺ¨λ : μ ν리μΌμ΄μ μ μμ κ³μΈ΅μμ λμνλ μ½λ, μ¦ λ λμ μμ€μ μ μ± μ΄λ λ‘μ§μ ꡬννλ λͺ¨λμ λλ€.
- νμ λͺ¨λ : μμ λͺ¨λμμ νΈμΆνκ±°λ μ¬μ©νλ ꡬ체μ μΈ κΈ°λ₯μ΄λ μΈλΆ μ¬νμ ꡬννλ μ½λμ λλ€.
1οΈβ£ μΆμν.
- βμΆμνβ λ κ°μ± μ§ν₯ νλ‘κ·Έλλ°(OOP)μ μ μ€μν κ°λ μ€ νλλ‘, ꡬ체μ μΈ κ΅¬ν(details)μ κ°μΆκ³ , λ λμ μμ€μ κ°λ μ μ μνλ κ²μ μλ―Έν©λλ€.
- μΆμνλ ꡬ체μ μΈ κ²λ³΄λ€λ λ μΌλ°μ μ΄κ³ 보νΈμ μΈ κ°λ μ λ€λ£¨λ©°, νΉμ ν ꡬν μ¬νμ μμ‘΄νμ§ μκ³ μΈν°νμ΄μ€λ μΆμ ν΄λμ€ λ±μ ν΅ν΄ κΈ°λ₯μ μ μν©λλ€.
2οΈβ£ μμ‘΄μ± μ£Όμ κ³Ό μΆμνμ κ΄κ³.
- μμ‘΄μ± μ£Όμ
(DI, Dependency Injection)μ μμ‘΄μ± μμ μμΉ(DIP, Dependency Inversion Principle)μ ꡬννκΈ° μν λ°©λ² μ€ νλμ
λλ€.
- μμ‘΄μ± μ£Όμ
μ μ¬μ©νλ©΄, μμ λͺ¨λμ΄ νμ λͺ¨λμ ꡬ체μ μΈ κ΅¬νμ μμ‘΄νμ§ μκ³ , νμ λͺ¨λμ΄ κ΅¬νν μΆμν(μΈν°νμ΄μ€λ μΆμ ν΄λμ€)μ μμ‘΄νλλ‘ μ½λλ₯Ό μ€κ³ν μ μμ΅λλ€.
- μ¦, μμ λͺ¨λκ³Ό νμ λͺ¨λ λͺ¨λ μΆμνλ μΈν°νμ΄μ€μ μμ‘΄νκ² νμ¬, ꡬ체μ μΈ κ΅¬νμ΄ λ³κ²½λλλΌλ μμ λͺ¨λμ μ½λκ° μν₯μ λ°μ§ μλλ‘ ν©λλ€.
- μμ‘΄μ± μ£Όμ
μ μ¬μ©νλ©΄, μμ λͺ¨λμ΄ νμ λͺ¨λμ ꡬ체μ μΈ κ΅¬νμ μμ‘΄νμ§ μκ³ , νμ λͺ¨λμ΄ κ΅¬νν μΆμν(μΈν°νμ΄μ€λ μΆμ ν΄λμ€)μ μμ‘΄νλλ‘ μ½λλ₯Ό μ€κ³ν μ μμ΅λλ€.
3οΈβ£ μμ.
- μλλ μΆμνμ μμ‘΄μ± μ£Όμ μ μ μ©ν μμμ λλ€.
// μΆμνλ μΈν°νμ΄μ€ (μΆμν)
public interface PaymentProcessor {
void processPayment(double amount);
}
// νμ λͺ¨λ - ꡬ체μ μΈ κ΅¬ν
public class PayPalProcessor implements PaymentProcessor {
@Override
public void processPayment(double amount) {
// PayPalμ ν΅ν΄ κ²°μ μ²λ¦¬
}
}
public class CreditCardProcessor implements PaymentProcessor {
@Override
public void processPayment(double amount) {
// μ μ©μΉ΄λλ₯Ό ν΅ν΄ κ²°μ μ²λ¦¬
}
}
// μμ λͺ¨λ - μΆμνμ μμ‘΄ν¨
public class PaymentService {
private PaymentProcessor paymentProcessor;
// μμ‘΄μ± μ£Όμ
μ ν΅ν΄ ꡬν체λ₯Ό μ£Όμ
λ°μ
public PaymentService(PaymentProcessor paymentProcessor) {
this.paymentProcessor = paymentProcessor;
}
public void makePayment(double amount) {
paymentProcessor.processPayment(amount);
}
}
- μ μ½λμμ
"PaymentService"
λ"PaymentProcessor"
λΌλ μΆμνμ μμ‘΄ν©λλ€.-
"PaymentService"
λ"PayPalProcessor"
λ"CreditCardProcessor"
μ ꡬ체μ μΈ κ΅¬νμ μ νμκ° μμΌλ©°, λ¨μ§"PaymentProcessor"
μΈν°νμ΄μ€μ μ μλ λ©μλλ₯Ό νΈμΆν©λλ€.
- μ΄λ₯Ό ν΅ν΄ κ²°μ μ²λ¦¬ λ°©μμ΄ PayPalμμ μ μ©μΉ΄λλ‘ λ³κ²½λλλΌλ"PaymentService"
λ μμ ν νμκ° μμ΅λλ€.
-
μ΄μ²λΌ βμΆμνβλ μμ λͺ¨λκ³Ό νμ λͺ¨λμ΄ νΉμ ꡬνμ΄ μλ, μΌλ°μ μΈ κ°λ μ μμ‘΄νλλ‘ λ§λ€μ΄μ€μΌλ‘μ¨, μ½λμ μ μ°μ±κ³Ό μ¬μ¬μ©μ±μ λμ¬μ£Όλ μ€μν κ°λ μ λλ€.