DispathcerServlet
- Dispathcher의 dispatch는 보내다는 뜻을 가지고 있다. 즉, Servlet으로 보낸다는 뜻이다.
- servlet-container 내에서 작동된다.
- [FrameworkServlet.java > HttpServlet.java > Servlet.java] 를 상속받아 구현한 Servlet이다. 따라서 Servlet-Container와 Servlet의 개념을 먼저 알고 있어야 한다.
Servlet
- 정의된 클라이언트의 요청에 대해 상응하는 응답 결과인 웹 페이지나 결과값을 동적으로 생성해 주기위한 자바 프로그램이다.
- 스레드 단위로 실행된다.
- Servlet은 독립적으로 실행될 수 없으며, Servlet-Container에 의해 관리된다.
다음은 java8에서 제공하는 servlet의 인터페이스 코드이다.
public interface Servlet {
public void init(ServletConfig config) throws ServletException;
public ServletConfig getServletConfig();
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
public String getServletInfo();
public void destroy();
}
Servlet을 만들기 위해서는 위 interface의 구현체를 직접 만들어 사용한다. 실제 구현되는 Servlet은 위 인터페이스를 구현한 HttpServlet을 상속받아 작성된다.
아래는 HttpServlet을 상속받아 구현하게 된 servlet의 주요 메서드이며, servlet-container에서 servlet의 life-cycle을 이해하기 위해 필요하다.
- init()
- destroy()
- doGet()
- doPost()
이후, Spring MVC에서는 Dispatcher Servlet이라는 모든 요청을 담당하는 servlet을 servlet-container에 두고 요청에 맞는 Controller를 찾아 요청을 위임한다. 이에 대한 장점은 servlet-container을 다루면서 알 수 있다.
Servlet-Container
- Servlet-Container는 servlet의 life-cycle를 관리하고, 요청에 따른 servlet 스레드를 생성한다.
- Servlet을 관리하는 방법은 web.xml 파일을 통한 방법과 Spring MVC의 Dispatcher-Servlet를 통해 관리되는 방법이 존재한다.
- Servlet-Container는 Tomcat 내에서 작동한다.
web.xml
- Servlet-Container가 요청에 알맞는 servlet에 매핑하기 위해 servlet에 대한 정보가 저장된 파일이다.
- 즉, servlet의 정보를 web.xml에 모두 정의해야 한다.
- 정의하지 않으면 servlet-container가 요청에 맞는 servlet을 매핑할 수 없다.
- servlet life-cycle
- 클라이언트의 요청을 받아 Servlet-Container는 request, response 객체를 생성(HttpServletRequest, HttpServletResponse)
- 요청된 URI를 web.xml을 참조하여 어떤 servlet인지 확인.
- 만약, servlet-container에서 한 번도 실행된 적이 없거나, 메모리에 생성된 servlet 인스턴스가 없는 경우 init()을 통해 인스턴스 생성.
- 생성된 혹은 기존에 있던 servlet 인스턴스를 통해 servlet 스레드를 생성한 후, servlet의 service()메서드 호출
- 이후 GET, POST 등 요청에 맞는 doXXX메서드 호출
- 이후 동적인 페이지 혹은 결과값을 response객체로 응답을 보낸다.
- 이후, request, response 객체는 소멸된다.
- 생성된 servlet인스턴스는 바로바로 destroy()하는 것이 아닌, servlet-container가 주기적으로 제거(destroy() 호출)를 한다.
- 클라이언트의 요청을 받아 Servlet-Container는 request, response 객체를 생성(HttpServletRequest, HttpServletResponse)
Dispatcher-Servlet
- dispatcher-servlet 처음 설명에서 말한 것 처럼 servlet이다.
- web.xml에 모든 servlet에 대한 정보를 정의해야 한다는 단점을 극복한다.
- 클라이언트의 요청 처리 과정
- dispatcher-servlet도 serlvet이다. 따라서 클라이언트 요청시, servlet-container에 dispatcher-servlet 인스턴스가 없는 경우 생성한다.
- 이후, dispathcer-servlet은 내부에 HandlerMapping, HandlerAdapter, ViewResolver를 통해 클라이언트의 요청에 따라 개발자가 정의해둔 내용으로 응답한다.
- HandlerMapping: 클라이언트로의 요청을 분석하여 매핑되는 Controller를 찾는다.
- HandlerAdapter: 매핑되는 Controller에게 클라이언트 요청을 보낸다.
- ViewResolver: Controller에서 view를 응답하면, view를 찾아 클라이언트에게 응답한다.
참고 자료
https://taes-k.github.io/2020/02/16/servlet-container-spring-container/
'개발 > Spring' 카테고리의 다른 글
[Spring] SecurityContext에 사용자 정보 넣어 테스트하기 (0) | 2022.02.10 |
---|---|
[SpringBoot] FCM을 통해 Push알림 보내보기 (15) | 2022.02.10 |
[SpringBoot] Redis를 SpringBoot 프로젝트에서 사용해보자 (0) | 2022.02.10 |
[SpringBoot] Controller의 여러가지 요청과 응답 처리 (0) | 2022.02.10 |
[Spring] 스프링 컨테이너, Bean 등록 및 사용하기 (0) | 2022.02.10 |