Roel Notebook

[Spring] Spring MVC

by Roel Downey
728x90
반응형

 

Spring Web Module

Model2 MVC 패턴을 지원하는 Spring Web Module

 

 

Spring MVC 기본 동작 흐름

Spring MVC 기본 동작 흐름

파란색 부분 : DataBase를 제외한 나머지는 Spring MVC가 제공해주는 것들이다.

보라색 부분 : 개발자가 만들어야 하는 부분

초록색 부분 : View는 Spring이 제공하는 부분도 있고, 개발자가 만들어야 하는 부분도 있다.

 

1. Request를 보내면 Dispatcher Servlet이 받는다.

2. Dispatcher Servlet은 요청을 처리해줄 컨트롤러와 메서드가 무엇인지 Handler Mapping에게 물어본다. 즉 지금 들어온 요청에 알맞은 컨트롤러가 무엇인지 해당되는 메서드는 무엇인지에 대한 정보를 알아내게 될꺼다.

 

Handler Mapping은 개발자가 만들어놓은 어떤 요청에 어떤 컨트롤러가 동작할지 xml, java 파일에 어노테이션으로 설정이 있다. 이런 정보들을 Spring으로 만들어진 웹 애플리케이션이 실행할 때 Handler Mapping 객체들이 생성이 되면서 관리를 한다.

 

3. 위에서 알아낸 정보를 가지고 Dispatcher Servlet는 Handler Adapter에게 실행을 요청할거다.

4. 결정된 컨트롤러와 해당 메서드가 실행이 되고 그 결과를

5. Model에 받아서 Handler Adapter가 받고 Dispatcher Servlet에게 전달한다.

그럼 Dispatcher Servlet은 컨트롤러가 리턴한 view name을 알아오게 되는데 

6. View Resolver를 통해서 뷰를 출력한다. 

 

 

요청 처리를 위해 사용되는 컴포넌트

- Dispatcher Servlet

    - Handler Mapping

    - HandlerAdapter

    - MultipartResolver

    - LocaleResolver

    - ThemeResolver

    - HandlerExceptionResolver

    - RequestToViewNameTranslator

    - ViewResolver

    - FlashMapManager

 

 

DispatcherServlet

  • 프론트 컨트롤러 (Front Controller)
  • 클라이언트의 모든 요청을 받은 후 이를 처리할 핸들러에게 넘기고 핸들러가 처리한 결과를 받아 사용자에게 응답 결과를 보여준다.
  • DispathcerServlet은 여러 컴포넌트를 이용해 작업을 처리한다.

DispatcherServlet 내부 동작 흐름

DispatcherServlet 내부 동작 흐름

 

 

 

 

요청 선처리 작업시 사용된 컴포넌트

org.springframework.web.servlet.LocaleResolver

  • 지역 정보를 결정해주는 전략 오브젝트이다.
  • 디폴트인 AcceptHeaderLocalResolver는 HTTP 헤더의 정보를 보고 지역정보를 설정해준다.

 

org.springframework.web.servlet.FlashMapManager

  • FlashMap객체를 조회(retrieve) & 저장을 위한 인터페이스
  • RedirectAttributes의 addFlashAttribute메소드를 이용해서 저장한다.
  • 리다이렉트 후 조회를 하면 바로 정보는 삭제된다.
  • Spring 3에서 추가된 기능
  • Redirect로 값을 전달 할 때 사용되는거다. redirect로 값 전달할 때 우리가 ?, 파라미터 이런것들을 이용한다. 이렇게 하면 URL이 굉장히 복잡해지고 URL 길이에 대한 제한도 있다. 그래서 FlashMap을 사용하면 redirect될 때 딱 한 번 값을 유지 시킬수 있게 해주는 이런것을 이야기한다. 즉 FlashMap을 복원한다는 것은 현재 실행이 redirect 되었을 때만 실행이 되는 이런 부분들, 그 부분을 위해서 이런것도 제공하더라 하고 보면 된다.

 

org.springframework.web.context.request.RequestContextHolder

  • 일반 빈에서 HttpServletRequest, HttpServletResponse, HttpSession 등을 사용할 수 있도록 한다.
  • 해당 객체를 일반 빈에서 사용하게 되면, Web에 종속적이 될 수 있다.
  • 스레드 로컬 객체이다. 요청을 받아서 응답할 때까지 HttpServletRequest, HttpServletResponse 등 Spring이 관리하는 객체 안에서 사용할 수 있도록 해주는 것들을 이야기 한다.

 

