- 들어가기 전에
이번 시간에는 Spring MVC에서 가장 핵심적인 역할을 수행하는 DispatcherServlet이 어떤 순서로 동작하는지 살펴보도록 하자. 이를 통해 Spring MVC에서 사용되는 컴포넌트들에 대해 알아보자.
- 학습 목표
1. DispatcherServlet이 어떤 순서로 동작하는지 이해한다.
2. DispatcherServlet에서 사용되는 컴포넌트(객체)들은 어떤 것들이 있느지 알아본다.
- 핵심 개념
- DispatcherServlet
- HandlerMapping
- HandlerAdapter
- ViewResolver
- Spring MVC 기본 동작 흐름
- Database를 제외한 파란색 부분들은 모두 Spring MVC가 제공해주는 것
- 보라색 부분들은 개발자가 만들어야 하는 부분
- 녹색으로 되어있는 View는 Spring이 제공하는 부분도 있고, 개발자가 만들어야 되는 부분도 같이 존재한다.
- 클라이언트가 ① Request를 보내면 보낸 모든 요청을 Dispatcher Servlet이라고 하는 서블릿 클래스가 받는다.
- Dispatcher Servlet은 요청을 처리해줄 컨트롤러와 메소드가 무엇인지 ② Handler Mapping에게 물어본다. 사실은 Handler Mapping이 혼자서 알아낼 수는 없으므로, 어떤 요청은 어떤 컨트롤러가 동작할지를 xml 파일이나 java 파일의 어노테이션으로 설정을 하게된다. 이런 정보들을 Spring으로 만들어진 웹 어플리케이션을 실행할 때 Handler Mapping 객체들이 생성이 되면서 관리를 하게되는 것이다. Dispatcher Servlet은 그렇게 Handler Mapping으로부터 지금 들어온 요청에 알맞은 컨트롤러가 무엇인지, 해당되는 메소드는 무엇인지에 대한 정보를 알아내게 된다.
- 그다음, ③ Handler Adapter에게 실행을 요청한다.
- 그때 결정된 ④ 컨트롤러와 해당 메소드가 실행이 되게 되며, 그 결과를 Model 에 받아서 Dispatcher Servlet에게 전달한다.
- 이때 Dispatcher Servlet은 컨트롤러가 리턴한 ⑤ view name을 알아오게 된다.
- 컨트롤러가 리턴한 view name을 가지고 적절한 ⑥ View Resolver를 통해 뷰를 출력하게 된다.
- View Resolver가 특정 View라는 정보를 정확하게 알려주면 이 ⑦ View로 응답을 하게되는 과정을 거친다.
- Spring MVC를 이해한다는 것은 DispatcherServlet이 어떻게 동작하는지를 이해하는 것이다 DispatcherServlet이 요청을 받아서 결과를 출력하기까지 위에 기술되어있는 여러 컴포넌트를 사용하게 된다.
- DispatcherServlet
- 프론트 컨트롤러 (Front Controller)
- 클라이언트의 모든 요청을 받은 후 이를 처리할 핸들러에게 넘기고 처리한 결과를 받아 사용자에게 응답 결과를 보여준다. 일을 처리하는 것 까지는 하지않고, 요청을 받아 넘겨주는 것까지만 한다.
- 이론적으로는 한 개 이상 사용가능하지만, 보통은 한 개만 선언해서 사용한다.
- DispatcherServlet은 여러 컴포넌트를 이용해 작업을 처리한다.
DispatcherServlet 내부 동작 흐름
- 일단은 요청이 들어오면 요청에 대한 선처리 작업을 한다.
- 선처리 작업이 끝나면 HandlerExecutionChain을 결정한다.
- 결정이 되면 HandlerExecutionChain을 실행한다.
- 실행을 하는 과정에서 예외가 발생하면 예외처리, 발생하지 않으면 바로 뷰를 렌더링한다.
- 요청 처리를 종료하면 응답하고 종료
- DispatcherServlet 내부 동작흐름 상세 : 요청 선 처리 작업
- org.springframework.web.servlet.LocaleResolver
· 지역 정보를 결정해주는 전략 오브젝트이다.
· 디폴트인 AcceptHeaderLocalResolver는 HTTP 헤더의 정보를 보고 지역정보를 설정해준다.
· Spring MVC는 지역화(똑같은 사이트에 들어갔음에도 불구하고 사용자 별로 다른 언어의 화면이 보여지게 처리할 수 있음)를 지원한다.
· 사용자가 설정해놓은 언어정보를 받아오기 위해, 어떤 브라우저가 보내는 헤더 정봉서 언어 설정의 값을 이용해서 Locale을 결정할 수 있다. 이 정보를 가지고 Locale에 설정한 값을 각 언어로 보내지면, 그 부분에 따라 각각 다른 언어로 된 화면을 보여주는 것이 지역화(선처리)
- org.springframework.web.context.request.RequestContextHolder
· 일반 빈에서 HttpServletRequest, HttpServletResponse, HttpSession 등을 사용할 수 있도록 한다.
· 해당 객체를 일반 빈에서 사용하게 되면, Web에 종속적이 될 수 있다.
· 스레드 로컬 객체인 RequestContextHolder에 요청을 저장한다. 요청을 받아서 응답할 때까지 HttpServletRequest, HttpServletResponse 등을 Spring이 관리하는 객체 안에서 사용할 수 있도록 해주는 것- org.springframework.web.servlet.FlashMapManager
· FlashMap객체를 조회(retrieve) & 저장을 위한 인터페이스
· RedirectAttributes의 addFlashAttribute메소드를 이용해서 저장한다.
· 리다이렉트 후 조회를 하면 바로 정보는 삭제된다.
· redirect로 값을 전달할 때 사용된다. redirect로 값을 전달할 때 우리가 ?, 파라미터 이런 것들을 이용하게 되는데, FlashMap을 사용하면 redirect 될 때 딱 한번 값을 유지시킬 수 있게 해주는 것
· FlashMap을 복원한다는 것은 현재 실행이 redirect 되었을 때만 실행이 되는 부분들, 그 부분들 위해서 제공한다.
- org.springframework.web.multipart.MultipartResolver
· 멀티파트 파일 업로드를 처리하는 전략
- DispatcherServlet 내부 동작 흐름 상세 : 요청 전달
- org.springframework.web.servlet.HandlerMapping
· HandlerMapping구현체는 어떤 핸들러가 요청을 처리할지에 대한 정보를 알고 있다.
· 디폴트로 설정되는 있는 핸들러매핑은 BeanNameHandlerMapping과 DefaultAnnotationHandlerMapping 2가지가 설정되어 있다.
· HandlerMapping으로 HandlerExecutionChain이 결정
- org.springframework.web.servlet.HandlerExecutionChain
· HandlerExecutionChain구현체는 실제로 호출된 핸들러에 대한 참조를 가지고 있다.
· 즉, 무엇이 실행되어야 될지 알고 있는 객체라고 말할 수 있으며, 핸들러 실행전과 실행후에 수행될 HandlerInterceptor도 참조하고 있다.
· HandlerExecutionChian이 발견되지 않았으면 404 전달, 발견되었으면 HandlerAdapter 결정
- org.springframework.web.servlet.HandlerAdapter
· 실제 핸들러를 실행하는 역할을 담당한다.
· 핸들러 어댑터는 선택된 핸들러를 실행하는 방법과 응답을 ModelAndView로 변화하는 방법에 대해 알고 있다.
· 디폴트로 설정되어 있는 핸들러어댑터는 HttpRequestHandlerAdapter, SimpleControllerHandlerAdapter, AnnotationMethodHanlderAdapter 3가지이다.
· @RequestMapping과 @Controller 애노테이션을 통해 정의되는 컨트롤러의 경우 DefaultAnnotationHandlerMapping에 의해 핸들러가 결정되고, 그에 대응되는 AnnotationMethodHandlerAdapter에 의해 호출이 일어난다.
- DispatcherServlet 내부 동작흐름 상세 - 요청 처리
- 인터셉터 : 일종의 필터
· 인터셉터가 존재하면 인터셉터의 preHandle을 호출해서 요청처리
- org.springframework.web.servlet.ModelAndView
· ModelAndView는 Controller의 처리 결과를 보여줄 view와 view에서 사용할 값을 전달하는 클래스이다.
· preHandle을 호출해서 요청을 처리하고 난 후 실행된 핸들러가 리턴하는 결과
· 컨트롤러의 처리 결과를 보여줄 뷰와, 뷰에서 사용할 값을 전달하는 클래스
- org.springframework.web.servlet.RequestToViewNameTranslator
· 컨트롤러에서 뷰 이름이나 뷰 오브젝트를 제공해주지 않았을 경우 URL과 같은 요청정보를 참고해서 자동으로 뷰 이름을 생성해주는 전략 오브젝트이다. 디폴트는 DefaultRequestToViewNameTranslator이다.
· ModelAndView 객체가 뷰를 갖고있지 않다면 RequestToViewNameTranslator가 동작
· 적절한 뷰가 없을 때 해당 컴포넌트가 작동
- DispatcherServlet 내부 동작흐름 상세 - 예외처리
- org.springframework.web.servlet.handlerexceptionresolver
· 기본적으로 DispatcherServlet이 DefaultHandlerExceptionResolver를 등록한다.
· HandlerExceptionResolver는 예외가 던져졌을 때 어떤 핸들러를 실행할 것인지에 대한 정보를 제공한다.
· ModelAndVIew가 있다면 요청처리를 재개, 없다면 예외를 다시 던짐
- DispatcherServlet 내부 동작흐름 상세 - 뷰 렌더링 과정
- org.springframework.web.servlet.ViewResolver
· 컨트롤러가 리턴한 뷰 이름을 참고해서 적절한 뷰 오브젝트를 찾아주는 로직을 가진 전략 오프젝트이다.
· 뷰의 종류에 따라 적절한 뷰 리졸버를 추가로 설정해줄 수 있다.
- DispatcherServlet 내부 동작흐름 상세 - 요청 처리 종료
'Progamming > BoostCourse' 카테고리의 다른 글
레이어드 아키텍처(Layered Architecture) 란? (0) | 2019.05.13 |
---|---|
Spring MVC를 이용한 웹 페이지 작성 실습 (0) | 2019.03.14 |
Spring MVC란? (0) | 2019.03.14 |
Spring JDBC 실습 (0) | 2019.03.13 |
Spring JDBC 소개 (0) | 2019.03.13 |
댓글