1. Dispatcher Servlet이란?
- Dispatcher Servlet은 Dispatcher(보내다 / 파견하다) + Servlet(웹 요청과 응답을 처리하는 자바 객체)의 합친 단어로 그 뜻처럼 HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에게 보내주는 Front Controller를 의미한다.
- Front Controller는 서블릿 컨테이너에서 클라이언트의 요청을 받아서 처리해주는 컨트롤러로 MVC 구조에서 함께 사용되는 디자인 패턴으로 이해하면 된다. (https://www.geeksforgeeks.org/front-controller-design-pattern/)
2. Dispatcher Servlet의 동작 과정
- 클라이언트 요청 확인: 클라이언트의 요청을 받아들인다.
- HandlerMapping을 통한 컨트롤러 검색: 요청한 URL에 맞는 컨트롤러를 찾기 위해 HandlerMapping에 전달한다. HandlerMapping은 적합한 컨트롤러를 검색하고, 해당 컨트롤러에 처리를 요청한다.
- HandlerAdapter에 전달 : 2번에서 반환된 값이 있다면, 해당 컨트롤러를 호출할 수 있는 HandlerAdapter에 요청을 전달한다.
- HandlerAdapter에서 해당 컨트롤러를 호출한다.
- 컨트롤러 처리 결과 반환: 컨트롤러에서 처리된 결과를 HandlerAdapter를 통해 Dispatcher Servlet에 다시 전달한다.
- ViewResolver에 전달: Dispatcher Servlet은 전달된 view를 View Resolver에 전달하고 해당하는 View 개체를 찾아 반환한다.
- View에 화면 요청 : 6번에서 반환된 View에 model의 값을 전달하고 화면 표시를 요청한다. model 값이 null인지 아닌지에 따라 그대로 사용할지 렌더링 할지 정한다.
- 처리 결과 반환: 최종적으로 처리 결과를 포함한 View가 Dispatcher Servlet에 전달되면, 이를 클라이언트에게 반환한다.
그림에서는 나오지 않지만, Dispatcher Servlet은 요청을 직접 처리하지 않고, 위임된 컴포넌트들에 작업을 맡겨 처리하는데 이를 스페셜 빈(Special Bean)이라 부른다. 주요 스페셜 빈들은 다음과 같다.
- HandlerMapping: 요청을 처리할 컨트롤러를 찾습니다.
- HandlerAdapter: 요청을 컨트롤러로 전달하며, 필요한 경우 요청을 컨트롤러가 원하는 객체로 변환합니다. (예: HttpServletRequest를 특정 DTO로 변환)
- HandlerExceptionResolver: 요청 처리 중 예외가 발생하면 이를 처리합니다.
- ViewResolver: 컨트롤러의 리턴 값을 바탕으로 적합한 뷰 컴포넌트를 반환합니다.
- LocaleResolver: 유저의 언어, 지역, 출력 형식 등을 결정하는 Locale을 처리합니다.
- MultipartResolver: 멀티파트 파일 업로드를 처리합니다. 멀티파트는 HTTP 응답 바디를 여러 파트로 나누어 전송하는 형식을 의미합니다.
문득, 개발자의 입장에서 궁금해진 부분이 있다. 위의 일련의 과정은 보여줄 수 있는 view page가 있는 controller의 경우인데, 만약 RESTful한 API의 경우에는 처리를 어떻게 할까?
먼저 결론부터 말하면, ViewResolver 이전까지는 동일하게 동작한다. 다만 이후가 다르다.
- @Controller에서는 ViewResolver가 동작하여 뷰를 생성하고, 이를 HTML로 렌더링하여 클라이언트에게 반환한다.
- @RestController에서는 뷰 리졸버가 사용되지 않고, HttpMessageConverter가 데이터를 JSON 또는 XML로 변환하여 직접 HTTP 응답으로 반환한다.
과정 자체가 복잡한 부분이 있어 학습하는데 조금 시간은 걸렸지만, 추후에 개발하다가 문제가 발생하면 어느 과정에서 문제가 생겼는지 찾는데 많은 도움이 될 것 같다.
참고자료
'Web Programming > Spring Boot' 카테고리의 다른 글
[Spring Boot] IoC와 DI (1) | 2024.09.06 |
---|---|
[Spring Boot] 유효성 검사(Validation) (0) | 2024.07.04 |