본문 바로가기

IT/SpringMVC

8. Spring MVC구성요소

@ 아래 내용은 https://www.edwith.org/boostcourse-web/ 사이트의 강의를 정리한 글 입니다. 



Spring MVC 기본 동작 흐름




DispatcherServlet

  • 프론트 컨트롤러 (Front Controller) // 이것은 어떤 회사의 대표번호로 전화 걸면 총무부는 1번 , 뭐는 2번 으로 넘겨주는 그런 역할 이라 할 수 있다. 
  • 클라이언트의 모든 요청을 받은 후 이를 처리할 핸들러에게 넘기고 핸들러가 처리한 결과를 받아 사용자에게 응답 결과를 보여준다.
  • DispathcerServlet은 여러 컴포넌트를 이용해 작업을 처리한다.

// 프론트 컨트롤러는 이론적으로는 한개 이상 사용할 수 있다 하는데 보통 한개 정도만 사용 한다.


// 사실 스프링 mvc를 간단하게 사용한다면 저번 강의 까지 만 이해하면 크게 문제 없지만 더 깊게 이해하고 싶다면
이 강의 까지 들으면 좋다. 지금 내용이 무엇인지 잘 이해가 안가도 크게 문제가 없다. 그냥 읽고 넘어 가시면 되겠다.

// 크게 이런 형식으로 동작 
//먼저 요청 선처리 작업부터 보자 
DispatcherServlet 내부 동작흐름
DispatcherServlet 내부 동작흐름 상세 - 요청 선처리 작업

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

org.springframework.web.servlet.LocaleResolver

  • 지역 정보를 결정해주는 전략 오브젝트이다. // 언어 세팅 관련 내용이다. 
  • 디폴트인 AcceptHeaderLocalResolver는 HTTP 헤더의 정보를 보고 지역정보를 설정해준다.

org.springframework.web.servlet.FlashMapManager

  • FlashMap객체를 조회(retrieve) & 저장을 위한 인터페이스
  • RedirectAttributes의 addFlashAttribute메소드를 이용해서 저장한다.
  • 리다이렉트 후 조회를 하면 바로 정보는 삭제된다.
  • // 스프링 3에서 추가된 기능이다 

org.springframework.web.context.request.RequestContextHolder

  • 일반 빈에서 HttpServletRequest, HttpServletResponse, HttpSession 등을 사용할 수 있도록 한다.
  • 해당 객체를 일반 빈에서 사용하게 되면, Web에 종속적이 될 수 있다. //아주 권장 하는 방법은 아니다.

org.springframework.web.multipart.MultipartResolver

  • 멀티파트 파일 업로드를 처리하는 전략
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 내부 동작흐름 상세 - 요청 처리

//인터셉터는 일종의 필터라 생각하면 되겠다.

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

org.springframework.web.servlet.ModelAndView

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

org.springfamework.web.servlet.RequestToViewNameTranslator

컨트롤러에서 뷰이름이나 뷰 오브젝트를 제공해주지 않았을 경우 URL과 같은 요청정보를 참고해서 자동으로 뷰이름

을 생성해주는 전략오브젝트이다.디폴트는 DefaultRequestToViewNameTranslator이다. 

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

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

org.springframework.web.servlet.handlerexceptionresolver

  • 기본적으로 DispatcherServlet이 DefaultHandlerExceptionResolver를 등록한다.
  • HandlerExceptionResolver는 예외가 던져졌을 때 어떤 핸들러를 실행할 것인지에 대한 정보를 제공한다.
DispatcherServlet 내부 동작흐름 상세 - 뷰 렌더링 과정

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

org.springframework.web.servlet.ViewResolver

  • 컨트롤러가 리턴한 뷰 이름을 참고해서 적절한 뷰 오브젝트를 찾아주는 로직을 가진 전략 오프젝트이다.
  • 뷰의 종류에 따라 적절한 뷰 리졸버를 추가로 설정해줄 수 있다.
DispatcherServlet 내부 동작흐름 상세 - 요청 처리 종료

//참고로 저는 이과정을 한바퀴돌고 개인적으로 프로젝트를 진행하며 두번째 보는 거지만 50퍼센트 밖에 이해가 안갑니다.. 흠.. 



생각해보기

  1. DispacherServlet은 요청을 받은 후, 요청을 처리하기 위해서 여러가지 작업을 수행하고 있습니다. 
  2. 개발자는 DispacherServlet이 어떤 방식으로 동작하는지 이해한다면 좀 더 잘 Spring MVC를 잘 사용할 수 있습니다.
  3. Spring외에 다른 프레임워크를 학습할 때에도, 해당 프레임워크의 동작원리를 이해하는 것은 굉장히 중요합니다.
  4. 어떻게 하면, 다른 사람이 만든 라이브러리나 프레임워크를 좀 더 잘 이해할 수 있을지 고민해보세요.


'IT > SpringMVC' 카테고리의 다른 글

10. 레이어드 아키텍처(Layered Architecture) 란?  (0) 2018.09.04
9. Spring MVC를 이용한 웹 페이지 작성 실습  (0) 2018.08.27
7. Spring MVC란?  (0) 2018.08.27
6. Spring JDBC 실습  (0) 2018.08.24
5. Spring JDBC 소개  (0) 2018.08.24