본문 바로가기
Progamming/BoostCourse

Spring MVC 구성요소

by 동그란 혜주 2019. 3. 14.
  • 들어가기 전에

이번 시간에는 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

댓글