Home > CS > 2024 > πŸ’Ύ [CS] μ˜μ‘΄μ„± μ£Όμž…(DI, Dependency Injection)

πŸ’Ύ [CS] μ˜μ‘΄μ„± μ£Όμž…(DI, Dependency Injection)
CS

πŸ’Ύ [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" λŠ” μˆ˜μ •ν•  ν•„μš”κ°€ μ—†μŠ΅λ‚˜λ‹€.

이처럼 β€œμΆ”μƒν™”β€λŠ” μƒμœ„ λͺ¨λ“ˆκ³Ό ν•˜μœ„ λͺ¨λ“ˆμ΄ νŠΉμ • κ΅¬ν˜„μ΄ μ•„λ‹Œ, 일반적인 κ°œλ…μ— μ˜μ‘΄ν•˜λ„λ‘ λ§Œλ“€μ–΄μ€ŒμœΌλ‘œμ¨, μ½”λ“œμ˜ μœ μ—°μ„±κ³Ό μž¬μ‚¬μš©μ„±μ„ λ†’μ—¬μ£ΌλŠ” μ€‘μš”ν•œ κ°œλ…μž…λ‹ˆλ‹€.