Processing
DispatcherServlet의 Http request 처리 과정 (Processing in DispatcherServlet)
Spring MVC의 DispatcherServlet은 HTTP request을 받아 적절한 컨트롤러와 뷰를 연결하여 응답을 리턴합니다.
요청을 처리하는 과정에서 여러 가지 핵심적인 단계가 존재하며, 이를 이해하면 Spring MVC의 동작을 깊이 있게 이해할 수 있습니다.
1. DispatcherServlet의 요청 처리 흐름
DispatcherServlet이 요청을 처리하는 과정은 다음과 같이 진행됩니다.
✅ 1. WebApplicationContext를 Request에 바인딩
DispatcherServlet
은WebApplicationContext
(Spring MVC의 컨텍스트)를 검색하여 request 속성(Attribute)으로 저장합니다.- 이를 통해 컨트롤러와 기타 컴포넌트가 컨텍스트를 활용할 수 있습니다.
- 디폴트로
DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE
키를 사용하여 바인딩됩니다.
📌 즉, 요청을 처리하는 동안 WebApplicationContext를 필요로 하는 요소들이 이를 참조할 수 있습니다.
✅ 2. LocaleResolver 바인딩 (선택 사항)
- 요청에서 사용자의 로케일(Locale)을 확인하고 바인딩합니다.
- 뷰 렌더링, 데이터 준비 등의 과정에서 로케일 정보를 활용할 수 있습니다.
- 필요하지 않다면 생략 가능합니다.
📌 예제: 로케일 설정
@Bean
public LocaleResolver localeResolver() {
return new CookieLocaleResolver();
}
➡ CookieLocaleResolver
를 사용하면 사용자의 언어 설정을 쿠키에 저장할 수 있습니다.
✅ 3. ThemeResolver 바인딩 (선택 사항)
- 요청에서 사용할 테마(Theme)를 결정하고 바인딩합니다.
- 주로 뷰(View)에서 사용자 맞춤 UI를 제공할 때 사용됩니다.
- 테마를 사용하지 않는다면 무시 가능합니다.
📌 예제: 테마 설정
@Bean
public ThemeResolver themeResolver() {
return new FixedThemeResolver();
}
➡ FixedThemeResolver
는 테마를 고정값으로 설정합니다.
✅ 4. Multipart 요청 검사 (파일 업로드 시 필요)
MultipartResolver
가 설정되어 있다면, 요청이 파일 업로드(multipart/form-data) 요청인지 확인합니다.- 파일 업로드 요청일 경우,
MultipartHttpServletRequest
로 감싸져서 나머지 과정에서 활용됩니다. - 멀티파트 요청이 아닐 경우 이 단계는 생략됩니다.
📌 예제: 파일 업로드 지원
@Bean
public MultipartResolver multipartResolver() {
return new StandardServletMultipartResolver();
}
➡ StandardServletMultipartResolver
는 서블릿 3.x의 내장 기능을 사용하여 파일 업로드를 처리합니다.
✅ 5. 적절한 핸들러(컨트롤러) 검색 및 실행
HandlerMapping
을 사용하여 요청을 처리할 컨트롤러를 찾습니다.- 컨트롤러가 존재하면 실행 체인(Execution Chain)이 실행됩니다.
- 전처리기(Preprocessors) 실행
- 컨트롤러 실행
- 후처리기(Postprocessors) 실행
📌 핸들러 매핑 예제
@Bean
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
return new RequestMappingHandlerMapping();
}
➡ RequestMappingHandlerMapping
을 사용하면 @RequestMapping
이 설정된 컨트롤러가 자동으로 매핑됩니다.
📌 컨트롤러 예제
@RestController
public class MyController {
@GetMapping("/hello")
public String sayHello() {
return "Hello, Spring MVC!";
}
}
➡ /hello
요청이 들어오면 sayHello()
메서드가 실행됩니다.
✅ 6. 모델이 설정되면 뷰 렌더링
- 컨트롤러에서 모델(Model) 데이터가 설정되면 뷰(View)를 렌더링합니다.
- 뷰 이름을
ViewResolver
가 해석하여 실제 뷰 파일(JSP, Thymeleaf 등)을 찾아 렌더링합니다. - 만약 모델이 설정되지 않았다면,
- 보안이나 인터셉터에 의해 요청이 차단되었거나
- 응답이 JSON 등으로 직접 반환되었을 가능성이 있습니다.
📌 예제: 뷰 리졸버 설정
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
➡ 컨트롤러에서 "home"
이라는 뷰를 반환하면 /WEB-INF/views/home.jsp
가 렌더링됩니다.
✅ 7. 예외 처리 (HandlerExceptionResolver 사용)
- 요청을 처리하는 과정에서 예외가 발생하면 HandlerExceptionResolver가 실행됩니다.
- 예외를 특정 컨트롤러, HTML 오류 페이지 또는 JSON 응답으로 매핑할 수 있습니다.
📌 예제: 예외 처리
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public String handleException(Exception e, Model model) {
model.addAttribute("error", e.getMessage());
return "error";
}
}
➡ 예외가 발생하면 "error.jsp"
페이지로 이동하여 에러 메시지를 출력합니다.
2. DispatcherServlet의 초기화 파라미터 (Init Parameters)
DispatcherServlet
은 초기화 파라미터(init-param)를 통해 일부 동작을 설정할 수 있습니다.
파라미터 | 설명 |
---|---|
contextClass |
ConfigurableWebApplicationContext 를 구현한 클래스 지정 (디폴트값: XmlWebApplicationContext ) |
contextConfigLocation |
설정 파일 위치 (여러 개의 위치 지정 가능, , 로 구분) |
namespace |
WebApplicationContext 의 네임스페이스 (디폴트값: [servlet-name]-servlet ) |
throwExceptionIfNoHandlerFound |
핸들러가 없을 경우 NoHandlerFoundException 을 던질지 여부 (6.1부터 디폴트값 true ) |
📌 예제: web.xml에서 DispatcherServlet 설정
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/dispatcher-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
➡ contextConfigLocation
을 통해 Spring 설정 파일의 경로를 지정할 수 있습니다.
🚀 Summary
1️⃣ Http request가 들어오면 DispatcherServlet
이 이를 처리합니다.
2️⃣ WebApplicationContext
가 request에 바인딩됩니다.
3️⃣ 로케일/테마 설정, 파일 업로드 검사 등의 추가 설정이 적용될 수 있습니다.
4️⃣ HandlerMapping
을 통해 request을 처리할 컨트롤러를 찾고 실행합니다.
5️⃣ 모델이 설정되면 뷰 리졸버를 통해 뷰가 렌더링됩니다.
6️⃣ request 처리 중 예외가 발생하면 HandlerExceptionResolver가 예외를 처리합니다.
7️⃣ DispatcherServlet
의 동작은 초기화 파라미터(init-param)를 통해 설정할 수 있습니다.
➡ 결론적으로, DispatcherServlet은 request을 받아 핸들러를 실행하고, 필요한 경우 뷰를 렌더링하며, 예외 처리까지 담당하는 핵심적인 서블릿입니다. 🚀
출처 : https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-servlet/sequence.html