Spring

[Spring] 스프링 MVC(13) - 추가 설정

재담 2022. 3. 17. 00:31

WebMvcConfigurer를 이용한 커스텀 설정

WebMvcConfigurer 인터페이스는 MVC 네임스페이스를 이용한 설정과 동일한 설정을 하는데 필요한 메서드를 정의하고 있다. 예를 들어 <mvc:view-controller> 태그는 뷰 컨트롤러를 설정할 때 사용되는데, 이와 동일한 설정을 위해 WebMvcConfigurer 인터페이스의 addViewContollers() 메서드를 이용한다.

 

WebMvcConfigurer 인터페이스나 WebMvcConfigurerAdapter 클래스를 상속받아 구현한 클래스는 @Configuration 어노테이션을 적용해서, 설정 정보로 사용해야 한다.

@Configuration
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/index").setViewName("index");
    }
    
    // 이하 생략
    ...
}

위 코드처럼 구현하면 MVC 관련 설정이 한 클래스에 모이므로, 코드 관리 측면에서 좋다고 본다.

 

뷰 전용 컨트롤러 설정

단순히 요청 경로에 알맞은 뷰 이름만 리턴해주는 컨트롤러가 필요하다면 다음과 같이 <mvc:view-controller> 태그를 이용해서 쉽게 처리할 수 있다.

<beans>
    <mvc:annotation-driven />
    <mvc:default-servlet-handler />
    <mvc:view-controller path="/index" view-name="index">
    
    <!-- 이하 생략 -->
    ...
</beans>

위 설정을 사용하면 별도의 컨트롤러를 작성하지 않고 "/index" 경로에 대해 index 뷰를 사용하게 된다.

 

@EnableWebMvc 어노테이션을 사용한다면, 상단의 코드와 같이 WebMvcConfigurerAdapter를 상속받고 addViewControllers() 메서드에서 경로와 뷰 이름을 매핑해주면 된다.

 

디폴트 서블릿 이름 설정

이 글에서 디폴트 서블릿 설정과 동작 방식을 살펴봤다. 여기서는 디폴트 서블릿의 이름을 설정하는 방법을 알아보자.

 

디폴트 서블릿의 이름은 WAS마다 다른데, 디폴트 서블릿 핸들러 설정에서 디폴트 서블릿의 이름을 지정하고 싶다면 다음과 같은 코드를 사용하면 된다.

<mvc:default-servlet-handler default-servlet-name="default" />
@Configuration
@EnableWebMvc
public class SampleConfig extends WebMvcConfigurerAdapter {
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable("default");
    }
    
    // 이하 생략
    ...
}

 

디폴트 서블릿 이름을 지정하지 않으면, 각 WAS별로 다음과 같은 디폴트 서블릿 이름을 사용한다.

  • 톰캣, Jetty, JBoss : default
  • 웹로직 : FileServlet
  • 구글 앱엔진 : _ah_default
  • 웹스피어 : SimpleFileServlet

 

정적 자원 설정

스프링 MVC를 이용하는 웹 어플리케이션에 정적 자원 파일이 함께 포함되어 있다면 웹 서버 설정을 사용하지 않고 <mvc:resources> 설정을 이용해서 웹 브라우저 캐시를 사용하도록 지정할 수 있다. 다음은 그 예이다.

<mvc:resources mapping="/images/**" location="/images/, /WEB-INF/resources/" cache-period="60" />

<mvc:resources> 태그의 각 속성은 다음과 같다.

  • mapping : 컨텍스트 경로를 제외한 요청 경로 패턴을 설정한다.
  • location : 웹 어플리케이션 내에서 요청 경로 패턴에 해당하는 자원의 위치를 지정한다.
  • cache-period : 웹 브라우저에 캐시 시간 관련 응답 헤더를 전송한다. 단위는 초이며, 0이면 웹 브라우저가 캐시 하지 않도록 한다. 설정하지 않으면 캐시 관련된 응답 헤더를 전송하지 않는다.

 

@EnableWebMvc 설정을 사용한다면, 다음과 같이 WebMvcConfigurerAdapter 클래스를 상속받은 뒤 addResourceHandler() 메서드를 재정의하면 된다.

@Configuration
@EnableWebMvc
public class SampleConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/images/**")
                .addResourceLocations("/images/", "/WEB-INF/resources/")
                .setCachePeriod(60);
    }
    
    // 이하 생략
    ...
}

Reference

  • 웹 개발자를 위한 Spring 4.0 프로그래밍 (최범균 저)