1. @EnableWebMvc, WebMvcConfigurer
@EnableWebMvc 어노테이션을 이용해 MVC 설정을 하는 경우, 일반적으로 WebMvcConfigurer 인터페이스를 상속받은 @Configuration 클래스를 구현한다(MVC 설정을 하나의 클래스에서 모을 수 있기 때문). WebMvcConfigurer 인터페이스는 10개가 넘는 메서드를 정의하고 있으며, 이를 모두 구현해서 사용하는 경우는 드물다. 따라서, WebMvcConfigurer 인터페이스를 구현하고 있는 WebMvcConfigurerAdapter 클래스를 상속받아 필요한 메서드만 구현하는 것이 일반적이다.
@EnableWebMvc 클래스와 WebMvcConfigurer 구현 클래스를 따로 구현할 수 있다.
2. View 전용 컨트롤러 설정
특정 경로로 요청이 들어왔을 때, 단순히 해당 뷰를 보여주고만 싶다면, View 전용 컨트롤러를 설정해주면 된다.
dispatcher servlet 설정 파일에서
<mvc:view-controller path="/hello" view-name="hello" /> 추가
@EnableWebMvc를 사용하는 경우에는 [사진 2]에서와 같이 WebMvcConfigurerAdapter의 addViewControllers 메서드를 구현하면 된다.
3. default servlet 설정
[사진 3]과 같이 dispatcher servlet의 경로를 '/'로 매핑했다면, CSS나 JS, HTML, JSP 등에 대한 요청이 dispatcher servlet에게 전달된다. 만약 이 같은 리소스 경로에 매핑된 컨트롤러가 존재하지 않는다면, 404 에러를 발생시킬 것이다. 따라서 이러한 리소스에 대한 요청은 WAS에서 제공하는 default servlet이 처리하도록 해야 한다.
즉, dispatcher servlet의 경로를 "/"로 매핑한 경우, 각종 리소스에 대한 요청을 디폴트 서블릿에게 전달해주도록 Spring MVC에서 제공하는 디폴트 서블릿 핸들러를 구현해야 한다. 이 핸들러는 각종 리소스에 대한 요청을 디폴트 서블릿에게 전달하는 역할을 한다.
XML 설정 (dispatcher servlet 설정 파일)
<beans>
<mvc:annotation-driven />
<mvc:default-servlet-handler />
</beans>
@Configuration
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter {
/**
* 디폴트 서블릿 핸들러 - css, js, jsp 등에 대한 요청이 들어오면 디폴트 서블릿에 다시 전달하는 핸들러
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
디폴트 서블릿 핸들러 동작 과정
디폴트 서블릿 핸들러가 등록되면, Dispatcher Servlet은 다음 과정을 거쳐 요청을 처리한다.
1. 요청 경로와 매핑되는 컨트롤러를 찾는다.
2. 컨트롤러가 존재하지 않는 경우 -> default servlet handler에 전달.
3. default servlet handler는 WAS의 default servlet에게 요청 처리를 위임.
4. default servlet이 처리 결과를 전송한다.
4. 정적 리소스 설정
CSS, image 등의 정적 리소스들은 변할 일이 드물기 때문에, 웹 브라우저에 캐싱을 하면 네트워크 사용량, 서버 사용량, 웹 브라우저의 반응 속도 등을 개선할 수 있다. Spring MVC를 이용하는 웹 어플리케이션에 정적 리소스가 함께 포함되어 있다면 웹 서버 설정을 사용하지 않고 <mvc:resources> 설정을 통해 웹 브라우저 캐시를 사용하도록 지정할 수 있다.
XML 설정
<mvc:resources mapping="/images/**" location="/img/, /WEB-INF/resources/" cache-period="60" />
* mapping : 요청 경로 패턴 설정. 컨텍스트 경로를 제외한 나머지 부분의 경로
* location : 웹 어플리케이션 내에서 요청 경로 패턴에 해당하는 리소스의 위치
* cahe-period : 웹 브라우저에 캐시 시간 관련 응답 헤더 전송. 초 단위로 캐시 시간 지정
@Configuration
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter {
/**
* view-controller 설정 - 단순히 요청 경로에 알맞은 뷰 이름만 리턴해주는 경우
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/index").setViewName("index");
registry.addViewController("/user/loginForm").setViewName("user/loginForm");
}
/**
* 디폴트 서블릿 핸들러 - css, js, jsp 등에 대한 요청이 들어오면 디폴트 서블릿에 다시 전달하는 핸들러
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
/**
* 정적 자원 매핑, 위치 및 캐시 시간 설정
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/images/**")
.addResourceLocations("/img/", "/WEB-INF/resources")
.setCachePeriod(60);
}
}
참고 문헌 : 웹 개발자를 위한 Spring 4.0 프로그래밍
'Web > Spring' 카테고리의 다른 글
@Transactional (0) | 2022.08.11 |
---|---|
데이터베이스 연동 시 유의 사항 (0) | 2021.06.21 |
Exception 처리 (0) | 2021.05.18 |
[Spring 설정] 컨트롤러 경로 매핑과 디폴트 서블릿 설정 (0) | 2021.05.17 |
[Spring 설정] 스프링 MVC (0) | 2021.05.09 |
댓글