제어의 역전(IoC)과 의존성 주입(DI) 용어정리

hjkim·2022년 3월 6일
2

IoC와 DI는 혼동하기 쉬운 개념이다. 실제로, 이 둘을 동일하게 얘기하는 경우도 많다. IoC와 DI에 대한 개념을 정리해두자!

제어의 역전(IoC)

public class A {
	B b = new B();
    public void print() {
    	System.out.println(b.name);
    }
}

class A가 제대로 동작하기 위해서는 class B가 필요하다. class A는 능동적으로 자신이 사용할 오브젝트를 생성하고, 오브젝트 내의 메소드를 사용한다. 자신이 사용할 클래스를 결정하고, 언제 어떻게 오브젝트를 만들지에 대해 결정한다. 이는 사용하는 쪽에서 모든 종류의 작업을 제어하는 구조이다.

제어의 역전이란 이런 제어 흐름의 개념을 뒤집는 것이다. 제어의 역전에서는 오브젝트가 자신이 사용할 오브젝트를 스스로 선택하고 생성하지 않는다. 모든 제어의 권한을 자신이 아닌 다른 대상에게 위임하기 때문이다. 제어의 역전의 개념을 사용하게 되면 class A는 능동성을 잃고 수동적인 존재가 된다. 자신이 사용할 오브젝트들을 직접 생성하지 않고 다른 대상으로부터 공급받는 것이다.
이러한 제어의 역전 개념은 프레임워크만의 기술도 아니고 디자인 패턴에서도 발견할 수 있는 상당히 폭넓게 적용되는 프로그래밍 모델이다. IoC의 적용을 통해 얻을 수 있는 장점들은 아래와 같다.

  1. 작업을 구현하는 방식과 작업을 수행하는 방식을 분리한다.
  2. 모듈 제작 시, 모듈과 외부 프로그램의 결합에 대해 고민할 필요 없이 모듈 내부의 로직에만 집중할 수 있다.
  3. 다른 시스템이 어떻게 동작할지에 대해 고민할 필요 없이 미리 정해진 협약대로만 동작하게 하면 된다.
  4. 모듈을 바꾸어도 다른 시스템에 부작용을 일으키지 않는다.

의존성 주입(DI)

스프링이 제공하는 IoC 방식의 핵심을 짚어주는 용어이다. IoC가 너무 폭넓게 사용되는 용어여서 스프링 IoC 컨테이너라고만 했을 경우 스프링이 제공하는 기능의 특징을 명확하게 표현하지 못한다. 따라서 좀더 의도가 명확히 드러나도록 DI, 의존성 주입이라는 용어를 사용하게 되었다. 구체적인 의존 오브젝트와 그것을 사용할 주체, 보통 클라이언트라고 불리는 오브젝트를 런타임 시에 연결해주는 작업을 말한다.

위의 코드에서 B 클래스와 같은 레퍼런스를 외부로부터 제공받고 이를 통해 다른 오브젝트들과 동적으로 의존관계가 만들어지는 것, 즉 제 3의 존재가 있다는 것이 DI의 핵심이다. 스프링의 애플리케이션 컨텍스트, 빈 팩토리, IoC 컨테이너 등이 이러한 제 3의 존재라고 볼 수 있다.

  • 'A가 B에 의존하다'의 의미
    (= A가 B를 사용한다)
    (= B가 변하면 A에 영향을 미친다)
    (= A가 변하면 B는 영향을 받지 않는다)

[참조] https://medium.com/@jang.wangsu/di-inversion-of-control-container-%EB%9E%80-12ecd70ac7ea
[참조] 토비의 스프링 3.1

profile
피드백은 언제나 환영입니다! :)

0개의 댓글