DispatcherServlet란?
Spring MVC의 핵심 컴포넌트로, 요청을 처리하고 적절한 컨트롤러에 전달하며, 최종적으로 뷰를 렌더링하는 역할을 맡고 있다. 이 서블렛은 Spring MVC의 중앙 요청 처리기로, 전체 웹 애플리케이션의 흐름을 관리한다.
참고로 Servlet은 자바를 사용하여 웹 서버에서 동작하는 프로그램이다. 웹 페이지를 생성하고 처리하는 데 필요한 코드를 담고 있고, 웹 페이지를 요청하면, Servlet이 서버에서 그 요청을 처리하여 웹 페이지를 동적으로 생성한 후 클라이언트(브라우저)에게 반환한다.
(여기서 동적으로 생성한다는 뜻은 웹 페이지나 콘텐트가 고정된 것이 아니라, 요청 시점에 따라 변하거나 사용자에 맞게 조정되는 것을 의미한다.)
Servlet작동 방식
- 웹 페이지 요청: 사용자가 웹 브라우저에서 특정 웹 페이지를 요청한다. 이 요청은 웹 서버로 전송된다.
- Servlet의 역할: 웹 서버는 이 요청을 받아서 해당 요청을 처리할 Servlet을 찾는다. Servlet은 자바 코드로 작성된 프로그램으로, 요청에 대한 처리를 담당한다.
- 동적 웹 페이지 생성: Servlet은 요청을 처리하면서 필요한 데이터를 수집하고, 이 데이터를 사용하여 웹 페이지의 내용을 동적으로 생성한다. 이 과정에서 HTML, 데이터베이스 정보 등을 조합하여 결과를 만든다.
- 응답 반환: Servlet이 생성한 웹 페이지를 웹 서버가 클라이언트(브라우저)에게 보내준다. 그러면 브라우저는 이 페이지를 사용자에게 보여준다.
주요역할
요청 수신:
- 클라이언트의 HTTP 요청을 수신한다.
- 이 요청은 웹 애플리케이션의 web.xml 또는 Java 기반 설정 클래스에서 DispatcherServlet으로 매핑된다.
핸들러 매핑 (Handler Mapping):
- 요청 URL을 기반으로 적절한 컨트롤러(핸들러)를 찾기 위해 핸들러 매핑을 사용한다.
- 핸들러 매핑은 요청을 처리할 컨트롤러를 결정하는 데 필요한 정보(URL 패턴과 컨트롤러의 매핑)를 제공한다.
컨트롤러 호출:
- 매핑된 컨트롤러를 호출하여 요청을 처리한다.
- 컨트롤러는 비즈니스 로직을 수행하고 모델 객체를 준비한다.
모델과 뷰:
- 컨트롤러가 반환한 모델 데이터와 뷰 이름을 기반으로 뷰를 선택한다.
- 모델 데이터는 뷰에서 사용할 수 있는 데이터를 포함한다.
뷰 리졸버 (View Resolver):
- 뷰 이름을 실제 뷰로 변환하는 뷰 리졸버를 사용한다.
- JSP, Thymeleaf, FreeMarker 등 다양한 뷰 기술을 지원한다.
응답 생성:
- 선택된 뷰를 렌더링하여 최종적으로 클라이언트에게 응답을 반환한다.
Ex) 사용자가 (HTTP) API에 요청하였을 때 서버의 서블렛이 동작되는 방식
- 사용자가 Client(브라우저)를 통해 서버에 HTTP Request 즉, API 요청을 한다.
- 요청을 받은 Servlet 컨테이너는 HttpServletRequest, HttpServletResponse 객체를 생성한다.
- 약속된 HTTP의 규격을 맞추면서 쉽게 HTTP에 담긴 데이터를 사용하기 위한 객체이다.
- 설정된 정보를 통해 어떠한 Servlet에 대한 요청인지 찾는다.
- 해당 Servlet에서 service 메서드를 호출한 뒤 브라우저의 요청 Method에 따라 doGet 혹은 doPost 등의 메서드를 호출한다.
- 호출한 메서드들의 결과를 그대로 반환하거나 동적 페이지를 생성한 뒤 HttpServletResponse 객체에 응답을 담아 Client(브라우저)에 반환한다.
- 응답이 완료되면 생성한 HttpServletRequest, HttpServletResponse 객체를 소멸한다.
이렇게 Servlet에 대해 간단히 알아가고 DispatcherServlet의 주요 역할에 대해 알아가겠다.
DispatcherServlet의 주요 역할
요청 수신:
- 클라이언트의 HTTP 요청을 수신한다.
- 이 요청은 웹 애플리케이션의 web.xml 또는 Java 기반 설정 클래스에서 DispatcherServlet으로 매핑된다.
핸들러 매핑 (Handler Mapping):
- 요청 URL을 기반으로 적절한 컨트롤러(핸들러)를 찾기 위해 핸들러 매핑을 사용한다.
- 핸들러 매핑은 요청을 처리할 컨트롤러를 결정하는 데 필요한 정보(URL 패턴과 컨트롤러의 매핑)를 제공한다.
컨트롤러 호출:
- 매핑된 컨트롤러를 호출하여 요청을 처리한다.
- 컨트롤러는 비즈니스 로직을 수행하고 모델 객체를 준비한다.
모델과 뷰:
- 컨트롤러가 반환한 모델 데이터와 뷰 이름을 기반으로 뷰를 선택한다.
- 모델 데이터는 뷰에서 사용할 수 있는 데이터를 포함한다.
뷰 리졸버 (View Resolver):
- 뷰 이름을 실제 뷰로 변환하는 뷰 리졸버를 사용한다.
- JSP, Thymeleaf, FreeMarker 등 다양한 뷰 기술을 지원한다.
응답 생성:
- 선택된 뷰를 렌더링하여 최종적으로 클라이언트에게 응답을 반환.
(1) 웹 요청이 서버로 도착할 때, 요청에는 사용자가 무엇을 원하는지에 대한 정보가 포함된다. 최소한 요청은 요청된 URL을 담고 있으며, 경우에 따라 사용자가 양식에 제출한 정보와 같은 추가 데이터도 포함될 수 있다.
요청의 첫 번째 단계는 Spring의 DispatcherServlet으로 전달되는 것이다. 대부분의 Java 기반 웹 프레임워크와 마찬가지로 Spring MVC는 단일 프런트 컨트롤러 서블릿을 통해 요청을 처리한다. 이 프런트 컨트롤러는 단일 서블릿이 요청을 받아 애플리케이션의 다른 구성 요소에 위임하여 실제 처리를 수행하는 일반적인 패턴이다. Spring MVC에서는 DispatcherServlet이 이 역할을 맡고 있다.
(2) DispatcherServlet의 역할은 요청을 Spring MVC 컨트롤러로 전달하는 것이다. 컨트롤러는 요청을 처리하는 Spring의 구성 요소이다. 하지만 애플리케이션에는 여러 컨트롤러가 있을 수 있으므로, DispatcherServlet은 요청을 전달할 적절한 컨트롤러를 결정해야 한다. 이를 위해 DispatcherServlet은 하나 이상의 핸들러 매핑을 참조하여 요청의 URL을 분석하고, 다음 단계로 어떤 컨트롤러가 적합한지 파악한다.
(3) 적절한 컨트롤러가 결정되면, DispatcherServlet은 요청을 선택된 컨트롤러로 전달한다. 컨트롤러는 요청을 처리하고, 사용자로부터 받은 정보를 바탕으로 비즈니스 로직을 수행한다. 잘 설계된 컨트롤러는 비즈니스 로직을 직접 처리하기보다는 서비스 객체에 위임하여 처리한다.
(4) 컨트롤러는 요청을 처리한 결과를 모델이라고 하며, 이 모델은 사용자에게 보여줄 정보를 포함한다. 하지만 모델 데이터를 원시 형태로 직접 전달하는 것만으로는 부족하다. 일반적으로 이 정보를 HTML과 같은 사용자 친화적인 형식으로 포맷해야 한다. 이를 위해 컨트롤러는 모델 데이터를 포함한 뷰의 이름을 결정하고, 이 정보와 함께 요청을 DispatcherServlet으로 다시 전달한다.
(5) 컨트롤러가 DispatcherServlet에 전달하는 뷰 이름은 특정 JSP 파일을 직접 지칭하지 않는다. 대신, 뷰의 논리적 이름만 전달되며, DispatcherServlet은 뷰 리졸버를 참조하여 이 논리적 뷰 이름을 실제 뷰 구현에 매핑한다. 이 뷰 구현은 JSP일 수도 있고, 다른 형식일 수도 있다.
(6) DispatcherServlet이 어떤 뷰가 결과를 렌더링할지 알게 되면, 마지막 단계는 해당 뷰 구현으로 모델 데이터를 전달하는 것이다. 일반적으로 이 뷰 구현은 JSP 파일이며, JSP는 모델 데이터를 사용하여 최종 출력을 생성한다.
(7) 최종적으로, 생성된 출력은 응답 객체에 의해 클라이언트에게 반환된다. 이렇게 해서 사용자가 요청한 웹 페이지가 브라우저에 표시된다.
'Web지식 > 네트워크' 카테고리의 다른 글
Http/1.0 ~http/3 (0) | 2024.08.24 |
---|---|
JWT(JSON Web Token) (0) | 2024.08.22 |
쿠키(Cookie)와 세션(Session) (0) | 2024.08.21 |
Ajax란? (0) | 2024.08.04 |