제어 반전

제어 반전, 제어의 반전, 역제어는 프로그래머가 작성한 프로그램이 재사용 라이브러리의 흐름 제어를 받게 되는 소프트웨어 디자인 패턴을 말한다. 줄여서 IoC(Inversion of Control)이라고 부른다.
전통적인 프로그래밍에서 흐름은 프로그래머가 작성한 프로그램이 외부 라이브러리의 코드를 호출해 이용한다. 하지만 제어 반전이 적용된 구조에서는 외부 라이브러리의 코드가 프로그래머가 작성한 코드를 호출한다. 설계 목적상 제어 반전의 목적은 다음과 같다:
 작업을 구현하는 방식과 작업 수행 자체를 분리한다.
 모듈을 제작할 때, 모듈과 외부 프로그램의 결합에 대해 고민할 필요 없이 모듈의 목적에 집중할 수 있다.
 다른 시스템이 어떻게 동작할지에 대해 고민할 필요 없이, 미리 정해진 협약대로만 동작하게 하면 된다.
 모듈을 바꾸어도 다른 시스템에 부작용을 일으키지 않는다.

예 
public class ServerFacade
{
  public Object respondToRequest(Object pRequest)
  {
    if(businessLayer.validateRequest(pRequest))
    {
      DAO.getData(pRequest);
      return Aspect.convertData(pRequest);
    }

    return null;
  }
}
위의 코드를 통해 IoC가 어떻게 이용되는지를 알 수 있다. 위에서 serverFacade에서 DAO 객체를 이용할 때 businessLayer객체가 pRequest를 검증하는 방법과 Aspect 객체가 DAO에서 처리한 pRequest를 변환하는 방법이 미리 정해져 있다. 이와 같이 정해진 방법들이 유효할 때도 있겠지만, 이 방법들을 정해 두면 serverFacade 클래스는 DAO와 결합되게 된다. 제어 반전 개념으로 다음과 같이 응용 프로그램을 설계하면 제어권을 완전히 DAO 객체로 이양하게 된다.

public class ServerFacade
{
  public Object respondToRequest(Object pRequest, DAO dao)
  {
    return dao.getData(pRequest);
  }
}
이 예를 보면, respondToRequest라는 메서드가 인자들을 다루는 방식을 통해 IoC가 적용되었는지 여부를 확인할 수 있다.

같이 보기 
 소프트웨어 디자인 패턴

외부 링크 

 Inversion of Control explanation and implementation example

소프트웨어 구조
소프트웨어 디자인 패턴
컴포넌트 기반 소프트웨어 공학
아키텍처 패턴