[디자인 패턴] Dependency Injection

orca·2024년 9월 29일

CS

목록 보기
23/46

DI는 객체 간의 의존성을 외부에서 주입하는 패턴입니다. 이를 통해 객체 간의 결합도를 낮춥니다.

Dependency Injection

  • 객체 간의 의존성을 외부에서 주입
  • 객체는 자신이 사용할 객체를 스스로 생성하지 않고, 외부로부터 주입받음
  • 객체는 구체적인 구현이 아닌 추상 클래스나 인터페이스에 의존함

장점

  • 코드의 유연성 증가
  • 테스트 용이성
  • 결합도 감소

의존성 주입이 없는 코드

class OrderService {
    private PayPalPaymentProcessor payPalPaymentProcessor;

    public OrderService() {
        this.payPalPaymentProcessor = new PayPalPaymentProcessor();
    }

    public void placeOrder() {
        // 주문 로직
        payPalPaymentProcessor.processPayment(); // 결제 처리
    }
}
  • OrderService 가 구체 클래스인PayPalPaymentProcessor 의존함
    ➡️ OrderServicePayPalPaymentProcessor 와 강하게 결합되어, 코드를 변경하지 않고 결제 프로세서를 변경하기 어려움
    ➡️ 나중에 결제 방식을 변경하거나 새로운 결제 프로세서를 추가하고 싶을 때OrderService 도 수정해야 함

의존성 주입 적용 코드

interface PaymentProcessor {
    void processPayment();
}

class CreditCardPaymentProcessor implements PaymentProcessor {
    public void processPayment() {
        System.out.println("Processing payment through credit card.");
    }
}

class PayPalPaymentProcessor implements PaymentProcessor {
    public void processPayment() {
        System.out.println("Processing payment through PayPal.");
    }
}
class OrderService {
    private PaymentProcessor paymentProcessor;

    // 생성자 주입을 통해 의존성 전달
    public OrderService(PaymentProcessor paymentProcessor) {
        this.paymentProcessor = paymentProcessor;
    }

    public void placeOrder() {
        // 주문 로직
        paymentProcessor.processPayment(); // 결제 처리
    }
}
  • OrderService 는 자신이 사용할 객체를 스스로 생성하지 않음
  • OrderService 는 추상화된 PaymentProcessor 에 의존함
    ➡️ 다양한 PaymentProcessor 구현체와 호환 가능함
public class FrameWork {
    public static void main(String[] args) {
        PaymentProcessor processor = new CreditCardPaymentProcessor();
        OrderService orderService = new OrderService(processor);
        orderService.placeOrder();
    }
}
  • FrameWorkOrderService 인스턴스를 생성할 때 CreditCardPaymentProcessor 객체를 생성하고 이를 OrderService의 생성자 인자로 전달함

Dependency Inversion Principle

  • SOLID 원칙 중 하나
  • 고수준 모듈이 저수준 모듈에 의존하지 않고, 두 모듈 모두 추상화에 의존하게 함
  • 고수준 모듈 : 비즈니스 로직을 포함하는 모듈
  • 저수준 모듈 : 데이터베이스나 파일 시스템과 같은 세부 사항을 처리하는 모듈

장점

  • 코드의 유연성 증가
  • 확장성 증가
  • 유지보수성 향상

DIP와 DI의 관계

  • DIP는 고수준 모듈이 저수준 모듈에 의존하지 않도록 하고, 추상화된 인터페이스에 의존하게 하는 원칙입니다.
  • 따라서 DI 패턴을 적용해 DIP를 치킬 수 있음

0개의 댓글