DispatcherSerlvet은 스프링에서도 전략 패턴이 가장 잘 적용되있는 클래스로 꼽힌다. 7가지의 기본 전략을 자유롭게 확장, 변경하면 스프링MVC를 일종의 기반 프레임워크로 삼아 애플리케이션 만의 고유한 MVC 프레임워크를 재구성할 수 있다.

스프링MVC를 잘 사용하려면 이 7가지 전략의 성격과 동작원리를 잘 이해해야 하고, 특히 빈으로 직접 전략을 지정하지 않았을 때 fallback방식으로 자동 등록되는 디폴트 전략이 무엇인지 알고 있어야 한다. 뭐가 어떻게 돌아가고 있는지 파악해야 한다는 말이다. 기계적으로 책이나 샘플에 나온 MVC 설정 빈의 예를 무작정 배껴서 사용하는 것은 한심할 뿐더러, 위험하다.

아무런 설정을 하지 않았을 때 적용되는 디폴트 전략에 대해서는 DispatcherServlet의 API문서에 잘 나와있다. 실제로는 DispatcherServlet.properties라는 파일에 디폴트 전략이 들어있다. 보통 DI를 적용했어도 디폴트 오브젝트를 설정해두는 경우가 많은데, 이 때의 단점은 설정이 들어가면 코드 상에서 미리 만들었던 디폴트 오브젝트가 무의미해지는 것이다. 쓸 데 없는 메모리 낭비랄까. 그런 이유 때문인지 뭔지는 모르겠지만, 아무튼 DispatcherServlet은 이 파일을 읽어서 디폴트 전략으로 사용할 클래스 목록을 확보한다. 그리고 전략 타입이나 이름으로 빈을 찾아서 없는 경우에 이 디폴트 전략 클래스를 적용한다.

이 DispatcherServlet.properties 파일을 직접 바꿔서 디폴트 전략 구성을 하는 방법도 제공해주면 좋을 것 같은데, 파일 이름은 고정이다. 게다가 여러 개의 DispatcherServlet을 사용하는 경우를 고려해서 인지 파일을 읽은 정보를 static 변수에 저장해둔다. 굳이 방법을 찾자면 defaultStrategies라는 private static  final Properties 변수 값을 바꿔치기 하는 것인데, final을 어떻게 바꿀 수 있나? 음..? 바이트코드 조작을 사용하는 CGLib도 손 못대는 final인데.

결국 귀찮으니 서블릿 컨텍스트에 지정하는 수 밖에 없는데, 이게 양이 많아지면 매 프로젝트마다 비슷한 설정을 하는 것이 귀찮다. 그래서 최신 설정을 모아서 등장한 <mvc:annotation-driven /> 같은 게 있는데, 이건 또 내부에서 정의하는 각종 전략+설정용 빈을 바꾸지 못하는 단점이 있다.

결국 꼼꼼하게 스프링MVC 환경을 셋업하려면 일일히 빈으로 등록해주는 수 밖에. 디폴트 전략을 그대로 쓰려면 무엇이 설정되는지쯤은 기억해둬야 할테고. 기억못하면 그때그때 찾아보기라도 해야 할테고.

다음은 DispatcherServlet.properties에 담긴 기본 전략들이다. 아무런 MVC설정을 안해줘도 이만큼이 자동으로 적용되 돌아간다는 사실. 전략이 여러 개 인 것들은 이 중에 하나를 명시적으로 빈으로 설정해주면 나머지는 반영 안되다는 데 주의.

org.springframework.web.servlet.LocaleResolver= org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

org.springframework.web.servlet.ThemeResolver= org.springframework.web.servlet.theme.FixedThemeResolver

org.springframework.web.servlet.HandlerMapping= org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
    org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

org.springframework.web.servlet.HandlerAdapter= org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
    org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

org.springframework.web.servlet.HandlerExceptionResolver= org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\
    org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
    org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

org.springframework.web.servlet.RequestToViewNameTranslator= org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

org.springframework.web.servlet.ViewResolver= org.springframework.web.servlet.view.InternalResourceViewResolver

Related posts:

  1. InsideSpring (3) 스프링 밖에서 WebApplicationContext에 접근하기
  2. [토스3] 스프링 3.0.4 <mvc:default-servlet-handler/>를 이용해서 UrlRewriteFilter없이 깔끔한 URL을 만들기
  3. InsideSpring (1) Annotated Factory Method (@Configuration)을 쓰는 4가지 방법 (3)
  4. 유쾌한 이슈처리 재촉 메일
  5. Spring 3.0.1 mvc:annotation-driven 이 몰래 하는 짓
  6. Spring 3.0 (22) Web.Servlet 모듈의 선택 라이브러리 분석
  7. 스프링 3.1 (6) web.xml의 활성 프로파일 설정
  8. Spring 3.0 (21) Web 모듈의 선택 라이브러리 분석
  9. Spring 3.0 (40) Spring ASM 모듈의 소스는 어디에?
  10. Spring 3.0 (3) R-543 Portlet Mocks, MVC 등등
  11. Spring 3.0 (46) Spring 3.0 M4 릴리스
  12. Spring 3.0 (28) R-669 Update
  13. Spring 3.0 (17) Orm 모듈의 선택 라이브러리 분석
  14. Maven의 다중 리포지토리에 존재하는 동일 artifact 사용시 주의점
  15. Sprint 3.0 Spring @MVC -모델의 일생

Facebook comments:

to “DispatcherServlet의 디폴트 대체(fallback) 전략”

  1. human-design-space…

    human-design-space…

  2. Sites of interest we have a link to

Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2017 Toby's Epril Suffusion theme by Sayontan Sinha