본문 바로가기
  • 실행력이 모든걸 결정한다
Spring Series/Spring Framework

[Spring] DispatcherServlet의 DI 전략

by 김코더 김주역 2022. 7. 13.
반응형

1. DispatcherServlet의 소개 및 역할

- DispatcherServlet은 클라이언트로부터 최초로 요청을 받는 프론트 컨트롤러 역할을 하는 서블릿으로, 이 곳을 기점으로 작업을 분배하게 된다.

- Spring의 웹 기술을 구성하는 다양한 전략을 DI로 구성해서 동작 방식을 확장하도록 만들어져 있다.

- 대부분의 상황에 적절하게 사용될 수 있는 전략들이 기본적으로 설정되어 있으며, 이 디폴트 전략들은 spring-webmvc.jar에 들어 있는 DispatcherServlet.properties 설정파일로부터 가져온다.

- 설정 파일에 명시적으로 DispatcherServlet의 전략 bean을 등록하면 DispatcherServlet의 디폴트 전략은 무시된다.

- Spring 3.0에서는 최신 기술을 적용한 전략들을 한 번에 등록해주는 전용 태그도 제공된다.

 

 

2. 여러가지 DI 전략들

1) HandlerMapping

- URL과 요청 정보를 기준으로 어떤 컨트롤러를 사용할 것인지 결정

- HandlerMapping 인터페이스를 구현

- 기본적으로 BeanNameUrlHandlerMapping과 DefaultAnnotationHandlerMapping 2가지의 핸들러 매핑이 지정되어 있음

요청의 처리 단위로 클래스보다 메소드가 선호되기 시작하면서, Spring 3.1에서 DefaultAnnotationHandlerMapping 전략이 RequestMappingHandlerMapping 전략으로 대체됨. RequestMappingHandlerMapping은 @RequestMapping 메소드의 정보를 추상화한 HandlerMethod 타입의 오브젝트를 핸들러 어댑터에 전달하는 전략을 사용함

 

2) HandlerAdapter

- HandlerMapping을 통해 선택한 컨트롤러를 호출할 수 있도록 지원

- 컨트롤러 메소드의 파라미터에 맞게 클라이언트의 요청 정보를 추출해서 제공함

- 기본적으로 HttpRequestHandlerAdapter, SimpleControllerHandlerAdapter, AnnotationMethodHandlerAdapter 3가지의 핸들러 어댑터가 지정되어 있음

Spring 3.1에서 AnnotationMethodHandlerAdapter 전략이 RequestMappingHandlerAdapter 전략으로 대체됨. 핸들러 매핑이 전달해준 HandlerMethod 오브젝트의 정보를 이용해 컨트롤러 메소드를 실행하는 전략을 사용할 수 있음

- 핸들러 매핑과 핸들러 어댑터는 다양한 조합으로 구성될 수 있다. 여러 핸들러 매핑이 하나의 어댑터와 대응될 수도 있고, 하나의 핸들러 매핑이 여러 어댑터와 대응될 수도 있다.

 

3) HandlerExceptionResolver

- 예외가 발생했을 때의 처리를 담당

- 예외의 종류에 따라 특정 에러 페이지를 표시하거나, 관리자에게 통보하는 식의 처리가 가능하다.

- 등록된 HandlerExceptionResolver 중에서 발생한 예외에 적합한 것을 찾아서 예외처리를 위임한다.

- 기본적으로 AnnotationMethodHandlerExceptionResolver, ResponseStatusExceptionResolver, DefaultHandlerExceptionResolver 3가지의 예외 처리기가 지정되어 있음

Spring 3.1에서 AnnotationMethodHandlerExceptionResolver 전략이 ExceptionHandlerExceptionResolver 전략으로 대체됨

 

4) ViewResolver

- 컨트롤러가 반환한 view 이름을 참고하여 적절한 뷰 오브젝트를 탐색

- 기본적으로 InternalResourceViewResolver가 지정되어 있음

- 뷰의 종류에 따라 적절한 뷰 리솔버를 추가해야 한다.

 

5) LocalResolver

- 지역 정보를 결정

- 기본적으로 AcceptHeaderLocaleResolver가 지정되어 있는데, 이는 HTTP의 헤더를 참고하여 지역 정보를 설정한다. 이 전략을 변경하여 세션, 쿠키, URL 파라미터 등 다양한 방식으로 지역 정보를 결정할 수 있도록 할 수 있다.

 

6) ThemeResolver

- 테마 정보를 결정

- 자주 쓰이지는 않음

 

7) RequestToViewNameTranslator

- 컨트롤러에서 뷰 이름이나 뷰 오브젝트를 반환하지 않았을 경우에 HTTP 요청 정보를 참고해서 뷰 이름을 생성해주는 전략이다.

- https://kimcoder.tistory.com/483의 [3-4) RequestToViewNameTranslator]를 참고하자.

 

 

 

● 참고 자료 : 토비의 스프링 3.1 Vol.2

 

반응형

댓글