Spring/Spring MVC

[Spring MVC] 1-2. DispatcherServlet: Special Bean Types

noahkim_ 2023. 10. 16. 01:44

1. DispatcherServlet의 위임 구조

  • DispatcherServlet는 WebApplicationContext의 대리 구성요소들에 작업을 위임하여 요청을 처리합니다.
  • 대리 구성요소는 Spring IoC Container에 Bean으로 등록되어 적절하게 사용됩니다. (커스터마이징 가능)

 

2. 처리 흐름

 

 

단계 설명
관련 구성요소 (전략)
1. 요청 수신 클라이언트의 HTTP 요청이 DispatcherServlet에 도착 -
2. Handler 찾기 요청 URL에 맞는 컨트롤러(핸들러)를 찾음
HandlerMapping
(RequestMappingHandlerMapping)
3. HandlerAdapter 선택 찾은 Handler를 실행할 수 있는 Adapter를 선택
HandlerAdapter
(RequestMappingHandlerAdapter)
4. 핸들러 실행 실제 비즈니스 로직이 실행됨
(@Controller, @RestController)
Controller
ArgumentResolver
5. 예외 발생 시 처리 예외가 발생한 경우, 해결할 수 있는 Resolver를 탐색 HandlerExceptionResolver
6. ModelAndView 반환 핸들러가 처리 결과를 ModelAndView 형태로 반환 -
7. View 이름 해석 논리적 뷰 이름을 실제 뷰로 변환
ViewResolver
(JSP, Thymeleaf 등)
8. View 렌더링 View에 Model 데이터를 바인딩하고 HTML 생성
View 객체
(JstlView)
9. 응답 반환
렌더링된 결과를 HTTP Response로 클라이언트에 전송
 

 

3. 대리 구성요소

구성 요소 설명
주요 구현체 / 특징
HandlerMapping 웹 요청을 적절한 핸들러에 연결
RequestMappingHandlerMapping: @RequestMapping 
SimpleUrlHandlerMapping: 명시적 URL 패턴 매핑
HandlerAdapter 핸들러 호출을 지원
요청 처리에 대한 세부사항을 숨김
요청마다 다른 핸들러의 호출 방식을 추상화
애노테이션 해석, 바인딩, 변환 등 지원
HandlerExceptionResolver 예외 처리 전략 담당
예외를 HTML 뷰 또는 특정 핸들러에 매핑
ViewResolver 논리적인 뷰 이름을 실제 뷰로 변환
InternalResourceViewResolver
ThymeleafViewResolver
LocaleResolver
LocaleContextResolver
요청자의 언어 및 시간대 해석
국제화(i18n) 지원
ThemeResolver 사용자 테마 해석
사용자별 테마 적용 가능 (스킨, 스타일 변경 등)
MultipartResolver 파일 업로드 요청 처리
CommonsMultipartResolver
StandardServletMultipartResolver 등
FlashMapManager 리디렉션 간 데이터 전달
(Flash Attribute 저장 및 검색)
주로 POST-Redirect-GET 패턴에서 사용됨

 

설정) ViewResolver

더보기

Thymeleaf

@Configuration
@EnableWebMvc
@ComponentScan
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public SpringResourceTemplateResolver templateResolver() {
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setPrefix("classpath:/templates/");
        resolver.setSuffix(".html");
        resolver.setTemplateMode("HTML");
        resolver.setCharacterEncoding("UTF-8");

        return resolver;
    }

    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setTemplateResolver(templateResolver());
        engine.setEnableSpringELCompiler(true);
        return engine;
    }

    @Override // 뷰 리졸버 등록
    public void configureViewResolvers(ViewResolverRegistry registry) {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        resolver.setCharacterEncoding("UTF-8");
        registry.viewResolver(resolver);
    }
}
  • SpringResourceTemplateResolver: 템플릿의 위치, 형식, 인코딩 등을 지정하는 객체
  • SpringTemplateEngine: 타임리프의 엔진 (템플릿 처리 로직의 핵심 클래스)

 

 

출처