dispatcher servlet 이 하는 일은 아래와 같은 순서로 일어납니다.
1) 요청을 분석합니다.
2) 요청을 처리할 핸들러를 핸들러매핑에게 위임하여 찾아옵니다.
3) 핸들러를 실행할 수 있는 "핸들러 어댑터"를 찾습니다
4) "핸들러 어댑터"를 사용해 핸들러의 응답을 처리합니다.
- 뷰이름에 해당하는 뷰를 찾아 모델 데이터를 렌더링합니다.
- @ResponseBody가 있으면 Converter를 사용해 응답 본문을 만들고 최종 응답을 보냅니다.
- 예를 들어 @ResponseBody가 있으면 ModelAndView 는 null이고 응답 바디를 생성해 리턴합니다.
5) 예외 발생시 예외처리 핸들러에게 요청처리를 위임합니다.
6) 핸들러의 리턴값을 통해 어떻게 처리할지 판단합니다.
request를 처리할 수 있는 handler를 가져옵니다.
이때 getHandler안에서는 HandlerMapping을 이용해서 가져옵니다.
DispatcherServlet이 들고있는 HandlerMapping 은 두가지가 있습니다.
RequestMappingHandlerMapping, BeanNameUrlHandlerMapping 이렇게 두가지가 기본적으로 제공해주는 것입니다.
RequestMappingHandlerMapping 에서 등록한 Controller에서 mapping을 찾아올 수 있습니다.
BeanNameUrlHandlerMapping은 Controller를 별도로 등록하는 경우 사용합니다. 예는 아래와 같습니다.
이렇듯 HandlerMapping은 Handler 를 찾아주는 인터페이스 입니다.
다음은 HandlerAdapter를 찾으러 갑니다. HandlerAdapter는 핸들러를 실행하는 인터페이스입니다.
이렇게 찾은 HandlerAdapter는 3개가 있습니다.
HttpRequestHandlerAdapter, SimpleControllerHandlerAdapter, RequestMappingHandlerAdapter 입니다.
handlerMethod라는 객체안에는 여러개의 메소드가 있습니다. 여기에 만들어둔 Controller도 있습니다. 따라서 이 메소드를 수행하면 지정한 controller로 들어오게 됩니다.
returnValueHandler : return 한 값을 어떻게 처리할것인지에 대한 명세를 알려줍니다.
Controller 의 리턴 타입
@RestController 라는 어노테이션은 메소드 앞에 @ResponseBody 라는 어노테이션을 붙인것과 동일합니다.
@Controller
public class HelloController {
@Autowired
HelloService helloService;
@GetMapping("/hello")
@ResponseBody
public String hello() {
return "hello, " + helloService.getName();
}
}
이렇게 사용한 코드와
@RestController
public class HelloController {
@Autowired
HelloService helloService;
@GetMapping("/hello")
public String hello() {
return "hello, " + helloService.getName();
}
}
이렇게 사용한 코드가 같다는 의미입니다.
단, Controller 에서 ResponseBody 어노테이션이 빠진 메소드의 return은 ModelAndView 로 인식한단 점이 다릅니다.
동작하는 방식 ViewResover
init 하는 과정에서 bean에서 해당 타입을 찾아오고 없으면 기본전략으로 가져옵니다.
최초의 servlet 초기화 과정에서 init을 수행하고 그 뒤에는 수행하지 않습니다.
기본으로 사용하는 ViewResolver는 InternalResourceViewResolver입니다. 여기엔 아무것도 설정되어 있지 않습니다.
이때 기본에 추가 설정을 할 수 있습니다. DispatcherServlet 에 설정파일로 지정한 WebConfig 파일에 위와 같이 prefix, suffix를 추가할 수 있습니다.
이렇게 추가하고 나면, 기본으로 설정된 viewResolver가 아닌 우리가 설정한 config 로 동작하게 됩니다.
'Java > Spring Framework' 카테고리의 다른 글
Dispatcher Servlet 두번째 (0) | 2021.02.14 |
---|---|
Servlet (0) | 2021.02.08 |
Null-safety (0) | 2021.02.07 |
AOP (0) | 2021.02.07 |
SpEL (0) | 2021.02.07 |