본문 바로가기

BOOK/토비의스프링

[2권] 토비의 스프링 6일차

컨트롤러가 뷰오브젝트를 리턴할수 있지만, 보통은 뷰의 논리적인 이름을 리턴해주며 DispatcherServlet의 전략인 뷰리졸버가 이를 이요해 뷰 오브젝트를 생성해준다 -> 대표적으로 사용되는뷰는 JSP/JSTL 뷰다.

 

JSP파일로 만들어진 뷰템플릿과 JstlView클래스로 만들어진 뷰 오브젝트가 결합해서 최종적으로 사용자가 보게 될 HTML을 생성하는데, 이 경우 컨트롤러는 JstlView가 사용할 JSP 템플릿 파일의 이름을 리턴해줘야 한다.

 

컨트롤러가 리턴해주는 정보는 결국 모델과 뷰 두 가지이다. 스프링에는 ModelAndVIew라는 이름의 오브젝트가 있는데, 이 ModelAndView가 DispatcherServlet이 최종적으로 Controller에게 돌려받는 오브젝트이다.

 

DispatcherServlet은 Model오브젝트를 컨트롤러부터 돌려 받고, View오브젝트에게 해당 Model을 전달해주며 최종적으로 클라이언트에게 돌려줄 결과물을 생성해달라고 요청한다.

 

jstlView가 전달받은 Model을 주입하는 방식은 ${파라미터}로, 파라미터되어 있는 부분과 일치하는 모델 내부의 데이터가 존재한다면 그 데이터를 넣어주는 방식이다.

 

위와 같은 방식을 통해, 작업을 진행하여 최종적으로는 HttpServletResponse 오브젝트 안에 담긴다.

 

(7) View생성까지 마쳤다면, DispatcherServlet은 등록된 후처리기가 있는지 확인 한후, 있다면 후처리기에서 후속 작업을 진행한 뒤에 뷰가 만들어준 HttpServletResponse에 담긴 최종 결과를 Servlet Container에게 돌려준다.

 

 

DispatcherServlet의 DI 가능한 전략

 - Handler Mappings

어떤 컨트롤러를 사용할것인지 결정하는 로직을 담당한다. HandlerMappings 인터페이스를 구현해서 만들수 있다. 기본적으로 BeanNameUrlHandlerMapping과 DefaultAnnotationHandlerMapping 두가지로 설정되어 있다.

- HandlerAddaper

위와 같이 HandlerMappings를 통해 선택된 컨트롤러를 호출할때 사용하는 Adapter이다.

컨트롤러를 선택하였다고 해도 호출방법이 다르므로, 해당 컨트롤러에 대한 호출방법을 결정한다. Default로 등록되어 있는 핸들러 어뎁터는 HttpRequestHandlerAdapter, SimpleControllerrHandlerAdapter, AnnotationMethodHandlerAdapter 세가지이다.

 

대표적으로, @RequestMapping과 @Controller 에노테이션을 통해 정의되는 컨트롤러의 경우는, DefaultAnnotationHandlerMapping에 의해 핸들러가 결정되고, 그에 대응하는 AnnotationMethodHandlerAdapter에 의해 호출이 일어난다.

 

- HandlerExcpetionResolver

예외가 발생했을때, 이를 처리하는 로직을 갖고 있다.