ch10. 스프링 MVC 프레임워크 동작 방식

728x90
참고 도서 : 스프링5 프로그래밍 입문 - 최범균 저

ch10. 스프링 MVC 프레임워크 동작 방식 

 

[스프링 MVC 핵심 구성요소와 각 요소 간의 관계]

중앙의 DispatcherServlet은 모든 연결을 담당

 웹브라우저 -> DispatcherServlet 요청
-웹브라우저로부터 요청이 들어오면 그 요청을 처러하기 위한 컨트롤러 객체를 검색하기 위해
DispatcherServlet HandlerMapping 빈 객체에게 컨트롤러 검색을 요청함



 HandlerMapping은 클라이언트의 요청 경로를 이용하여
이 요청 경로를 처리할 컨트롤러 빈 객체를 찾고 다시 DispatcherServlet에게 전달


 DspatcherServlet HandlerMapping이 찾아준 컨트롤러 객체를 처리할 수 있는
HandlerAdapter 빈 객체에게 요청 처리를 위임함.


 HandlerAdapter는 컨트롤러의 알맞은 메소드 호출하여 요청을 처리


 처리한 결과를 HandlerAdapter에 전달


 HandlerAdater는 컨트롤러 실행 결과를 ModelAndView타입 객체로 변환하여
그 결과를 DispatcherServlet에 리턴
                                                  *ModelAndView 타입으로 변환 시, 컨트롤러가 리턴한 뷰 이름을 담고 있음

 
DispatcherServlet ViewResolver 빈 객체로 컨트롤러의 실행 결과 보여줄 View 검색

-ViewResolver는 뷰 이름에 해당하는 View 객체를 찾거나 생성해서 DispatcherServlet에 리턴함

 
DispatcherServlet ViewResolver 이 리턴한 View 객체에게 응답 결과 생성을 요청



 웹 브라우저에 전송할 응답 결과를 생성

[컨트롤러와 핸들러]

- 컨트롤러 : 클라이언트의 요청을 실질적으로 처리하는 것

- 핸들러 : 웹 요청을 실제로 처리하는 객체

 

[DispatcherServlet 과 스프링 컨테이너]

-앞서, DispatcherServletcontextConfiguration초기화 파라미터를 이용해서 스프링 설정 클래스 목록을 전달한 바 O

           -DispatcherServlet은 전달받은 설정 파일을 이용해서 스프링 컨테이너를 생성한다.

           -HandlerMapping/HandlerAdapter/컨트롤러/ViewResolver 등의 빈은                                                       모두 DispatcherServlet이 생성한 스프링 컨테이너에서 구하므로 설정 파일에 이들 빈에 대한 정의가 포함되어야 한다.

[@Controller를 위한 HandlerMappingHandlerAdapter]

-DispatcherServlet

[HandlerMapping]를 웹 브라우저의 요청을 처리할 핸들러 객체를 찾기 위해 사용하고                                              [HandlerAdapter]를 핸들러를 실행하기 위해 사용한다,

-알맞은 빈이 스프링 설정에 등록되어 있어야 한다.

-이를 위해 < @EnableWebMvc 애노테이션 추가 > 한다.

           -➀ @Controller 컨트롤러를 위한 설정을 생성

이 태그가 빈으로 추가해주는 클래스 중에는                                                                                                                 @Controller타입 핸들러 객체를 처리하기 위한 다음의 두 클래스가 포함되어 있다.

-RequestMappingHandlerMapping
:@Controller이 적용된 객체의 요청 매핑 애노테이션(@GetMapping) 값을 이용해서
                                                                                   웹 브라우저의 요청을 처리할 컨트롤러 빈을 찾는다
.

-RequestMappingHandlerAdapter
: 컨트롤러의 메소드를 알맞게 실행하고 그 결과를 ModelAndView 객체로 변환하여 DispatcherServlet에 리턴한다,

 

[WebMvcConfigurer 인터페이스와 설정]

@EnableWebMvc 애노테이션 사용

- @Controller 컨트롤러를 위한 설정을 생성

- WebMvcConfigurer 타입의 빈을 이용 -> MVC 설정 추가 생성

-webMvcConfigurer 인터페이스 속 메소드를 재정의하여 알맞은 뷰 관련 설정을 추가하여 사용하기도 한다,

@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
	
	@Override
	public void configureDefalutServletHandling(
			DefaultServletHandlerConfigurer configurer) {
	configurer.enale();
   	}

	@Override
	public void configureCiewResolvers(ViewResolverRegistry registry) {
		registry.jsp("/WEB-INF/wiew", ".jsp");
	}
}

 

[JSP를 위한 ViewResolver]

-WebMvcConfigurer 인터페이스에 정의된 configureViewResolvers() 메소드는 속 파라미터를 사용하여 jsp() 메소드를 사용하면 JSP를 위한 ViewResolver를 설정할 수 있다.

-결과적으로 컨트롤러에서 지정한 Model 속성은 requrest 객체 속성으로 JSP에 전달되기 때문에 JSP는 모델에 지정한 속성이름을 사용해서 값을 사용할 수 있게 된다.

 

[디폴트 핸들러와 HandlerMapping의 우선순위]

RequestMappingHandlerMapping 적용 우선순위 > SimpleUrlHandlerMapping의 우선순위

-@EnableWebMvc 이 등록하는 RequestMappingHandlerMapping 적용 우선순위가

DefaultServletHandlerConfigurer#enabler() 메소드가 등록하는 SimpleUrlHandlerMapping의 우선순위보다 높다.

 

따라서 DispatcherServlet은 웹 브라우저의 요청이 들어오면

RequestMappingHandlermapping 사용 -> 요청 처리할 핸들러 검색

   -존재 O : 해당 컨트롤러 이용 요청 처리

➁  존재 X : SImpleUrlHandlerMapping 사용 -> 요청 처리할 핸들러 검색

 

<<정리>>
[DispatcherServlet]
-웹 브라우저의 요청 받는 창구 역할
-다른 구성요소 이용 요청 흐름 제어 역할

[HandlerMapping]
-클라이언트 요청을 처리할 핸들러 객체 검색(찾아줌)

[ 핸들러(커맨드)객체 ]
-클라이언트의 요청을 실제로 처리한 뒤 뷰 정보와 모델을 설정

[HandlerAdapter]
-DispatcherServlet과 핸들러 객체 사이의 변환 처리

[ViewResolver]

-요청 처리 결과를 생성할 View 찾아주고 View는 최종적으로 클라이언트에 응답생성하여 전달
 

728x90