
Spring MVC에서 가장 핵심은 Front Controller라고 할 수 있다.
Spring MVC에서는 Front Controller의 역할을 DispatcherServlet이 담당하게 된다.
위 그림은 스프링 MVC 전체 흐름을 나타낸 그림이다. 순서에 맞춰서 설명을 해보겠다.
핸들러 매핑을 통해 요청된 URL에 알맞은 핸들러(컨트롤러)를 찾는다.
0 = RequestMappingHandlerMapping : 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
1 = BeanNameUrlHandlerMapping : 스프링 빈의 이름으로 핸들러를 찾는다
핸들러 매핑은 위와 같이(실제로는 더 많다) 나뉘게 되는데 각 요청에 맞는 핸들러(Controller)를 순회를 통해 가져오게 된다.
0 = RequestMappingHandlerAdapter : 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
1 = HttpRequestHandlerAdapter : HttpRequestHandler 처리
2 = SimpleControllerHandlerAdapter : Controller 인터페이스(애노테이션X, 과거에 사용) 처리
핸들러 조회를 통해 얻어온 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다(supports() 이용). 핸들러 어댑터가 필요한 이유는 @Controller, HttpRequestHandler, SimpleController, @RestController 등 다양한 핸들러가 존재하는데 이를 일관성있게 처리해주기 위해서다. 쉽게 말해서 DispatcherServlet에서는 다른 핸들러를 사용하더라도 항상 일관된 형식으로 결과값을 반환받아 다음 작업을 처리해야한다. 그러기 위해서는 핸들러 어댑터라는 인터페이스와 그 구현체를 이용할 수 있다.
DispatcherServlet에서 찾아온 핸들러 어댑터를 실행하며 그 핸들러의 정보도 같이 넘겨준다.
핸들러 어댑터 내부에서 실행하고 그 결과를 반환한다.
핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환한다.
- InternalResourceViewResolver: 내부 리소스에 위치한 뷰를 찾아내는 뷰 리졸버이다. 주로 JSP, HTML과 같은 정적인 뷰를 처리한다.
- UrlBasedViewResolver: 지정된 URL에 따라 뷰를 해석하는 뷰 리졸버이다. 주로 외부 리소스에 위치한 뷰를 처리하거나, 뷰 이름에 특정한 규칙을 적용하는데 사용된다.
예시코드
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/"); // JSP 파일이 저장된 경로
viewResolver.setSuffix(".jsp"); // JSP 파일 확장자
return viewResolver;
}
뷰 리졸버가 뷰의 논리 이름을 물리 이름(실제 뷰가 저장된 경로)으로 바꾸고, 렌더링 역할을 하는 뷰 객체를 반환한다.
뷰를 통해 뷰를 렌더링한다.
그림 출처
(출처 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard)