저번 글에서는 DispatcherServlet이 어떤식으로 동작하는지 직접 코드를 보며 설명했습니다.
이번 글에서는 DispatcherServlet 이 사용하는 인터페이스에 대해 살펴보겠습니다. 각각 어떤 인터페이스가 있으며 어떤 역할을 수행하는지 보겠습니다.
DispatcherServlet은 처음 구동시에 위의 인터페이스들을 초기화하는 과정을 겪습니다.
1. MultipartResolver
파일 업로드 요청을 처리하는데에 사용되는 인터페이스 입니다.
바이너리 데이터를 부분씩 처리하는 로직을 손쉽게 사용할 수 있도록 MultipartResovler가 처리해줍니다.
보다 구체적으로는 HttpServletRequest 를 MultipartHttpServletRequest로 변환해주는 작업을 담당합니다.
인터페이스를 구현한 구현체는 2가지가 있습니다.
org.springframework.web.multipart.commons.CommsMultipartResolver
org.springframework.web.multipart.support.StandardServletMultipartResolver
기본 DispatcherServlet에는 아무런 MultipartResolver를 등록하지 않습니다. Spring boot를 사용하는 사람들은 기본적인것이 하나 등록돼있습니다. 이 Resolver가 StandardServletMultipartResolver입니다.
2. LocaleResolver
요청이 dispatcherservlet에 들어왔을 때 요청을 분석하는 단계에서 사용됩니다.
Client의 요청이 어디에서 왔는지 지역정보를 확인할 때 사용하는 인터페이스입니다. 지역정보에 따라 MessageSource에서 적절한 언어로 resolve 하여 언어를 제공해줍니다.
다른 Bean이 없고 DispatcherServlet만 있는 경우 기본 정보에 등록됩니다.
기본 구현체는 AcceptHeaderLocaleResolver입니다.
3. ThemeResolver
웹 브라우저에서 버튼 클릭시 css 등을 변환해줄 경우 사용하는 것입니다. view 가 적절한 css를 읽어와 화면의 테마를 변경할 수 있습니다.
요청이 들어왔을때 사용자가 원하는 테마를 파악하고 변경이 필요한 부분을 제공해줘야합니다.
기본값은 Fixed이고 Cookie, Session기반으로 사용하기도 합니다.
4. HandlerMapping
요청이 들어왔을때 요청을 처리할 Handler를 찾아주는 인터페이스입니다.
기본적으로 두개가 등록됩니다.
BeanNameHandlerMapping: Bean이름을 기반으로 해당 요청에 해당하는 Handler가 있는지 확인합니다.
RequestMappingHandlerMapping: Annotation 정보를 기반으로 Handler를 찾아줍니다. Annotation기반에서는 method자체가 Handler가 됩니다.
5. HandlerAdapter
각각의 Handler를 실제로 처리할 수 있는 인터페이스입니다. 이 부분은 사용자마다 다양하게 만들 수 있습니다. 단, HandlerMapping과 연관이 되도록 등록해주어야합니다.
기본적으로 등록된 Bean은 RequestMappingHandlerAdapter입니다.
6. HandlerExceptionResolver
여러개의 bean을 사용합니다. 여러개의 Mapping을 순회하면서 각각의 Mapping에 해당하는 Handler들을 처리합니다.
ExceptionHandlerExceptionResolver를 기본적으로 사용합니다.
7. RequestToViewNameTranslator
뷰이름을 리턴하거나 뷰이름을 생략해도 동작합니다. view 이름을 주지 않은 경우에는 요청을 기반으로 판단합니다.
위와 같이 view 이름을 return하지 않아도 동작하는 것입니다.
8. ViewResolver
view이름을 리턴하든, 요청에서 view이름을 추측하여 view이름이 나오면 실제 view를 찾아내는 인터페이스입니다.
기본적으로는 InternalResourceViewResolver가 있습니다.
Spring boot 에서는 여러개가 등록돼있지만 DispatcherServlet기본적으로는 InternalResourceViewResovle만 등록돼있고 이 Resolver는 jsp 를 지원합니다.
9. FlashMapManager
redirect를 수행할 때 데이터를 받고 저장 후 redirect를 수행하는데, Post 요청이오면 로직 처리 후 Get요청이 다시 한번 오게끔하여 중복적으로 데이터 제출을 방지하는 패턴입니다.
그 Get 화면에서 보여줄때 필요한 데이터를 url 에 적어주거나, Path에 적어주거나 같이 보내주게 됩니다.
이렇게 주지 않고도 데이터를 전송할 수 있게 해주는 기능이 FlashMap입니다. 기본적으론 Session 기반입니다.
SeesionFlashMapManager 가 기본적으로 등록돼있습니다.
서블릿 컨테이너인 톰캣에 등록한 WAR(웹어플리케이션)에 Dispatcher Servlet을 등록해줍니다.
스프링부트로 수행하는 경우 특정타입에 해당하는 빈을 등록해줍니다.
스프링부트의 주관에 따라 여러 인터페이스 구현체들을 빈으로 등록해두었습니다.
'Java > Spring Framework' 카테고리의 다른 글
DispatcherServlet (0) | 2021.02.13 |
---|---|
Servlet (0) | 2021.02.08 |
Null-safety (0) | 2021.02.07 |
AOP (0) | 2021.02.07 |
SpEL (0) | 2021.02.07 |