출처 : https://12bme.tistory.com/555
출처 : https://roadofdevelopment.tistory.com/56
위 티스토리에 적어놓은 내용을 바탕으로 작성했으며, 좀 더 이해하기 위한 글을 작성합니다.
서블릿 컨테이너는 개발자가 웹서버와 통신하기 위한 복잡한 일들을 할 필요가 없게 해준다.
컨테이너는 Servlet의 생성부터 소멸까지의 일련의 과정을 관리한다.
서블릿 컨테이너는 요청이 들어올때 마다 자바 쓰레드를 생성하여 작업을 한다.
서블릿 컨테이너의 대표적인 예로는 흔히 사용하는 Tomcat 이 있다.
여기서 서블릿이란
동적인 웹페이지를 만들기 위해 사용되는 자바 기반의 웹 프로그래밍 기술이다.
클라이언트의 요청이 있고 요청에 대한 응답 결과를 반환해야 하는데 이러한 역할을
서블릿이 한다.
예를 들어 사용자가 로그인페이지에서 로그인 ID와 패스워드를 입력하고
로그인 시도 시 해당 ID와 패스워드를 검증하고 확인되면 요청 페이지로
이동시켜줘야 하는데 이러한 역할을 서블릿이 한다.
쉽게 말해 WAS에서 동작하는 JAVA 클래스라고 볼 수 있다.
아래의 예를 보자
위 이미지 밑 출처에서 잘 설명해놓으셨다.
이미지에서 보이는 파일은 web.xml 파일이다.
Client 의 Http Request 요청이 오면 url을 확인한 후 web.xml 파일을 참조하여 요청 url에 해당하는
<servlet-mapping> 태그 안 <url-pattern> 태그에 url 데이터가 있는지 확인한다.
요청한 url 과 맞는 <servlet-mapping> 태그를 찾으면 <servlet-name> 태그 값과 같은 <servlet> 태그를 찾는다.
찾으면 <servlet-class>에 해당하는 패키지를 찾아 해당 아래 클래스들을 서블릿으로 생성한다.
1. 클라이언트의 Http Request 요청이 들어오면 web.xml을 확인한다.
2. <servlet-mapping> 태그 안 <url-pattern> 태그안에서 클라이언트 요청 URL에 해당하는걸 찾는다.
3. 해당하는 url을 찾은 <servlet-mapping> 태그안에서 <servlet-name> 태그 내용을 확인하고
같은 내용의 <servlet> 태그를 찾는다.
4. mapping 된 <servlet> 태그를 찾으면 태그 안의 <servlet-class> 에 해당하는 패키지 아래의 클래스들을
서블릿으로 생성한다.
서블릿 컨테이너
서블릿 생성, 실행, 소멸 등의 관리 하는 역할을 한다.
특정 클라이언트로부터 요청이 왔을 때 서블릿이 실행 후 결과를 반환한다고 했다.
하지만 서블릿은 스스로 실행할 수 없으므로 특정 일을 하기 위한 임무를 주는 서블릿 컨테이너가
서블릿을 관리한다.
이렇게 서블릿 제어(생명주기)를 서블릿 컨테이너에게 넘어간것이 제어의 역전(IoC, Inversion of Control)이라고
할 수 있다.
아래는 서블릿 컨테이너(WAS) 의 동작 원리이다.
서블릿에 적어놨던 내용과 같다.
1. 클라이언트의 Http Request 요청이 들어오면 서블릿 컨테이너는 web.xml을 확인한다.
2. 컨테이너는 요청에 대한 HttpServletRequest 객체와 응답을 위한 HttpServletResponse 객체를 생성한다.
3. 참조한 web.xml 에 알맞는 Servlet 을 찾아 생성한다.
4. 컨테이너는 생성한 Servlet 의 service() 메서드를 호출하여 HTTP 요청을 처리한다.
(요청이 GET 요청일 경우 doGet() 메서드 호출, POST 요청일 경우 doPost() 메서드 호출)
5. doGet(), doPost() 로 동적페이지를 생성하고 HttpServletResponse 에 응답을 보낸다.
스프링 컨테이너
스프링 컨테이너는 Spring Bean 생성 및 관리하는 역할을 한다. Spring Bean 은 쉽게 말해 Spring 객체를 의미한다.
이러한 컨테이너가 관리하는 스프링 객체를 Bean 이라고 한다.
아래는 Spring 구조이다.
위에서 공부했던 서블릿 컨테이너가 나오고 서블릿 컨테이너에 의해 어떻게 스프링 컨테이너가 이루어지는지
확인해보자
1. 웹 어플리케이션이 실행되면 서블릿 컨테이너(WAS 등)는 web.xml 파일을 loading 한다.
2. web.xml 에 등록되어 있는 ContextLoaderListener가 생성된다. ContextLoaderListener 클래스는
ServletContextLisntener 인터페이스를 구현하고 있으며, ApplicationContext를 생성하는 역할을 수행한다.
(Spring Context 는 쉽게 말해 여러개의 Spring Bean 들을 포함하며 여러 기능을 가진 공간)
3. 생성된 ContextLoaderListener 는 root-context.xml(RootApplicationContext) 을 loading 한다.
4. root-context.xml에 등록되어 있는 Spring Container가 구동된다. 보통 root-context.xml 에는
back-packages 태그가 설정되어 있어 패키지 하위 클래스들을 Bean 으로 등록한다.
root-context.xml 파일에 의해 Spring Container(ROOT) 가 생성된걸 볼 수 있다.
5. 클라이언트로부터 Http Request 요청이 온다.
6. 서블릿 컨테이너에 의해 DispatcherServlet(Servlet)이 생성된다. DispatcherServlet은 FrontController 라고도
불리우는데 클라이언트의 모든 요청을 앞쪽에서 받아 적절한 Controller 에게 전달하고 응답을 받아 클라이언트에게
반환한다.
(적절한 Controller 를 찾는 역할은 HandlerMapping이 하며 사용자가 요청한 알맞는
View를 찾는 역할은 ViewResolver가 한다.)