Application 코드를 작성할때, 특정 기능이 필요하면 Library를 호출하여 사용한다. 프로그램의 흐름을 제어아하는 주체가 Application code이다. Framework 기반의 개발에서는 Framework 자신이 흐름을 제어하는 주체가 되어, 필요할 때마다 Application 코드를 호출하여 사용한다.
컨테이너는 instance의 생명주기를 관리하며, 생성된 instance에게 추가적인 기능을 제공합니다. 예를 들어, Servlet을 실행해주는 WAS는 Servlet Contatiner를 가지고 있다고 말합니다. WAS는 Web browser로부터 Servlet URL에 해당하는 요청을 받으면, Servlet을 메모리에 올린 후 실행 합니다. 개발자가 Servlet Class를 작성했지만 실제로 메모리에 올리고 실행하는 것은 WAS가 가지고 있는 Servlet Container 입니다. Servlet Container는 동일한 Servlet에 해당하는 요청을 받으면, 또 메모리에 올리지 않고 기존에 메모리에 올라간 Servlet을 실행하여 그 결과를 Web browser에게 전달 합니다. Container는 보통 instance의 생명 주기를 관리하며, 생성된 instance들에게 추가적인 기능을 제공하는 것을 말합니다.
DI(Dependency Injection)
DI는 의존성 주입이라는 뜻을 가지고 있다. Class사이의 의존 관계를 Bean 설정 정보를 바탕으로 Container가 자동으로 연결 해 주는 것을 말한다. 개발자들은 제어를 담당할 필요 없이 Bean 설정 파일에 의존관계가 필요하다는 정보만 추가해주면 된다. Object reference를 Container로부터 주입 받아서, 실행 시에 동적으로 의존 관계가 생성된다. Container가 흐름의 주체가 되어서 Application code에 의존관계를 주입해주는 것이 된다. 이것을 *eInversion of Control** 이라 부른다.
Spring Framework에서 DI 적용 예 2가지
xml 파일을 이용한 설정
src/main 아래에 UserBean class 작성
Bean class의 몇가지 특성
기본 생성자를 가지고 있다.
필드는 private하게 선언한다.
getter, setter method를 가진다. getName(), setName() method를 name property라고 한다.
publicstaticvoidmain(String[] args){ ApplicationContext ac = new ClassPathXmlApplicationContext( "classpath:applicationContext.xml"); System.out.println("초기화 완료.");
@Configuration publicclassApplicationConfig{ @Bean public Car car(Engine e){ Car c = new Car(); c.setEngine(e); return c; }
@Bean public Engine engine(){ returnnew Engine(); } }
@Configuration 은 스프링 설정 클래스라는 의미를 가집니다. JavaConfig로 설정을 할 클래스 위에는 @Configuration가 붙어 있어야 합니다. ApplicationContext중에서 AnnotationConfigApplicationContext는 JavaConfig클래스를 읽어들여 IoC와 DI를 적용하게 됩니다. 이때 설정파일 중에 @Bean이 붙어 있는 메소드들을 AnnotationConfigApplicationContext는 자동으로 실행하여 그 결과로 리턴하는 객체들을 기본적으로 싱글턴으로 관리를 하게 됩니다.