제어의역전 IOC
- Coding/Spring
- 2018. 3. 17.
일반적은 프로그램의 흐름
1) mian() 메소드와 같이 프로그램이 시작되는 지점에서 다음에 사용할 오브젝트를 결정한다.
2) 결정한 오브젝트를 생성한다.
3) 만들어진 오브젝트에 있는 메소드를 호출한다.
4) 그 오브젝트 메소드 안에서 다음에 사용할 것을 결정하고 호출한다.
이 4가지 단계가 반복적으로 일어난다. 이런 프로그램 구조에서 각 오브젝트는 프로그램 흐름을 결정하거나 사용할 오브젝트를 구성하는 작업에 능동적으로 참여한다. 모든 오브젝트가 능동적으로 자신이 사용할 클래스를 결정하고, 언제 어떻게 그 오브젝트를 만들지를 스스로 결정한다. 모든 종류의 작업을 사용하는 쪽에서 제어하는 구조이다.
제어의 역전
제어의 역전이란, 위에서 설명한 일반적인 프로그램의 제어 흐름 구조가 뒤바뀌는 것이라고 설명할 수 있다. 제어의 역전에서는 오브젝트가 자신이 사용할 오브젝트를 스스로 선택하지도, 생성하지도 않는다. 또 자신도 어떻게 만들어지고 어디서 사용되는지 알 수 없다. 모든 제어 권한을 자신이 아닌 다른 대상에게 위임하기 때문이다. 프로젝트의 시작을 담당하는 main()과 같은 엔트리 포인트를 제외하면 모든 오브젝트는 이렇게 위임받은 제어 권한을 갖는 특별한 오브젝트에 의해 결정되고 만들어진다.
예시) 서블릿
일반적인 자바 프로그램은 main() 메소드에서 시작해서 개발자가 미리 정한 순서에 따라 오브젝트가 생성되고 실행된다. 그런데 서블릿을 개발해서 서버에 배포할 수는 있지만, 그 실행을 개발자가 직접 제어하는 것은 아니다. 서블릿 안에 main() 메소드가 있어서 직접 실행시킬 수 있는 것도 아니다. 대신 서블릿에 대한 제어 권한을 가진 컨테이너가 적절한 시점에 서블릿 클래스의 오브젝트를 만들고 그 안의 메소드를 호출한다. 이러한 간단한 방식도 제어의 역전 개념이 적용되어있다.
스프링의 IoC
1) 빈 (bean) : 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트이다. 자바빈 또는 엔터프라이즈 자바빈(EJB)에서 말하는 빈과 비슷한 오브젝트 단위의 어플리케이션 컴포넌트이다.
2) 스프링 빈 : 스프링 컨테이너가 생성과 관계 설정, 사용 등을 제어해주는 제어의 역전이 적용된 오브젝트이다.
3) 빈 팩토리 : 빈의 생성과 관계 설정 같은 제어를 담당하는 IoC 오브젝트이다. 이를 더 확장한 것이 주로 사용하는 애플리케이션 컨텍스트이다.
4) 어플리케이션 컨텍스트 : IoC 방식을 따라 만들어진 일종의 빈 팩토리이다. 빈 팩토리와 같은 용어로 사용되고, 두가지가 동일하다고 생각하면 된다. 별도의 정보를 참고해서 빈의 생성, 관계 설정 등의 제어 작업을 총괄한다.
빈 팩토리라고 말할때는 빈을 생성하고 관계를 설정하는 IoC의 기본 기능에 초점을 맞춘 것이고, 애플리케이션 컨텍스트라고 말할때는 애플리케이션 전반에 걸쳐 모든 구성요소의 제어 작업을 담당하는 IoC 엔진이라는 의미가 좀 더 부각된다.
@Configuration - @Bean
스프링이 빈 팩토리를 위한 오브젝트 설정을 담당하는 클래스라고 인식할 수 있도록 @Configuration 어노테이션을 추가한다. 그리고, 오브젝트를 만들어주는 메소드에 @Bean 어노테이션을 붙여준다.
애플리케이션 컨텍스트의 동작방식
오브젝트 팩토리에 대응되는 것이 스프링의 애플리케이션 컨텍스트다. 스프링에서는 이 애플리케이션 컨텍스트를 IoC 컨테이너라고도 한다.
애플리케이션 컨텍스트는 ApplicationContext 인터페이스를 구현하는데, ApplicationContext는 빈 팩토리가 구현하는 BeanFactory 인터페이스를 상속했다. 따라서 애플리케이션 컨텍스트는 일종의 빈 팩토리라고 할 수 있다.
애플리케이션 컨텍스트의 장점
1) 클라이언트는 구체적인 팩토리 클래스를 알 필요가 없다.
클라이언트는 필요한 오브젝트를 가져오려면 어떤 팩토리 클래스를 사용해야할지 알아야하고, 필요할때마다 팩토리 오브젝트를 생성해야하는 번거로움이 있다. 애플리케이션 컨텍스트를 사용하면 팩토리가 아무리 많아져도 이를 알 필요가 없고, 일관된 방식으로 원하는 오브젝트를 가져올 수 있다.
2) 애플리케이션 컨텍스트는 종합 IoC 서비스를 제공해준다.
오브젝트 생성, 다른 오브젝트와의 관계 설정, 오브젝트가 만들어지는 방식과 시점과 전략을 다르게 가져갈 수 있고, 자동생성, 오브젝트에 대한 후처리, 정보의 조합, 설정 방식의 다변화, 인터셉팅 등 다양한 기능을 제공한다. 빈이 사용할 수 있는 기반 기술 서비스, 외부 시스템과의 연동을 제공해준다.
3) 애플리케이션 컨텍스트는 빈을 검색하는 다양한 방법을 제공한다.
애플리케이션 컨텍스트의 getBean() 메소드는 빈의 이름을 이용해 빈을 찾아준다. 타입만으로 빈을 검색하거나 특별한 어노테이션 설정이 되어 있는 빈을 찾을 수 있다.
'Coding > Spring' 카테고리의 다른 글
필드주입과 생성자주입의 차이 (0) | 2019.02.15 |
---|---|
싱글톤 레지스트리 (0) | 2018.05.08 |
코드 리팩토링 (0) | 2018.05.03 |
코드의 응집도와 결합도 (0) | 2018.05.03 |
의존관계 주입 DI (1) | 2018.03.17 |