사용자 도구

사이트 도구


springframework:mvc

Spring MVC

<mvc:resources>

아래와 같은 형태로 정적 파일을 제공해 줄 수 있다. 정적 리소스의 경로는 /resources-버전/images/test.gif 형태가 된다.

이 역할을 하는 핸들러는 ResourceHttpRequestHandler 이다.

<mvc:resources
  mapping="/resources-#{T(static.auto.VersionGenerator).VERSION}/**"
  location="/WEB-INF/static_resources/" cache-period="캐시초" />

*.ico 파일 처리 못하는 현상은 web.xml에 ico의 MIME 타입을 지정해주면 된다. java - Spring mvc:resource not finding *.ico files - Stack Overflow 참조

<mime-mapping>
    <extension>ico</extension>
    <mime-type>image/vnd.microsoft.icon</mime-type>
</mime-mapping>

<mvc:default-servlet-handler/>

일단 DispatcherServlet을 그냥 /에 매핑한다. jsp와 같은 특정 확장자를 가진 URL말고는 모두 DispatcherServlet이 다 받는다. 일단 스프링의 기본 등록된 핸들러 매핑 전략을 이용해서 컨트롤러를 매핑해본다. @Controller가 담당하는 URL이라면 그리로 넘어갈거고. 그런데 그러다보면 /js/jquery.js 처럼 컨트롤러에 매핑안되는 URL이 나올 것이다. 이런 나머지 모든 URL은 <mvc:default-servlet-handler/>이 내부적으로 등록해주는 DefaultServletHttpRequestHandler이 담당한다. 이 핸들러(컨트롤러)는 /**로 매핑되어있다. 대신 핸들러 매핑 우선순위가 가장 낮다. 따라서 애노테이션 매핑 등등을 거쳐서 다 실패한 URL만 넘어온다. 그리고 DefaultServletHttpRequestHandler는 이 요청을 자신이 직접 스태틱 리소스를 읽어서 처리하는 것이 아니라, 원래 서버가 제공하는 디폴트 서블릿으로 넘겨버린다. 그러면 서버의 기본 디폴트 서블릿이 동작해서 스태틱리소스를 처리해버리는 것이다. 일단 스프링이 다 받고 스프링이 처리 못하는 건 다시 서버의 디폴트 서블릿으로 넘긴다는 아이디어이다.

PathVariable 잘림 현상

  • @PathVariable을 사용하는데 해당 값 중간에 점(.)이 있을 경우 점 앞까지만 인식하고 뒤로는 인식하지 못하는 현상이 있다.
  • @RequestMapping(“/{value:.+}”) 형태. “:” 뒤에 정규표현식 넣는 것임.
    • Spring Framework 3.0.x에서 해당 값 뒤에 다른 URL 이 더 올경우 인식하지 못하는 현상이 있음. 예를 들면 /valuesblah/delete 이런식일 경우 뒤에 /delete를 인식 못함.
  • useDefaultSuffixPattern 기술 - 해보니까 안되는데?
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
        <property name="useDefaultSuffixPattern" value="false" />
    </bean>

URL이 두번 반복되고 Controller 매핑을 못찾는 현상

  • 요청 URL이 두 번 반복되는 듯 보이는 현상이 발생한다면 그것은 응답 객체에 올바른 View를 지정하지 않아서, Spring이 URL을 View로 간주하고 리다이렉트를 시도한 것이다.
  • 예를들어 /api/resources/1로 요청을 보냈는데 No mapping found for HTTP request with URI [/api/resources/1/api/resources/1] in DispatcherServlet with name 'servlet' 같은 오류가 발생했다면 이는 @ResponseBody를 지정하지 않고 View가 아닌 일반 객체를 리턴했기 때문이다.

Date / Time 파라미터

  • @DateTimeFormat 으로 요청 파라미터 포맷을 정할 수 있다.
    @RequestParam(value = "registerDate") @DateTimeFormat(pattern = "yyyy/MM/dd") Date registerDate
  • 파라미터 DTO 클래스등을 지정할 경우 클래스의 필드에 지정할 수도 있다.

CommonRequestLoggingFilter

MdcLoggingInterceptor

  • Slf4j MDC로 컨트롤러 정보를 저장해 두고, 그 컨트롤러의 호출 스택내에서 일어난 로그에 컨트롤러 정보를 함께 찍어줄 수 있다.

AbstractRequestLoggingFilter

기타

springframework/mvc.txt · 마지막으로 수정됨: 2019/06/07 15:39 저자 kwon37xi