Spring/공부

[Spring MVC] DispatcherServlet java파일에서 설정해주기 (WebApplicationInitializer)

하루인생 2021. 2. 9. 20:10

이전에 프론트컨트롤러를 설정하는 방법에 대해 작성한 글에서

web.xml과 WebApplicationInitializer인터페이스 이 두 방법을 많이 사용한다고 작성하였다. 

이번에는 WebApplicationInitializer 인터페이스를 이용한 방법에 대해 알아보자.

 

먼저 web.xml파일을 사용하지 않을 예정이므로 pom.xml에 <failOnMissingWebXml>태그의 값에 false를 준다.

<properties>
   <failOnMissingWebXml>false</failOnMissingWebXml>
  	<spring.version>5.2.2.RELEASE</spring.version>
  </properties>

 

이 클래스는 DispatcherServle과 서블릿 컨텍스트를 설정하는 파일이다. (DispatcherServle와 그 root까지)

AbstractAnnotationConfigDispatcherServletInitializer클래스를 상속받았다.

그래서 getRootConfigClasses, getServletConfigClasses, getServletMappings메서드들을 오버라이딩 해줘야 한다. 

 

getRootConfigClasses는 root, 이름 그대로 ContextLoaderListener가 생성한 어플리케이션 컨텍스트에

설정 클래스를 적재하면된다.

 

getServletConfigClasses는 DispatcherServle가 생성한 어플리케이션 컨텍스트에 설정 클래스를 적재하면 된다. 

 

getServletMappings는 DispatcherServle에 매핑되기 위한 path를 지정한다. 하나 혹은 여러 개 ..

public class WebApp extends AbstractAnnotationConfigDispatcherServletInitializer {

	@Override
	protected Class<?>[] getRootConfigClasses() {
		return new Class<?>[] {AppConfig.class};
	}

	@Override
	protected Class<?>[] getServletConfigClasses() {
		return new Class<?>[]{MvcConfig.class};
	}

	@Override
	protected String[] getServletMappings() {
		return new String[]{"/"};
	}
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
        encodingFilter.setEncoding("UTF-8");

        return new Filter[]{encodingFilter};
    }
}

 

입력된 모든 요청을 핸들러 역할을 하는 클래스를 만들어 줬다. 

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"kr.or.exam.controller"})
public class MvcConfig implements WebMvcConfigurer{
	@Override
	public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
		configurer.enable();
	}

	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		registry.jsp("/WEB-INF/view/", ".jsp");
	}
	
	@Override
	public void addViewControllers(ViewControllerRegistry registry) {
		registry.addRedirectViewController("/", "/main");
	}
	
	@Override
	public void addResourceHandlers(final ResourceHandlerRegistry registry) {
		registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
	}
}

 

 

간단하게 main.jsp를 실행하는 컨트롤러를 작성했다. 

...

@Controller
public class MainController {
	@RequestMapping("/main")
	public String main() {
		return "main";
	}
}

 

이 방법이 web.xml보다 더 간단한 것 같다.