Spring IoC/DI 컨테이너

oyeon·2021년 1월 14일
0

컨테이너(Container)

  • 컨테이너는 인스턴스의 생명주기를 관리한다.
  • 생성된 인스턴스들에게 추가적인 기능을 제공한다.
    ex. 앞서 실습에서 servlet 클래스를 정의했지만, 실제 인스턴스화 하는 작업을 직접하지는 않았다. 이는 Tomcat이 대신 해주었다. WAS가 servlet 컨테이너를 갖고 있기 때문이다. WAS는 웹 브라우저로부터 servlet url에 해당하는 요청을 받으면 servlet을 메모리에 올린 후에 실행한다. 실제로 메모리에 올리고 실행하는 것은 WAS가 가진 servlet 컨테이너가 해주는 것이다. 동일한 요청을 받으면 기존에 메모리에 올라간 servlet을 실행해서 그 결과를 웹 브라우저에게 전달한다. 마찬가지로 jsp파일을 생성할 때에도 jsp가 servlet으로 바뀌고 servlet이 인스턴스를 만드는 과정을 Tomcat이라는 WAS가 대신 해주었다.

IoC

  • Inversion of Control의 약어이다. 제어의 역전이라고 번역한다.
  • 개발자는 프로그램의 흐름을 제어하는 코드를 작성한다. 그런데, 이 흐름의 제어를 개발자가 하는 것이 아니라 다른 프로그램이 그 흐름을 제어하는 것을 IoC라고 말한다.
Tv tv = new [      ] // [      ] 부분에 samsungTv, lgTv 등이 들어올 수 있을 것이다.
tv.channel++;
...

위와 같은 형태로 new로 객체를 생성하면 컴파일을 다시하는 것이기 때문에 작은 일은 아니다. 이 부분까지 고치지 않고 쓸 수 있는 방법을 생각했다. -> 공장이 인스턴스를 만들도록 한다.

// ex. 각각의 url에 따라 [      ]에 해당하는 servlet 클래스를  servlet 컨테이너가 만들어서 생성해서 준다.
// 따라서 [      ] 부분이 samsungTv에서 lgTv로 바뀌더라도 실제 코드가 달라지는 것이 아니다.
Tv tv = TvFactory.getTv([      ]);
tv.channel++;

인스턴스를 만들었다면 이제 우리가 써야한다. 사용하기 위해서는 객체를 받아와야 한다. 공장이 생성해준 객체를 어떻게 사용할 것인가? DI가 해당 객체를 주입받는 방법중 하나이다.

DI

  • DI는 Dependency Injection의 약자로, 의존성 주입이란 뜻을 가지고 있다.
  • DI는 클래스 사이의 의존 관계를 Bean 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것을 말한다.
// DI가 적용안 된 예 (개발자가 직접 인스턴스를 생성한다.)
class 엔진{

}
class 자동차{
	엔진 v5 = new 엔진();
}
// Spring에서 DI가 적용된 예
// 엔진 type의 v5변수에 아직 인스턴스가 할당되지 않았다.
// 컨테이너가 v5변수에 인스턴스를 할당해주게 된다.
@Component
class 엔진{

}
@Component
class 자동차{
	@Autowired
    	엔진 v5;
        v5.run();	// 바로 사용가능
}

Spring에서 제공하는 IoC/DI 컨테이너

  • BeanFactory : IoC/DI에 대한 기본 기능을 가지고 있다.
  • ApplicationContext : BeanFactory의 모든 기능을 포함하며, 일반적으로 BeanFactory보다 추천된다. 트랜잭션 처리, AOP등에 대한 처리를 할 수 있다. BeanPostProcessor, BeanFactoryPostProcessor등을 자동으로 등록하고, 국제화 처리, 어플리케이션 이벤트 등을 처리한다.
profile
Enjoy to study

0개의 댓글