본문 바로가기

Java/Spring Framework

DispatcherServlet

반응형

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