org.springframework.web.multipart.MultipartResolver

  • 멀티파트 파일 업로드를 처리하는 전략

DispatcherServlet 내부 동작 흐름 상세 - 요청 선처리 작업

DispatcherServlet 내부 동작흐름 상세 - 요청 선처리 작업

 

 

 

 

요청 전달시 사용된 컴포넌트

org.springframework.web.servlet.HandlerMapping

  • HandlerMapping구현체는 어떤 핸들러가 요청을 처리할지에 대한 정보를 알고 있다.
  • 디폴트로 설정되는 있는 핸들러매핑은 BeanNameHandlerMapping과 DefaultAnnotationHandlerMapping 2가지가 설정되어 있다.

 

org.springframework.web.servlet.HandlerExecutionChain

  • HandlerExecutionChain구현체는 실제로 호출된 핸들러에 대한 참조를 가지고 있다.
  • 즉, 무엇이 실행되어야 될지 알고 있는 객체라고 말할 수 있으며, 핸들러 실행 전과 실행 후에 수행될 HandlerInterceptor도 참조하고 있다.

 

org.springframework.web.servlet.HandlerAdapter

  • 실제 핸들러를 실행하는 역할을 담당한다.
  • 핸들러 어댑터는 선택된 핸들러를 실행하는 방법과 응답을 ModelAndView로 변화하는 방법에 대해 알고 있다.
  • 디폴트로 설정되어 있는 핸들러어댑터는 HttpRequestHandlerAdapter, SimpleControllerHandlerAdapter, AnnotationMethodHanlderAdapter 3가지이다.
  • @RequestMapping과 @Controller 애노테이션을 통해 정의되는 컨트롤러의 경우 DefaultAnnotationHandlerMapping에 의해 핸들러가 결정되고, 그에 대응되는 AnnotationMethodHandlerAdapter에 의해 호출이 일어난다.

 

DispatcherServlet 내부 동작 흐름 상세 - 요청 전달

DispatcherServlet 내부 동작흐름 상세 - 요청 전달

 

 

 

 

 

요청 처리시 사용된 컴포넌트

org.springframework.web.servlet.ModelAndView

  • ModelAndView는 Controller의 처리 결과를 보여줄 view와 view에서 사용할 값을 전달하는 클래스이다.

 

org.springframework.web.servlet.RequestToViewNameTranslator

  • 컨트롤러에서 뷰 이름이나 뷰 오브젝트를 제공해주지 않았을 경우 URL과 같은 요청정보를 참고해서 자동으로 뷰 이름을 생성해주는 전략 오브젝트이다. 디폴트는 DefaultRequestToViewNameTranslator이다.

 

DispatcherServlet 내부 동작 흐름 상세 - 요청 처리

DispatcherServlet 내부 동작흐름 상세 - 요청 처리

 

 

 

 

 

 

예외 처리시 사용된 컴포넌트

org.springframework.web.servlet.handlerexceptionresolver

  • 기본적으로 DispatcherServlet이 DefaultHandlerExceptionResolver를 등록한다.
  • HandlerExceptionResolver는 예외가 던져졌을 때 어떤 핸들러를 실행할 것인지에 대한 정보를 제공한다.

 

DispatcherServlet 내부 동작 흐름 상세 - 예외 처리

DispatcherServlet 내부 동작흐름 상세 - 예외처리

 

 

 

 

 

뷰 렌더링 과정시 사용된 컴포넌트

org.springframework.web.servlet.ViewResolver

  • 컨트롤러가 리턴한 뷰 이름을 참고해서 적절한 뷰 오브젝트를 찾아주는 로직을 가진 전략 오프젝트이다.
  • 뷰의 종류에 따라 적절한 뷰 리졸버를 추가로 설정해줄 수 있다.

 

DispatcherServlet 내부 동작 흐름 상세 - 뷰 렌더링

DispatcherServlet 내부 동작흐름 상세 - 뷰 렌더링 과정

 

DispatcherServlet 내부 동작흐름 상세 - 요청 처리 종료

 

 

 

 

728x90
반응형

블로그의 정보

What doing?

Roel Downey

활동하기