Java

[Java/Spring] 서블릿과 디스패처 서블릿 (Servlet & Dispatcher Servlet)

ziwookim 2022. 11. 3. 01:14

 Servlet 이란?

- JAVA를 사용하여 웹을 만들기 위해 필요한 프로그래밍 기술이다. (Servlet 클래스의 구현 규칙을 지켜야합니다.)

- 또한, 이러한 웹 기반의 요청에 대해 동적으로 처리해주는 역할로서 Server Side에서 작동(WAS)한다.

- 웹 페이지 개발 시, 웹 화면(HTML)은 JSP로 표현하고, 복잡한 프로그래밍은 서블릿으로 구현하여 조화롭게 사용한다.

- 클라이언트가 요청을 하면 그 결과를 다시 전송해주는 프로그램이다.

- HttpServlet이라는 Java의 클래스를 상속받는다.

 

Servlet Life Cycle

1. Servlet 객체 생성 (1회) 

2. init() 호출 (1회)

3. service(), doGet(), doPost() 호출 (요청시 매번)

4. destory() 호출 (1회)

 

 

Servlet Container 란?

- 서블릿은 요청을 받거나 내보낼 때 자신이 알아서 하는 것이 아니라, 서블릿을 실행시키는 주체인 서블릿 컨테이너(Servlet Container)라는 것을 이용한다.

- 즉, Servlet을 관리한다는 Servlet Container는 어떤 요청에 대해 어떤 Servlet을 실행할 것인지 제어하는 것이다.

- 더 쉽게 말하면, 서블릿이 웹서버와 통신할 수 있도록 해준다.

- 대표적인 서블릿 컨테이너는 바로 Tomcat (EJB의 기능을 지원해주지 않는 Tomcat을 완전한 WAS라고 보기엔 무리가 있다고 생각합니다.)이 있다.

 

 

 

 Servlet 동작 과정

 

 

 

그렇다면, Dispatcher Servlet 이란 무엇일가?

 

- 클라이언트가 요청을 주면, Servlet Container가 요청을 받는데, 이때 제일 앞에서 서버로 들어오는 모든 요청을 처리하는Front Controller라는 것을 Spring에서 정의하였고, 이를 Dispatcher Servlet이라고 한다. 

- 기존에는 모든 Servlet에 대해 URL 매핑을 활용하기 위해서 web.xml에 모두 등록해주어야 했지만, dispatcher servlet이 해당 어플리케이션으로 들어오는 모든 요청을 핸들링해주면서 작업의 효율을 높였다.

(Spring Boot에서는 @SpringBootApplication 이라는 어노테이션으로 web.xml 파일을 대체할 수 있습니다.)

- 즉, Controller로 향하는 모든 웹 요청의 진입점으로써 웹 요청을 처리하고 결과 데이터를 Client에게 응답한다.

- Dispatcher Servlet을 이용한다는 것은 스프링에서 제공하는 MVC 모델을 이용하겠다는 것으로 생각하면 된다.

 

 

Dispathcer Servlet 동작 과정

 

ex) 

1. user/register에 요청이 오면, Spring의 Dispatcher Servlet으로 전달됩니다.

2. Dispatcher Servlet이 UserContoller에 있는 registerUser()과 같은 적절한 Method를 찾습니다.

3. 해당 Method는 @PostMapping('/user/register'), @RequestMapping(value="/user/register", Request.Method=Post) 와 같은 어노테이션(Handler Mapping)을 보고 찾습니다.

4. 함수를 수행하고나서 적절한 view를 Response 합니다.

 

 

Web 동작 과정 

출처 : taes-k.github.io/2020/02/16/servlet-container-spring-container/

Server start 단계

  1. Web server init
  2. Root WebApplicationContext 로딩
  3. Web server start

Client 호출 단계

  1. Client -> Web server 으로 request 보냄
  2. 동적 Web server -> Servlet container로 전달
  3. Servlet container 쓰레드 생성
  4. DispatcherServlet init (서블릿 생성 안되어 있을경우)
  5. 생성된 쓰레드에서 DispatcherServlet service() 메서드 호출
  6. HandlerMapping을 통해 매핑 컨트롤러 조회
  7. HandlerAdapter를 통해 매핑 컨트롤러에 request 전달
  8. 개발자가 구현한 Controller -> Service -> Repository … 동작

 

출처: https://riimy.tistory.com/87