Spring - 스프링 MVC 프레임워크 동작 방식

스프링 MVC 핵심 구성 요소

스프링 MVC는 여러 구성요소가 존재하고 이 구성요소들은 작동하는 순서가 있다.

기본적으로 DispatcherServlet은 중간에서 모든 연결을 담당한다.

  1. 요청 전송
  • 요청이 들어온다.
  1. 요청 URL과 매칭되는 컨트롤러 검색
  • 요청이 들어오면 DispatcherServlet은 그 요청을 처리하기 위한 컨트롤러 객체를 검색한다.
  • 이 경우 직접 검색하지 않고 HandlerMapping이라는 빈 객체에게 컨트롤러 검색을 요청한다.
  1. 처리요청
  • HandlerAdapter 빈을 이용하여 처리를 요청하고 이 때 컨트롤라가 실행된 다음 결과가 리턴된다.
  1. 컨트롤러 실행 결과를 ModelAndView로 반환해서 리턴
  • 컨트롤러가 반환한 결과를 HandlerAdapter는 컨트롤러의 처리 결과를 ModelAndView라는 객체로 변환해서 DispatcherServlet에 리턴한다.
  1. 컨트롤러의 실행 결과를 보여줄 View 검색
  • DispatcherServlet은 결과를 보여줄 뷰를 찾기 위해 ViewResolver 빈 객체를 사용한다.
  1. 응답 생성 요청 및 응답 생성
  • DispatcherServlet은 ViewResolver가 리턴한 View 객체에게 응답 결과 생성을 요청한다.

클라이언트의 요청을 실제로 처리하는 것은 컨트롤러이고 DispatcherServet은 클라이언트의 요청을 전달받는 창구 역할을 한다.

DispatcherServlet과 스프링 컨테이너

DispatcherServlet은 전달받은 설정 파일을 이용해서 스프링 컨테이너를 생성하는데 HandlerMapping, HandlerAdapter, 컨트롤러, ViewResolver 등의 빈은 DispatcherServlet이 생성한 스프링 컨테이너에서 구한다.

@Controller를 위한 HandlerMapping, HandlerAdapter

  • HandlerMapping
    웹 브라우저의 요청을 처리할 컨트롤러 빈을 찾는다.
  • HandlerAdapter
    컨트롤러의 메서드를 알맞게 실행하고 그 결과를 ModelAndVie 객체로 변환해서 DispatcherServlet에 리턴한다.

위의 두 개의 객체는 빈 객체인데 이는 스프링 설정에 등록되어 있어야 한다, 이는 @EnableWebMvc 어노테이션만 추가하면 따로 등록을 하지 않아도 된다.

디폴트 핸들러

매핑 경로가 '/'안 경우 .jsp로 끝나는 요청을 제외한 모든 요청을 DispatcherServlet이 처리한다.

@EnableWebMvc 애노테이션이 등록하는 HandlerMapping은 @Controller 어노테이션을 적용한 빈 객체가 처리할 수 있는 요청 결로만 대응할 수 있다. 즉, /index.html, /asda.css 등 다른 요청을 처리할 수 있는 컨트롤러 객체를 찾지 못한다.

WebMvcConfigurer 인터페이스에 configureDefaultServletHanding() 메서드가 있는데 이를 사용하면 .jsp 요청이 아닌 다른 요쳥도 처리가 가능하다.

@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer{
	
	 @Override
	public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
		configurer.enable();
	}
	 
	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		registry.jsp("/WEB-INF/view/", ".jsp");
	}
}

0개의 댓글