IoC (Inversion of Control)
제어의 역전이라는 뜻으로 예시를 들어보겠다.
class Car {
GeneralTire tire = new GeneralTire();
}
class GeneralTire {
public void run() {
System.out.println("일반 타이어가 굴러갑니다.");
}
}
자동차에 일반타이어를 넣어서 굴리는 예시다.
근데 눈길에 강력한 스노우타이어가 나와서 교체하려고 하면 코드가 이렇게 된다.
class Car {
SnowTire tire = new SnowTire();
}
class GeneralTire {
public void run() {
System.out.println("일반 타이어가 굴러갑니다.");
}
}
class SnowTire {
public void run() {
System.out.println("스노우 타이어가 굴러갑니다.");
}
}
스노우 타이어를 끼우기 위해서는 Car의 구현부의 변경이 필수적이다.
이렇게되면 변경에 유연하지 못하므로 좀 더 유연하게 바꿔야한다.
Tire라는 인터페이스를 만들어서 저 문제를 해결할 수 있다.
class Car {
Tire tire;
public Car(Tire tire) {
this.tire = tire;
}
}
interface Tire {
public void run();
}
class GeneralTire implements Tire{
@Override
public void run() {
System.out.println("일반 타이어가 굴러갑니다.");
}
}
class SnowTire implements Tire{
@Override
public void run() {
System.out.println("스노우 타이어가 굴러갑니다.");
}
}
Tire라는 인터페이스를 만들고 run메서드를 정의해서 구현체들에게 완성하도록 한다.
그리고 Car 클래스는 Tire를 참조변수로 선언하고 생성자를 통해 인스턴스가 주입된다.
그러면 Car클래스를 변경하지 않고도 주입하는 인스턴스의 변경만으로 타이어 교체가 가능해진다.
위의 예시를 보면 객체를 제어하는 제어자가 변경된 것을 알수있다.
Car클래스가 Tire 객체를 생성하면서 동시에 제어했었는데 외부 주입으로 변경되면서 제어자의 역할을 잃어버렸다.
이렇게 제어자가 변경되는 것을 IoC라고 하고 스프링에서 이것을 가능하게 해주는 것이 DI다.
스프링 컨테이너에 Bean으로 등록이 되면 자동으로 등록된 Bean객체를 DI해줘서 IoC를 완성하는 것이다.
'항해99 > TIL | WIL' 카테고리의 다른 글
| 2023.02.13 (36일) (0) | 2023.02.14 |
|---|---|
| 2023.02.12 (35일) (0) | 2023.02.13 |
| 2023.02.11 (34일) (0) | 2023.02.12 |
| 2023.02.10 (33일) (0) | 2023.02.10 |
| 2023.02.10 (32일) (0) | 2023.02.10 |