-
의존성주입(DI, Dependency Injection)
:객체들 간에 의존 관계가 있을 때 의존성을 느슨하게 만들어 유연하고 확장 가능한 코드를 작성하기 위해 사용 된다. 이를 위해 객체가 직접 의존하는 객체를 직접 생성하거나 검색하는 대신, 외부에서 의존 객체를 주입하는 방식으로 사용된다.
예를 들어 클래스 A가B에 의존한다. 의존성 주입을 사용하지 않는다면 A에서 클래스 B를 직접 생성해야한다. 하지만 의존성 주입(DI)을 적용하기 된다면 클래스 A는 B를 직접 생성하지 않고 외부에서 B의 인스턴스를 주입 받아 사용한다. 이를 통해 A와B 사이의 결합도를 낮추고 코드 재사용성과 테스트 용이성을 높일 수 있다.
직접 예를 한번 보자(의존성 주입 없는 경우)
class Product { constructor(name, price) { this.name = name; this.price = price; } } class Buyer { constructor(name) { this.name = name; this.product = new Product("컴퓨터", 1000); // 의존성이 없는 직접 생성 } purchase() { console.log(`${this.name}가 ${this.product.name}를 구매합니다.`); } }
의존성 주입을 적용한 경우
class Payment { constructor(amount) { this.amount = amount; } processPayment() { // 결제 로직 } } class Order { constructor(orderId, paymentInstance) { this.orderId = orderId; this.payment = paymentInstance; // 외부에서 의존성 주입 } placeOrder() { console.log(`주문번호 ${this.orderId}의 결제가 진행됩니다.`); this.payment.processPayment(); } } // 외부에서 Payment 인스턴스를 생성하여 의존성 주입 const paymentObj = new Payment(1000); const orderObj = new Order("12345", paymentObj); orderObj.placeOrder();
의존관계 역전 원칙(Inversion of Control)
: 의존관계 역전 원칙은 상위 수준의 모듈이 하위 수준의 모듈에 의존해서는 안 되며, 모든 모듈은 추상화에 의존해야 한다는 것을 말한다.
기존에는 하위 수준의 모듈이 상위 수준의 모듈에 의존하여 상위 수준의 모듈이 하위 수준의 모듈을 직접 생성하고 관리하는 방식으로 코드가 작성되었다. 하지만 이러한 방식은 코드의 유연성과 확장성을 제한한다.
의존관계 역전 원칙을 적용하면 상위 수준의 모듈이 하위 수준의 모듈에 의존하지 않고, 추상화된 인터페이스나 추상 클래스를 통해 의존성을 주입을 받게 된다. 이로써 하위 수준의 모듈의 변경에 상위 수준의 모듈이 영향을 받지 않도록 하며, 코드의 재사용성과 유지보수성을 향상 시킨다.
이러한 원칙과 패턴을 적절하게 활용하면 유연하고 확장 가능한 소프트웨어를 개발할 수 있다.