Domain/Spring

[Spring] Spring MVC ( DispatcherServlet / HandlerMapping / HandlerAdapter / ViewResolver / View )

by Donghwan 2021. 9. 18.

Spring MVC

MVC는 Model-View-Controller의 약자로 MVC 패턴이라고 불립니다. MVC 패턴은 MVC1,MVC2가 있습니다. Spring MVC는 MVC2의 구조를 가집니다. MVC2는 Model, View, Controller가 역할을 나누어 처리하기 때문에 MVC1에 비해 확장에 유리하고, 유지보수하기 쉽다는 장점이 있습니다.

 

Spring MVC의 동작

<Spring MVC의 핵심 구성 요소> Spring bean으로 표시 된 요소들은 스프링 빈으로 등록해야 하는것을 의미

  1. Client가 보낸 요청을 DispatcherServlet이 감지합니다.
  2. DispatcherServlet은 HandlerMapping에게 Controller의 탐색을 요청합니다.
  3. HandlerMapping은 Client의 요청 경로를 이용하여 Controller 빈 객체를 DispatcherServlet에 리턴합니다.
  4. DispatcherServlet은 HandlerMapping으로부터 리턴받은 결과(Controller 빈 객체)를 HandlerAdapter에게 요청 처리를 위임합니다.
  5. HandlerAdapter는 Controller의 알맞은 메서드를 호출합니다.
  6. Controller는 호출의 결과를 HandlerAdpater에게 리턴합니다.
  7. HandlerAdapter는 ModelAndView 객체로 변환해서 DispatcherServlet에 리턴합니다.
  8. DispatcherServlet은 결과를 보여줄 View를 찾기 위해 ViewResolver 빈 객체를 사용하여 Controller가 리턴한 ModelAndView의 이름을 검색합니다. 
  9. ViewResolver는 해당하는 View 객체를 찾거나 생성해서 리턴합니다.
  10. DispatcherServelt은 ViewResolver가 리턴한 View 객체에게 응답 결과 생성을 요청합니다.
  11. 응답 결과를 Client에게 전달합니다.

 

DispatcherServlet

클라이언트에서 어떤 요청이 들어오면 톰캣과 같은 Servlet Container가 요청을 받게 됩니다. 이때 DispatcherServlet은 서버로 들어오는 모든 요청을 받아서 처리하고 공통처리 작업을 처리한 후, 이외의 작업을 적절한 세부 Controller에게 처리하도록 하고 예외 발생 시 일괄적인 방식으로 에러를 처리해주는 Front Controller입니다.

Front Controller
주로 서블릿 컨테이너의 제일 앞에서 서버로 들어오는 클라이언트의 모든 요청을 받아서 처리해주는 컨트롤러로써, MVC 구조에서 함께 사용되는 디자인 패턴입니다.

Spring MVC는 DispatcherServlet을 사용함에 따라 web.xml의 역할이 축소 되었습니다. 기존에는 Servlet에 대해 URL 매핑을 활용하기 위해서 web.xml에 전부 등록해주어야 했지만, DispatcherServlet이 해당 애플리케이션으로 들어오는 모든 요청을 핸들링해주어 작업을 상당히 편리하게 할 수 있게 되었습니다.

 

HandlerMapping

Spring MVC는 웹 요청을 처리할 수 있는 범용 프레임워크입니다. Spring에서 대표적으로 @Controller 어노테이션이 적용한 클래스를 이용하여 클라이언트의 요청을 처리하지만 원한다면 자신이 직접 만든 클래스를 이용해서 클라이언트이 요청을 처리할 수도 있습니다(@Controller, Controller 인터페이스, HttpRequestHandler 인터페이스). 즉, DispatcherServlet 입장에서는 클라이언트 요청을 처리하는 객체의 타입이 반드시 @Controller 클래스 타입일 필요가 없다는 의미입니다. 이런 이유로 Spring MVC는 웹 요청을 실제로 처리하는 객체를 Handler라고 표현하고 있으며 웹 요청을 처리하는 객체는 모두 Handler라고 보고 있습니다. 따라서 특정 요청 경로를 처리해주는 Hanlder를 찾아주는 객체를 HandlerMapping이라고 부릅니다.

 

HandlerAdapter

DispatcherServlet이 HanlderMapping을 통해 컨트롤러 객체를 전달받았다고해서 바로 컨트롤러 객체의 메서드를 실행할 수 있는 것은 아닙니다. DispatcherServlet은 @Controller 어노테이션을 이용해서 구현한 컨트롤러뿐만 아니라 Controller 인터페이스를 구현한 컨트롤러, 그리고 특수 목적으로 사용되는 HttpRequestHandler 인터페이스를 구현한 클래스를 동일한 방식으로 실행할 수 있도록 만들어 졌습니다. DispatcherServlet은 이러한 핸들러 객체의 실제 타입에 상관없이 실행 결과를 ModelAndView라는 타입으로만 받을 수 있으면 됩니다.이때 @Controller, Controller 인터페이스, HttpRequestHandler 인터페이스를 동일한 방식으로 처리하기 위해 중간에 사용되는 것이 바로 HandlerAdapter 빈 입니다.

 

ViewResolver

InternalResourceViewResolver 클래스를 이용하여 InternalResourceView 타입의 View 객체를 리턴합니다. InternalResourceViewResolver는 Prefix와 Surfix를 이용하여 "Prefix+View이름+Surfix" 경로를 뷰 코드로 사용하는 InternalResourceView 객체를 리턴합니다. DispatcherServlet으로부터 ModelAndView 형태의 Input을 받게 됩니다. 이때 Model에 담긴 값은 View 객체에 Map 형식으로 전달됩니다.

 


참고자료

728x90
반응형

댓글