본문 바로가기

Spring

Ioc/DI 제어의 역전/의존성 주입

제어의 역행(Inversion of Control, IoC) – 대신 해줌

 ‘제어의 역전’ 또는 ‘역 제어’라는 뜻으로 객체에 대한 제어권이 바뀐 것을 의미한다. 기존의 개발자들이 New 연산자, 인터페이스 호출, 팩토리 호출 방식으로 객체의 인스턴스를 생성함으로 인스턴스 생성 방법에 대한 제어권을 개발자들이 가지고 있었다. IoC란 인스턴스 생성의 제어를 개발자 본인이 아닌 다른 누군가에게 해주는 컨테이너이다. 어떤 모듈이 제어를 가진다는 것은 ‘어떤 모듈을 사용할 것인지’, ‘모듈의 함수는 언제 호출할 것인지’ 등을 스스로 결정한다는 것을 의미한다. 즉, IoC란 인스턴스의 생성부터 소멸까지의 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너가 대신해준다는 뜻이다.

의존성 주입(Dependency Injection, DI) – 미리 찜해 놓음

 DI란 모듈 간의 의존성을 모듈의 외부(컨테이너)에서 주입시켜주는 기능으로 IoC의 한 종류이다. 런 타임 시 사용하게 될 각 모듈 간의 의존 관계를 컨테이너가 빈 설정 정보를 바탕으로 자동적으로 연결해 주는 것을 의미한다.

 

 

예제 코드

 

public class Car {
    private Tire tire;
    Car() {
        tire = new KoreaTire();
        // tire = new AmericaTire();
    }

    public String getTireBrand() {
        return "장착된 타이어: " + tire.getBrand();
    }
}

 

=> 자동차가 생산될 때 타이어까지 고려하여 생산하여야 한다.

자동차는 타이어에 의존하게 됨.

 


스프링 없이 의존성 주입하기

1. 생성자를 통한 의존성 주입

Tire tire = new KoreaTire();
Car car = new Car(tire);	// 생성자를 통한 의존성 주입

 

자동차가 생산될 때 어떤 타이어를 생산해서 장착할까를 자동차가 스스로 고민하지 않고,

운전자가 차량을 생산할 때 운전자가 어떤 타이어를 장착할까를 고민하게 하는 것이다. 

자동차는 어떤 타이어를 장착할까를 더는 고민하지 않아도 된다.

 

문제점 : 자동차를 생산할 때 한번 타이어를 장착하면 더 이상 타이어를 교체 장착할 방법이 없다는 문제가 생긴다. 

 

2. 속성을 통한 의존성 주입

Tire tire = new KoreaTire();

Car car = new Car();

car.setTire(tire);		// 속성을 통한 의존성주입

스프링을 통한 의존성 주입

public class Car {

    @Autowired
    Tire tire;

    public String getTireBrand() {
        return "장착된 타이어: " + tire.getBrand();    
    }

}

 

Bean으로 등록된 자동차와 타이어는 컨테이너 의해 자동 생성되며

필요한 부분에 자동으로 주입시켜준다. 

 

의존성을 직접 주입시키는 것이 아니라 컨테이너가 객체를 관리하며 의존성을 주입시켜주는 것을

제어의 역전이라고 한다.

'Spring' 카테고리의 다른 글

@Async 사용법  (0) 2021.09.15
MapStruct 사용법  (0) 2021.09.15
MVC패턴과 동작방식  (0) 2020.11.18