[Spring] Spring IoC / DI 컨테이너
by Roel Downey- Container
- IoC (Inversion of Control)
- DI (Dependency Injection)
컨테이너(Container)
Container는 인스턴스의 생명주기를 관리하며, 생성된 인스턴스에게 추가적인 기능을 제공한다.
WAS는 웹 브라우저로부터 서블릿 URL에 해당하는 요청을 받으면, 서블릿을 메모리에 올린 후 실행한다.
개발자가 서블릿 클래스를 작성했지만, 실제로 메모리에 올리고 실행하는 것은 WAS가 가지고 있는 Servlet Container이다.
Servlet Container는 동일한 서블릿에 해당하는 요청을 받으면, 또 메모리에 올리지 않고 기존에 메모리에 올라간 서블릿을 실행하여 그 결과를 웹 브라우저에게 전달한다.
Container는 보통 인스턴스의 생명주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 제공하는 것을 말한다.
정리하면!!!!
Servlet Container는 Servlet 저장소라고 봐도 무방하다. Java로 웹을 개발하기 위해 여러 Servlet들이 필요하게 되는데, 이러한 Servlet들의 Life Cycle (생명주기) 관리, 멀티쓰레드 지원 등을 하고 있는 것이 Servlet Container이다. 우리가 알고 있는 대표적인 Servlet Container가 Tomcat 이다.
Spring MVC 역시 Servlet Container가 관리하고 있는 Servlet이다.
그래서 Servlet 없이 Spring MVC만 있으면 된다고 하는것은 비지니스 로직을 Spring을 통해 처리하겠다는것이지 Servlet이 필요없다는 얘기가 아니다.
Spring MVC로의 모든 요청과 응답은 DispatcherServlet이 관리하고 있다.
URL요청이 오면 이를 가로채서 HandlerMapping (@RequestMapping으로 봐도 무방) 에게 해당 요청을 처리할 수 있는 Controller를 찾아내어 요청을 Controller에게 보내고 결과값을 리턴해준다.
IoC(Inversion of Control)
컨테이너가 코드 대신 오브젝트의 제어권을 갖고 있어 IoC(제어의 역전)이라 한다.
예를 들어, 서블릿 클래스는 개발자가 만들지만, 그 서블릿의 메소드를 알맞게 호출하는 것은 WAS이다.
이렇게 개발자가 만든 어떤 클래스나 메소드를 다른 프로그램이 대신 실행해주는 것을 제어의 역전이라고 한다.
DI(Dependency Injection)
DI는 의존성 주입이란 뜻을 가지고 있으며, 클래스 사이의 의존 관계를 빈(Bean) 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것을 말한다.
DI가 적용 안 된 예
개발자가 직접 인스턴스를 생성한다.
class 엔진 {
}
class 자동차 {
엔진 v5 = new 엔진();
}
Spring에서 DI가 적용된 예
엔진 type의 v5변수에 아직 인스턴스가 할당되지 않았다.
컨테이너가 v5변수에 인스턴스를 할당해주게 된다.
@Component
class 엔진 {
}
@Component
class 자동차 {
@Autowired
엔진 v5;
}
Spring에서 제공하는 IoC/DI 컨테이너
- BeanFactory : IoC/DI에 대한 기본 기능을 가지고 있다.
- ApplicationContext : BeanFactory의 모든 기능을 포함하며, 일반적으로 BeanFactory보다 추천된다. 트랜잭션 처리, AOP등에 대한 처리를 할 수 있다. BeanPostProcessor, BeanFactoryPostProcessor등을 자동으로 등록하고, 국제화 처리, 애플리케이션 이벤트 등을 처리할 수 있다.
- BeanPostProcessor : 컨테이너의 기본로직을 오버라이딩하여 인스턴스화 와 의존성 처리 로직 등을 개발자가 원하는 대로 구현 할 수 있도록 한다.
- BeanFactoryPostProcessor : 설정된 메타 데이터를 커스터마이징 할 수 있다.
'Web > Spring' 카테고리의 다른 글
[Spring] Spring Boot 2.3, Web-starter doesn't bring Validation-starter anymore (0) | 2020.07.28 |
---|---|
[Spring] Spring MVC (0) | 2020.07.24 |
[디자인패턴] 템플릿 메소드 패턴 (0) | 2020.07.20 |
[Spring] Gradle 에서 Lombok이 null 이 될때 확인! (0) | 2020.06.17 |
[Spring] Spring이란? (0) | 2020.06.03 |
블로그의 정보
What doing?
Roel Downey