IoC
1.Bean과 Spring Container
Bean은 Spring Container가 관리하는 객체다. Spring container는 Bean을 저장하는 저장소이며 Bean을 저장, 관리(생성,소멸,연결) 한다.
- BeanFactory : Bean의 기본기능(생성, 연결…)을 정의
- ApplicationContext : BeanFactory를 확장하여 기능을 추가 정의. Spring Container와 유사함.
2.ApplicationContext
ApplicationContext는 다양한 구현체를 지원한다. 모든 구현체를 아는 것은 힘들기 때문에 대표적인 4가지 구현체를 살펴본다. 과거에는 XML의 구현체를 많이 사용했지만, 현재는 자바코드를 많이 사용한다.
# 3.IoC(Inversion of Control)
IoC(Inversion of Control)은 제어의 역전을 의미한다. 즉 제어의 흐름을 전통적인 방식에서 뒤바꾸는 것을 의미한다. 전통적인 방식의 흐름에서는 왼쪽 그림과 같이 사용자 코드 -> Framework코드로 진행된다.(Car객체에서 TurboEngine 객체를 호출) 하지만 제어의 역전(IoC)에서는 Framework코드 -> 사용자 코드로 흐름이 바뀐다. (engine 객체가 SuperEngine을 호출) 이렇듯 IOC는 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리한다.
그렇다면 왜 전통적인 방식이 아닌 역제어 방식을 사용할까? 그 이유는 변하는 코드와 변하지 않는 코드를 분리하기 위함이다. 왼쪽 그림의 코드를 보면 TurboEngine을 제외한 코드들은 모두 잘 변하지 않는 코드들이다. 이런 문제를 해결하기 위해 IoC를 활용하면 오른쪽 그림과 같이 중복된 코드를 간결하게 표현할 수 있다.
위 그림 코드를 보면 Framework코드는 모두 변하지 않는 코드로 구성 되어있다. 자주 변하는 코드는 사용자 코드에서 Drive의 매개변수로 설정했다. 그래서 만약 turboDrive에 SoniceEngine로 매개변수를 바꿔야 한다면, 매개변수의 코드만 바꿔주면 된다. 매개변수만 바꿔줌으로써 코드가 더욱 간결해지고 유지보수가 한결 쉬워졌다.
IoC 기법을 활용한 대표적인 예는 테스트 라이브러리인 JUnit을 통해 프로그램을 테스트하는 경우를 이야기 할 수 있다. 테스트의 대상이 되는 프로그램은 테스트 기능을 수행하지 않는다. 대신 테스트 라이브러리인 JUnit에게 제어권을 넘겨 테스트 기능을 수행해 제어한다.
또 다른 예시는 위의에서 살펴본 Spring의 Library들이다. 개발자가 코드를 짤 때 Spring Library를 활용한다. 하지만 우리가 스프링에 있는 다양한 기능을 직접 코딩하진않는다. 외부에 있는 Spring Library에 대한 코드를 활용할 뿐이다.
출처
스프링의 정석 : 남궁성과 끝까지 간다(패스트 캠퍼스 강좌)
Comments