본문 바로가기
Spring/용어정리

제어의 역전(IOC, Inversion of Control)

by 신지형 2022. 2. 17.

IOC라는 약자로 많이 사용되는 제어의 역전 (Inversion of Contol) 이라는 용어가 있다.

스프링을 통해 많이 알려진 용어이지만, 이 제어의 역전은 상당히 오래전부터 있었던 개념이다.

 

제어의 역전이란 간단히 프로그램의 제어 흐름 구조가 뒤바뀌는 것이라고 설명할 수 있다.

일반적으로 프로그램의 흐름을 간단히 요약하면 다음과 같다.

  1. main() 메소드와 같이 프로그램이 시작되는 지점에서 시작
  2. 사용할 오브젝트를 결정하고
  3. 결정한 오브젝트를 생성한다.
  4. 만들어진 오브젝트의 메소드를 호출하고
  5. 메소드 안에서 다음에 사용할 것을 결정하고 호출하는 식의 작업이 반복된다.

즉 모든 오브젝트가 능동적으로 자신이 사용할 클래스를 결정하고, 언제 어떻게 

그 오브젝트를 만들지를 스스로 관장한다.

public class Worker {

  private Task task;
  private TodoService todoService;
  
  public Worker() {
    this.task = new SimpleTask();
    this.todoService = new SimpleService();
  }
  
  public void run() {
    // something todo...
  }

  public static void main(String[] args) {
    new Worker().run();
  }

}

모든 종류의 작업을 사용하는 쪽에서 제어하는 구조

 

 


 

제어의 역전이란 이런 제어 흐름의 개념을 거꾸로 뒤집는 것이다.

제어의 역전에서는 오브젝트가 자신이 사용할 오브젝트를 스스로 선택하지 않거니와,

생성하지도 않는다.

 

또 자신도 어떻게 만들어지고 어디서 사용되는지를 알 수 없다.

모든 제어 권한을 자신이 아닌 다른 대상에게 위임하기 때문이다.

프로그램의 시작을 담당하는 main() 메소드와 같은 엔트리 포인트를 제외하면 모든 오브젝트는

이렇게 위임받는 제어권한을 갖는 특별한 오브젝트에 의해 결정되고 만들어진다.

 

[프레임워크]

  제어의 역전 개념이 적용된 대표적인 기술.

  프레임워크는 라이브러리의 다른 이름이 아니다.

    미리 만들어둔 반제품이나, 확장해서 사용할 수 있도록 준비된 추상 라이브러리의 집합이 아니다.

    프레임워크와 라이브러리의 결정적 차이점은 바로 제어의 역전

  • 라이브러를 사용하는 애플리케이션 코드는 애플리케이션 흐름을 직접 제어한다.
  • 동작하는 중에 필요한 기능일 있을 때, 능동적으로 라이브러리를 사용
  • 프레임워크는 거꾸로 애플리케이션 코드가 프레임워크에 의해 사용된다.
  • 프레임워크 위에 개발한 클래스를 등록하고, 프레임워크가 흐름을 주도하는 중에
    개발자가 만든 애플리케이션 코드를 사용하도록 만드는 방식
  • 따라서 툴킷, 엔진, 라이브러리를 프레임워크라고 부르는것은 잘못된 것

 

스프링은 제어의 역전을 위해 애플리케이션 컴포넌트의 생성, 관계설정, 사용, 생명주기를 관장하는

빈 팩토리 BeanFactory 가 존재한다.

일반적으로는 BeanFactory를 확장한 애플리케이션 컨텍스트(application context)를 주로 사용한다.

용어적 측면에서

  • BeanFactory는 Bean을 생성하고 관계를 설정하는 IoC의 기본 기능에 초점
  • ApplicationContext는 애플리케이션 전반에 걸쳐 모든 구성요소의 제어 작업을 담당하는 IoC 엔진

 

 

빈 (Bean)

빈 또는 빈 오브젝트는 스프링이 IoC 방식으로 관리하는 오브젝트라는 뜻.

관리되는 오브젝트 (managed object)라고 부르기도 한다.

스프링이 직접 생성과 제어를 담당하는 오브젝트만을 빈이라고 부른다 ( 라이크 사이클 제어 )

 

빈 팩토리 (Bean Factory)

스프링의 IoC를 담당하는 핵심 컨테이너

빈을 등록, 생성, 조회, 그 외 부가적인 빈을 관리하는 기능을 담당

보통은 이 빈 팩토리를 바로 사용하지 않고 이를 확장한 애플리케이션 컨텍스트를 이용한다.

이 인터페이스에 getBean()과 같은 메소드가 정의되어 있다.

 

애플리케이션 컨텍스츠 (Application Context)

빈 팩토리를 확장한 IoC 컨테이너.

빈을 등록하고 관리하는 기본적인 기능은 빈 팩토리와 동일하다.

여기에 스프링이 제공하는 각종 부가 서비스를 추가로 제공

빈 팩토리라고 부를 때는 주로 빈의 생성과 제어 관점에서 이야기하는 것이고,

애플리케이션 컨텍스트라고 할 때는 스프링이 제공하는 애플리케이션 지원 기능을

모두 포함해서 이야기하는 것

ApplicationContext는 BeanFactory를 상속한다.

 

설정정보/설정 메타정보 ( configuration metadata )

스프링의 설정정보란 애플리케이션 컨텍스트 또는 빈 팩토리가 IoC를 적용하기 위해 사용하는 메타정보

IoC 컨테이너에 의해 관리되는 애플리케이션 오브젝트를 생성하고 구성할 때 사용된다.

 

컨테이너 (container) 또는 IoC 컨테이너

IoC 방식으로 빈을 관리한다는 의미에서 애플리케이션 컨텍스트나 빈 팩토리를

컨테이너 또는 IoC 컨테이너라고도 한다.

컨테이너라는 말 자체가 IoC의 개념을 담고 있기 때문에 이름이긴 "애플리케이션 컨텍스트" 대신에

스프링 컨테이너라고 부르는 걸 선호하는 사람들도 있다.

애플리케이션 컨텍스트는 그 자체로 ApplicationContext 인터페이스를 구현한 오브젝트를 가리키기도 하는데,

애플리케이션 컨텍스트 오브젝트는 하나의 애플리케이션에서 보통 여러 개가 만들어져 사용된다.

이를 통틀어서 스프링 컨테이너라고 부를 수 있다.

"컨테이너"라는 말을 떼고 스프링이라 부를 때도, 바로 이 스프링 컨테이너를 가리키는 것일 수 있다.

예를들어 "스프링에 빈을 등록하고~ " 라는 식으로 말하는 경우에

스프링이라는 말은 "스프링 컨테이너" 또는 애플리케이션 컨텍스트를 가리키는 말이다.

 

 

댓글