Spring

Servlet 과 DispatcherServlet

김관현 2024. 8. 14. 20:36

Servlet

자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램

자바로 구현된 CGI(Common Gateway Interface, 서버와 애플리케이션 간에 데이터를 주고받는 방식)

 

사진 출처 -  https://electricalfundablog.com/common-gateway-interface-cgi/ 

 

 

 

서블릿의 동작

(0. 로딩시점 혹은 최초 요청 시점에 Servlet 이 생성) -> 서버 설정에 따라 다름

1. Client 가 Http 요청

2. HTTP 요청을 통해 매핑된 URL 이 호출

3. ServletContainer 가 HttpServletRequest, HttpServletResponse 객체 생성 (Http 요청 메시지 기반으로 생성)

4. ServletContainer 가 Servlet 호출

5. 실행

6. 종료 시 Response 객체 정보로 Http 응답 생성

7. 해당 Response 를 웹 브라우저로 날림

 

(서블릿은 복잡한 Http 요청 메시지를 파싱해서 HttpServletRequest 객체에 담아 제공)

(HttpServletRequest, HttpServletResponse 는 Http 요청과 응답 메시지를 편리하게 이용하도록 도와주는 객체)

 

 

서블릿 컨테이너는 요청이 올 때 마다 새로운 자바 스레드를 하나 생성한다

해당 스레드가 로직을 다 처리하고 나면 스레드는 자동으로 소멸된다

 

서블릿이 가진 문제

서블릿에 대한 내용을 Web.xml 에 넣어놓고 자바 클래스로 해당 서블릿에 대한 로직도 구현해놓으면 웹페이지를 만들수 있다

HTML 만 사용한다면 정적인 화면만 만들 수 있었겠지만 서블릿을 사용하면서 동적인 웹페이지까지 만들 수 있다

하지만 과하게 복잡하다

 

그래서 동적으로 변경해야 하는 부분을 템플릿 엔진이 처리하도록하는 방법이 이후에 나오게 되었다

=> 자바 코드로 HTML 찍어내는 방식에서 HTML 문서에 자바코드를 넣는 템플릿 엔진을 사용하게 되었다

(ex. JSP, Thymeleaf 등등)

 

템플릿 엔진을 사용하는 방법으로 진행하다보면 특정 문제가 생길 수 있다

비즈니스 로직과 view 로직이 섞인다는 것인데 이를 해결하기 위해 MVC 패턴이 나오게 되었다

(비즈니스 로직과 뷰 로직 분리)

 

 

 

하지만 여전히 남아있는 문제는 URL 맵핑을 위해 모든 서블릿을 각각 Web.xml 에 등록하여야 했다

또한 중복되는 코드공통적으로 처리해야하는 부분이 많다

 

이런 문제를 해결시켜준 것이 DispatcherServlet 이다

 

 

DispatcherServlet

서블릿이 가진 '모든 서블릿을 Web.xml 에 등록해주어야 하고 중복되는 코드가 많다' 라는 문제점을 DispatcherServlet 이 해결해주었다

 

해결 방법은 컨트롤러 호출 전에 먼저 공통적으로 처리해야 하는 부분을 해결해주는 것이다

-> Front Controller 역할을 하는 것이다

 

DispatcherServlet 은 FrontController 로서 모든 클라이언트의 요청을 받은 후에 요청에 맞는 컨트롤러를 찾아서 호출해버린다

 

따라서 공통 기능을 처리해줄 수 있으며, DispatcherServlet 을 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 된다

(서블릿에 종속되는 부분을 FrontController 에서 제거한 후 종속성이 제거된 객체를 컨트롤러에 넘겨준다)