제어 역전 (IoC, Inversion of Control)
제어 역전은 사용자가 작성한 프로그램이 다른 라이브러리 혹은 프레임워크의 제어를 받는 패턴을 의미한다. 일반적으로 작성한 프로그램이 외부 API나 라이브러리를 호출하지만, 제어 역전 패턴에선, 사용자가 작성한 프로그램이 다른 라이브러리 혹은 프레임워크의 제어를 받게 된다.
대표적으로 스프링 프레임워크가 있다. 제어 역전과 의존성 주입(Dependency Injection) 패턴을 이용하여 사용자가 작성한 프로그램을 인스턴스화하고 ApplicationContext에서 인스턴스들을 필요한 곳에 주입한다.
스프링 프레임워크는 개발자가 MVC 패턴 코드로 작성하게끔 강제하고, 작성한 프로그램은 인스턴스를 생성하지 않는다. 프레임워크가 생성하고 관리하기 때문이다.
Controller
, Service
, Repository
등의 클래스를 new
키워드로 생성한 적이 있는지 생각해보자. 보통 어노테이션을 클래스 선언부 상단에 추가하고 어노테이션 드리븐(annotation-driven) 설정으로 모든 클래스를 인스턴스화 한다.
목적
위키피디아의 제어 역전 목적
- 작업을 구현하는 방식과 작업 수행 자체를 분리한다.
- 모듈을 제작할 때, 모듈과 외부 프로그램의 결합에 대해 고민할 필요 없이 모듈의 목적에 집중할 수 있다.
- 다른 시스템이 어떻게 동작할지에 대해 고민할 필요 없이, 미리 정해진 협약대로만 동작하게 하면 된다.
- 모듈을 바꾸어도 다른 시스템에 부작용을 일으키지 않는다.