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

[Spring] MVC 전용 태그

by 김코더 김주역 2022. 9. 29.
반응형

Spring의 @MVC 기능을 손쉽게 등록할 수 있게 해주는 mvc 스키마의 전용 태그들을 알아보자.

mvc 전용 태그를 활용하면 xml 설정이 간결해질 것이다.

참고로, 일반적으로 mvc 스키마는 다음과 같이 bean xml 설정에 추가되어 있다. 만약에 /schema/mvc가 없다면 꼭 추가해주자.

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

 

 

1. <mvc:annotation-driven>

- 어노테이션 방식의 컨트롤러를 사용할 때 필요한 각 최신 DispatcherServlet 전략에 해당하는 bean들을 자동으로 등록해준다.

- 최신 @MVC 지원 기능을 제공하는 bean도 함께 등록되어 전략 bean의 프로퍼티로 설정된다.

- 이 태그를 사용하면 DispatcherServlet의 디폴트 전략은 무시된다.

 

1) 자동 등록 bean

- Spring 3.0 기준으로 <mvc:annotation-driven>에 의해 자동으로 등록되는 bean들은 다음과 같다. Spring 버전이 증가함에 따라 이 전략들은 달라질 수 있다.

 

(1) DefaultAnnotationHandlerMapping

- @RequestMapping을 이용한 핸들러 매핑 전략이다.

- 다른 디폴트 핸들러 매핑 전략은 자동으로 등록되지 않는다.

 

(2) AnnotationMethodHandlerAdapter

- 어노테이션 방식의 컨트롤러에 사용되는 핸들러 어댑터다.

- 원래는 DispatcherServlet에 의해 자동으로 등록되는 bean인데, 디폴트 설정을 변경하기 위해 따로 bean으로 등록한 것이다.

- 다른 디폴트 핸들러 어댑터 전략은 자동으로 등록되지 않는다.

 

(3) ConfigurableWebBindingInitializer

- 모든 컨트롤러 메소드에 자동으로 적용되는 WebDataBinder을 초기화 해준다.

- AnnotationMethodHandlerAdapter의 webBindingInitializer 프로퍼티에 연결된다.

- 기본적으로 컨버전 서비스는 FormattingConversionServiceFactoryBean이 등록된다.

※ FormattingConversionServiceFactoryBean 참고 : https://kimcoder.tistory.com/524

- JSR-303 지원 라이브러리가 등록되어 있다면 글로벌 검증기는 LocalValidatorFactoryBean으로 설정된다.

※ JSR-303를 사용하기 위한 라이브러리 (더보기 참고)

더보기

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>
<dependency>
        <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
        <version>5.2.1.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator-annotation-processor</artifactId>
    <version>5.2.1.Final</version>
</dependency>

※ LocalValidatorFactoryBean 참고 : https://kimcoder.tistory.com/527

 

(4) 메시지 컨버터

- 기존의 디폴트 메시지 컨버터와 함께 Jaxb2RootElementHttpMessageConverter, MappingJacksonHttpMessageConverter가 추가로 등록된다.

※ 메시지 컨버터의 종류 참고 : https://kimcoder.tistory.com/531

 

(5) <spring:eval>을 위한 컨버전 서비스 노출용 인터셉터

- <spring:eval>에서 컨버전 서비스를 이용할 수 있게 된다. 즉, 스프링의 컨버터나 포맷터의 타입 변환 기능이 <spring:eval>에도 적용된다.

 

 

2) 자동 설정 정보 변경

- <mvc:annotation-driven>에서 다음과 같은 속성들을 통해 자동 설정 정보를 변경할 수 있다.

- 검증기와 컨버전 서비스를 제외하면 기본적으로 등록되는 bean의 설정을 변경할 수 없다는 점에 유의하자.

 

(1) validator

- ConfigurableWebBindingInitializer의 validator 속성에 적용할 Validator 타입의 bean을 지정할 수 있다. 원래는 디폴트로 LocalValidatorFactoryBean이 지정되어 있다.

<mvc:annotation-driven validator=myValidator" />

<bean id="myValidator" ...

 

(2) conversion-service

