IOC라는 약자로 많이 사용되는 제어의 역전 (Inversion of Contol) 이라는 용어가 있다.
스프링을 통해 많이 알려진 용어이지만, 이 제어의 역전은 상당히 오래전부터 있었던 개념이다.
제어의 역전이란 간단히 프로그램의 제어 흐름 구조가 뒤바뀌는 것이라고 설명할 수 있다.
일반적으로 프로그램의 흐름을 간단히 요약하면 다음과 같다.
- main() 메소드와 같이 프로그램이 시작되는 지점에서 시작
- 사용할 오브젝트를 결정하고
- 결정한 오브젝트를 생성한다.
- 만들어진 오브젝트의 메소드를 호출하고
- 메소드 안에서 다음에 사용할 것을 결정하고 호출하는 식의 작업이 반복된다.
즉 모든 오브젝트가 능동적으로 자신이 사용할 클래스를 결정하고, 언제 어떻게
그 오브젝트를 만들지를 스스로 관장한다.
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 인터페이스를 구현한 오브젝트를 가리키기도 하는데,
애플리케이션 컨텍스트 오브젝트는 하나의 애플리케이션에서 보통 여러 개가 만들어져 사용된다.
이를 통틀어서 스프링 컨테이너라고 부를 수 있다.
"컨테이너"라는 말을 떼고 스프링이라 부를 때도, 바로 이 스프링 컨테이너를 가리키는 것일 수 있다.
예를들어 "스프링에 빈을 등록하고~ " 라는 식으로 말하는 경우에
스프링이라는 말은 "스프링 컨테이너" 또는 애플리케이션 컨텍스트를 가리키는 말이다.
'Spring > 용어정리' 카테고리의 다른 글
의존관계 검색 (DL Dependency Lookup) (0) | 2022.02.18 |
---|---|
의존관계 주입(DI Dependency Injection) (0) | 2022.02.17 |
개방 폐쇄 원칙 (OCP, Open-colosed Principle) (0) | 2022.02.16 |
댓글