의존성 주입이 뭔지 정의는 알겠는데 이게 있을 때와 없을 때가 뭐가 다른지는 잘 모르겠다. 그래서 이것도 나중에 보고도 알 수 있게 찾아봤다.
결론부터 말하면 의존성 주입이 없어도 다 처리할 순 있다. 다만 손이 더 많이 가고 그만큼 실수할 가능성이 높아지니까 의존성 주입을 통해서 처리하는 것이 좋다.
의존성 주입이 없을 때
class Car {
constructor() {
this.engine = new Engine(); // 직접 의존성 생성
}
start() {
this.engine.turnOn();
}
}
class Engine {
turnOn() {
console.log('Engine turned on!');
}
}
const car = new Car();
car.start();
의존성 주입이 있을 때
class Car {
constructor(engine) { // 의존성 주입
this.engine = engine;
}
start() {
this.engine.turnOn();
}
}
class Engine {
turnOn() {
console.log('Engine turned on!');
}
}
const engine = new Engine();
const car = new Car(engine); // 의존성 주입을 통해 Engine 인스턴스를 전달
car.start();
비슷해 보인다. 뭐가 다를까? 만약에 엔진을 하나만 사용하는 게 아니라 다른 엔진이 있다면
class ElectricEngine extends Engine {
turnOn() {
console.log('Electric engine turned on!');
}
}
const electricEngine = new ElectricEngine();
const electricCar = new Car(electricEngine);
electricCar.start();
의존성 주입이 있다면 이렇게 전달되는 객체만 바꿔주면 된다. 그리고 새로운 기능이 추가된다면
class Radio {
play() {
console.log('Radio is playing!');
}
}
class PremiumRadio {
play() {
console.log('Premium Radio with high quality sound is playing!');
}
}
class Car {
constructor(engine, radio) {
this.engine = engine;
this.radio = radio;
}
start() {
this.engine.turnOn();
this.radio.play();
}
}
const basicEngine = new Engine();
const premiumRadio = new PremiumRadio();
const premiumCar = new Car(basicEngine, premiumRadio);
premiumCar.start();
// 출력:
// Engine turned on!
// Premium Radio with high quality sound is playing!
이렇게 쉽게 바꿀 수 있다.
그래서 다시 정리하면 의존성 주입이 없어도 문제가 되진 않는다 코드 못 짜는 건 아니다. 하지만 의존성을 주입하면서 코드를 직접적으로 수정할 일이 줄어든다. 엔진 기능에서 전기 엔진이 추가되었을 때 의존성 주입이 없었다면 클래스 내에 엔진 로직을 지우고 전기 엔진으로 바꾸는 과정이 필요했을 것이다. 이렇게 원하는 결과를 만들 순 있지만 그 과정에서 실수가 생길 경우가 많다. 지금은 예시로 단순하게 표현되었지만 복잡한 코드들 사이에서 어떤 부분을 수정하고 복사해서 가져오고 하면서 문제가 발생하는 것을 줄여준다.
조금은 알겠으니까 이제 드는 생각은 이게 뭐라고 이해하는데 힘들었을까
클래스의 코드를 건들 필요 없이 매개변수만 바꿔주면 된다는 것인데 ...
'오늘 뭐했냐 > 개발에 대한 주저리' 카테고리의 다른 글
| 23.09.30 NestJS에서 의존성 주입 (0) | 2023.10.03 |
|---|---|
| 23.09.29 제어 역전 (Inversion of Control, IoC) (0) | 2023.10.02 |
| 23.09.27 모듈화(Modularization) (0) | 2023.09.27 |
| 23.09.26 의존성 주입(Dependency Injection, DI) (0) | 2023.09.26 |
| 23.09.25 실행 컨텍스트(Execution Context)(다시 정리) (0) | 2023.09.26 |