'의존성 주입' 이란? - (DI: Dependency Injection)
의존성 주입(DI)이란 어떤 한 객체가 의존 관계인 다른 객체를 외부로부터 주입받는 것이다.
즉, 객체가 자신이 의존하고 있는 객체를 직접 생성하지 않고, 외부로부터 주입 받음으로써 객체간의 결합도를 낮추고 유연성을 높이는 방법이다.
아래 예시를 보며 좀 더 정리해보자.
여기 Car라는 객체가 있다.
Car의 생성자를 보면 Engine이라는 객체를 필요로하고 있다. 따라서 현재 Car와 Engine은 의존 관계이다.
(여기서 Engine은 인터페이스다)
public class Car {
...
public Car(Engine engine) {
this.engine = engine;
}
...
}
하지만 Car는 Car 내부에 Engine을 생성하지 않는다.
대신 외부(여기서는 Main)에서 Engine을 구현하는 객체인 GasEngine을 생성하고, 주입받는다.
(Engine이 인터페이스라 구현 객체GasEngine를 생성해야한다.)
public class Main {
public static void main(String[] args) {
GasEngine gasEngine = new GasEngine();
Car gasCar = new Car(gasEngine); // 의존성 주입!
...
}
}
결과적으로 Car는 의존 관계있던 Engine을 외부의 Main 으로부터 '주입' 받았다.
즉, 한 객체가 의존하고있는 또 다른 객체를 외부로부터 주입 받은 것. 이것이 바로 '의존성 주입'이다.
'제어의 역전' 이란? - (IoC: Inversion of Control)
'제어의 역전'은 프로그램 실행 흐름의 제어권을 제 3의 주체(외부)로 넘겨주는 것이다.
즉, 객체생성, 의존성 관리를 외부에서 담당하게 함으로써 객체간의 결합도를 낮추는 설계원칙이다.
[정리]
1. 객체 생성에 대한 책임을 외부로 전가
2. 어떤 객체를 주입해 줄지에 대한 책임을 외부로 전가
아래 코드의 ElectricEngine과 GasEngine은 Car와 의존관계인 Engine 인터페이스를 구현하고 있다.
ElectricEngine과 GasEngine 객체는 외부(Main)에서 생성하고 있다.
또한 Car 객체에 ElectricEngine을 주입할지, GasEngine을 주입할지 책임 역시 Main이 가지고 있다.
public class Main {
public static void main(String[] args) {
ElectricEngine electricEngine = new ElectricEngine();
GasEngine gasEngine = new GasEngine();
Car electricCar = new Car(electricEngine);
Car gasCar = new Car(gasEngine);
electricCar.drive();
gasCar.drive();
}
}
사실, ElectricEngine과 GasEngine 모두 Car 내부에서 생성할 수 있다.
그럼에도 불구하고 '제어의 역전'을 적용하는 이유는 이후에 Engine을 implement하는 새로운 객체가 생기거나 없어지더라도 기존 코드를 최소한으로 수정하거나, 수정하지 않아도 되기 때문이다.
이 외에도 코드의 가독성을 높이거나, 중복을 줄이는 등 다양한 이점이 있다.
'TIL > JAVA' 카테고리의 다른 글
[TIL] ENUM에 대해 알아보자 (0) | 2025.01.03 |
---|---|
[TIL] Stream을 사용하는 이유, 특징 (1) | 2024.11.28 |
[TIL] 람다식 (with. 익명 클래스, 익명 함수) (0) | 2024.11.27 |
[TIL] Comparator와 Comparable (0) | 2024.11.25 |
[TIL] 생긴게 똑같으면 같은거 아닌가요?🤔 (동일성 vs 동등성) (1) | 2024.11.21 |