서블릿 컨테이너는 개발자가 웹서버와 통신하기 위하여 소켓을 생성하고, 특정 포트에 리스닝하고, 스트림을 생성하는 등의 복잡한 일들을 할 필요가 없게 해준다. 컨테이너는 servlet의 생성부터 소멸까지의 일련의 과정(life cycle)을 관리한다. 서블릿 컨테이너는 요청이 들어올때마다 새로운 자바스레드를 만든다. 우리가 알고 있는 대표적인 Servlet Container가 tomcat이다. 톰캣같은 was가 java 파일을 컴파일해서 Class로 만들고 메모리에 올려 servlet객체를 만든다.
스프링 컨테이너
먼저 Spring Container를 이해하기 위해서는 IoC와 DI를 이해해야 한다. Spring Container는 Bean들의 생명주기를 관리한다. Spring Container는 어플리케이션을 구성하는 Bean들을 관리하기 위해 IoC를 사용한다.
Spring Container 종류에는 BeanFactory와 이를 상속한 BeanFactory와 이를 상속한 ApplicationContext가 존재한다. 이 두 개의 컨테이너로 의존성 주입된 빈들을 제어하고 관리할 수 있다. 아래는 스프링 웹 어플리케이션 동작원리이다.
1. 웹 어플리케이션이 실행되면 tomcat(WAS)에 의해 web.xml이 로딩된다.(load-on-startup으로 톰캣 시작 시 servlet 생성가능하도록 설정 가능)
2. web.xml에 등록되어 있는 ContextLoaderListener(java class)가 생성된다. ContextLoaderListener 클래스는 ServletContextListener 인터페이스를 구현하고 있으며, ApplicationContext를 생성하는 역할을 수행한다.
3. 생성된 ContextLoaderListener는 applicationContext.xml을 로딩한다.
4. applicationContext.xml에 등록되어 있는 설정에 따라 Spring Container가 구동된다. 이때 개발자가 작성한 비즈니스 로직에 대한 부분과 DAO, DTO 객체들이 생성된다.
5. 클라이언트로부터 웹어플리케이션 요청이 온다.
6. DispatcherServlet(Servlet)이 생성된다. DispatcherServlet은 FrontController의 역할을 수행한다. 클라이언트로부터 요청 온 메시지를 분석하여 알맞은 PageController에게 전달하고 응답을 받아 요청에 따른 응답을 어떻게 할지 결정만 한다. 실질적인 작업은 PageController에서 이뤄지기 때문이다. 이러한 클래스들을 HandlerMapping, ViewResolver 클래스라고 한다.
7. DispatcherServlet은 servlet-context.xml(spring-mvc.xml)을 로딩한다.
8. 두 번째 Spring Container가 구동되면 응답에 맞는 PageContainer들이 동작한다. 이때 첫 번째 Spring Container가 구동되면서 생성된 DAO, DTO, ServiceImpl 클래스들과 협업하여 알맞은 작업을 처리하게 된다.
서블릿 컨테이너는 웹 어플리케이션 서버 중에서 HTTP 요청을 받아 처리하는 기초 역할을 맡고있다. 대부분의 웹 프레임워크가 제공하는 기능은 서블릿 컨테이너 위에서 동작하는 서블릿, 필터, 이벤트 리스너 등을 적절하게 구현한 것이다. 따라서 사용자가 웹 프레임워크로 작성한 웹 어플리케이션은 결국 서블릿 컨테이너 위에서 동작한다.
출처:
[Servlet] 서블릿 컨테이너와 스프링 컨테이너
https://minwan1.github.io/2017/10/08/2017-10-08-Spring-Container,Servlet-Container/ https://minwan1.github.io/2018/11/21/2018-11-21-jsp-springboot-%EB%8F%99%EC%9E%91%EA%B3%BC%EC%A0%95/ 서블릿 컨테이..
12bme.tistory.com
'자바' 카테고리의 다른 글
| 리플렉션, Class 생성, Method 실행 (0) | 2020.11.16 |
|---|---|
| 날짜 포맷 설정(SimpleDateFormat) (0) | 2020.11.16 |
| MessageFormat (0) | 2020.11.15 |
| Holder 패턴 (0) | 2020.11.15 |
| @PostConstruct (0) | 2020.11.15 |