(일반적인 경우)
프로그램의 흐름은 main() 메소드와 같이 프로그램이 시작되는 지점에서 다음에 사용할 오브젝트를 결정하고, 결정한 오브젝트를 생성하고, 만들어진 오브젝트에 있는 메소드를 호출하고, 그 오브젝트 메소드 안에서 다음에 사용할 것을 결정하여 호출하는.... 식의 작업의 반복이다.
각 오브젝트는 프로그램 흐름을 결정하거나 사용할 오브젝트 구성 작업에 능동적으로 참여한다. (오브젝트를 직접 생성하고, 사용할 구현 클래스를 자신이 결정하고, 필요 시점에 오브젝트를 생성하고...) 즉, 모든 오브젝트가 능동적으로 자신이 사용할 클래스를 결정하고, 언제 어떻게 그 오브젝트를 만들지를 스스로 관장한다. 모든 종류의 작업을 사용자 쪽에서 제어하는 구조다.
제어의 역전이란 이런 제어의 흐름을 거꾸로 뒤집는 것이다.
제어의 역전에서는 오브젝트가 자신이 사용할 오브젝트를 스스로 선택하지 않는다. 생성하지도 않는다. 자신도 어떻게 만들어지고 어디서 어떻게 사용되는지 알 수 없다. 모든 제어 권한을 다른 대상에 위임하기 때문이다.
서블릿도 사실 제어의 역전.
서블릿에 대한 제어 권한을 가진 컨테이너가 적절한 시점에서 서블릿 클래스의 오브젝트를 만들고 그 안의 메소드를 호출한다. 서블릿, JSP, EJB 처럼 컨테이너 안에서 동작하는 구조는 모두 제어의 역전 개념이 적용되어 있다.
프레임워크도 제어의 역전 개념이 적용된 대표적인 기술이다.
라이브러리와 프레임워크는 다르다. 라이브러리를 사용하는 애플리케이션 코드는 애플리케이션 흐름을 직접 제어한다. 반면에 프레임워크는 애플리케이션 코드가 프레임워크에 의해 사용된다. 프레임워크 위에 개발한 클래스를 등록해두고, 프레임워크가 흐름을 주도하는 중에 개발자가 만든 애플리케이션 코드를 사용하는 것이다.
(관심을 분리하고... 책임을 나누고... 유연하게 확장 가능한 구조로 만들면 -> IoC가 적용된다.)
제어의 역전에서는 애플리케이션 컴포넌트의 생성과 관계 설정, 사용, 생명 주기 관리 등을 관장하는 존재가 필요하다. (프레임워크 or 컨테이너)
스프링의 제어의 역전
스프링의 핵심은 '빈 팩토리(=애플리케이션 컨텍스트)
스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트(오브젝트 단위의 애플리케이션 컴포넌트) = 빈(bean)
스프링 빈은 스프링 컨테이너가 생성과 관계 설정, 사용 등을 제어해주는 제어의 역전이 적용된 오브젝트를 가리킨다.
스프링에서는 빈 생성과 관계 설정 등 제어를 담당하는 IoC 오브젝트를 빈 팩토리라고 부른다. but 주로 사용하는건 빈 팩토리를 확장한 application context. 애플리케이션 컨텍스트는 별도의 정보를 참고하여 빈(오브젝트)의 생성, 관계 설정 등의 제어 작업을 총괄한다.
@Configuration
= 이것은 빈 팩토리를 위한 오브젝트 설정을 담당하는 클래스다.
@Bean
-> 오브젝트를 만들어주는 메소드에 붙여준다.
예)
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DaoFactory {
@Bean
public UserDao() {
return new UserDao(connectionMaker());
}
@Bean
public ConnectionMaker connectionMaker() {
return new DConnectionMaker();
}
}
스프링의 애플리케이션 컨텍스트 = IoC 컨테이너 = 스프링 컨테이너 = 빈 팩토리
-> ApplicationContext 인터페이스를 구현하는데 ApplicationContext는 BeanFactory 인터페이스를 상속한다.
애플리케이션 컨텍스트는 애플리케이션에서 IoC를 적용해서 관리할 모든 오브젝트에 대한 생성과 관계 설정을 담당한다. but 직접 오브젝트를 생성하고 관계를 맺어주는 코드는 없고, 생성정보와 연관관계 정보를 별도의 설정정보를 통해 얻는다. 애플리케이션 컨텍스트를 사용하는 이유는 범용적이고 유연한 방법으로 IoC 기능을 확장하기 위해서다. 애플리케이션 컨텍스트를 사용했을 때 얻을 수 있는 장점은 다음과 같다.
- 클라이언트는 구체적인 팩토리 클래스를 알 필요가 없다.
- 종합 IoC 서비스를 제공해준다; 오브젝트가 만들어지는 방식, 시점과 전략을 다르게 가져갈 수도 있고, 이에 부가적으로 자동생성, 오브젝트에 대한 후처리, 정보의 조합, 설정 방식의 다변화, 인터셉팅 등 오브젝트를 효과적으로 활용할 수 있는 다양한 기능을 제공한다. + 빈이 사용할 수 있는 기반기술 서비스나 외부 시스템과의 연동 등을 컨테이너 차원에서 제공해주기도 한다.
- 빈을 검색하는 다양한 방법을 제공한다.
'Spring > 토비의 스프링 3.0' 카테고리의 다른 글
1장. 오브젝트와 의존관계 (1) (0) | 2023.04.10 |
---|