- ConfigurableWebBindingInitializer의 conversionService 속성에 적용할 bean을 지정할 수 있다. 원래는 디폴트로 FormattingConversionServiceFactoryBean이 등록되어 있는데 커스텀 컨버터나 포맷터를 추가하려면 이 bean을 직접 등록해서 추가해줘야 한다.

<mvc:annotation-driven conversion-service="myConversionService" />

<bean id="myConversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name=converters">
        ...
    </property>
</bean>

 

 

 

2. <mvc:interceptors>

- 모든 핸들러 매핑에 일괄 적용되는 인터셉터를 한 번에 설정할 수 있다. 그래서 인터셉터를 등록하기 위한 디폴트 핸들러 매핑 빈을 직접 만들지 않아도 된다.

- 인터셉터를 특정 요청에만 적용하기 위한 URL 패턴을 지정할 수도 있다.

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/admin/*" />
        <bean class="...Interceptor" />
    </mvc:interceptor>
<mvc:interceptors>

모든 요청에 적용할 인터셉터라면 <mvc:interceptors> 안에 바로 등록해주면 된다.

<mvc:interceptors>
    <bean class="...Interceptor" />
<mvc:interceptors>

 

 

 

3. <mvc:view-controller>

- URL 요청에 대해 뷰를 지정해주는 것이 전부인 컨트롤러들을 자동으로 등록해주고 싶을 때 사용된다. 이 태그에 매핑할 URL 패턴과 뷰 이름만 지정해주면 된다.

<mvc:view-controller path="/user" view-name="/user" />

- 이 태그를 하나라도 사용하면 SimpleUrlHandlerMapping과 SimpleControllerHandlerAdapter이 자동으로 등록된다. 이 두 개의 전략을 bean으로 직접 등록한 경우에는 등록된 bean이 사용된다.

 

 

 

4. <mvc:default-servlet-handler>

- Spring 3.0.4와 그 이후 버전에서 지원되는 태그다.

- 컨트롤러가 "/"로 시작하는 URL을 자유롭게 사용할 수 있도록 할 때 사용된다. 이 때, 정적 리소스는 서블릿 컨테이너가 제공하는 디폴트 서블릿에게 포워딩되어 처리된다. DispatcherServlet이 요청을 처리할 핸들러를 발견하지 못하면 해당 요청은 정적 리소스라고 판단하고 디폴트 서블릿에게 넘겨주는 식으로 동작한다. 내부적으로 <mvc:default-servlet-handler>이 추가해주는 매핑 전략 bean은 가장 낮은 우선순위가 부여된다.

※ 디폴트 서블릿은 웹 콘텐트의 루트 폴더를 기준으로 URL을 따라 파일의 존재 여부를 확인하고 이를 읽어서 클라이언트로 전달해준다. Maven에서는 기본적으로 /src/main/webapp이 웹 콘텐트의 기준 경로다.

- 적용법은 다음과 같다. 먼저, web.xml에서 DispatcherServlet의 매핑을 /로 해둔다.

<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

그리고 bean xml 설정 파일에 <mvc:default-servlet-handler/>을 추가해주기만 하면 된다.

 

 

5. <mvc:resources>

- Spring 3.0.4와 그 이후 버전에서 지원되는 태그다.

- 정적 파일을 편리하고 최적화된 방식으로 다룰 수 있게 해주는 태그다.

- mapping 속성으로 요청 경로의 패턴을 지정할 수 있고, location 속성으로 실제 저장 경로를 지정할 수 있다. location 속성에 file: 접두어를 지정하면 서버의 로컬 폴더에 매핑되고, http: 접두어를 쓰면 다른 서버에 매핑되고, 아무런 접두어도 붙이지 않으면 서블릿 컨텍스트 리소스에 매핑된다.

- 이 태그를 활용하면 패키징된 jar에 있는 정적 리소스도 요청 가능하다.

- 304 Not Modified 응답 코드를 처리하는 기능을 갖고 있기 때문에, 같은 정적 리소스에 대한 요청이 반복되면 해당 응답 코드를 전달해준다.

- <mvc:default-servlet-handler>와 함께 사용할 수 있다. 매핑 우선순위는 <mvc:resource>가 <mvc:default-servlet-handler>보다 높다.

 

 

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

 

반응형

댓글