IBATIS/myBatis
2018.07.30 / 11:28

Spring 4.0 + Java Config - web.xml 없애기...

summerman
추천 수 22

진짜 오래간만에 다시 스프링을 보기 시작했다.


역시 예상은 했지만 참 많이도 바뀌었다.


내가 느끼기에 큰 변화를 딱 2가지고 적어보자면,,


1. 빌드툴을 maven에서 gradle로의 이전이다...스프링에서는 공식적으로 gradle를 메인으로 지원하려는 모양이다.


2. configuration이 xml에서 java config로의 변경.

이건 아마도 요즘 개발 추세가 최대한 단일 언어를 사용한 개발을 추구하는 경향에 편승하는 듯 하다.

참고로 servlet-api 3.x에서부터 지원되는걸로 알고 있다.


말 하면 뭐하나,,함 해봐야지..

일단 프로젝트 트리는 다음과 같다.



용감하게 web.xml 파일을 제거(아님 저처럼 확장자를 변경해두셔도 됩니다.)


스프링 IDE 차원에서 해 줘야 할 것은 스프링에서 java config파일에 대한, 즉 @Configuration annotation을 자동으로 찾을 수 있도록 해줘야 한다. 안그러면 일일히 추가해줘야 하므로 귀찮다.



그 다음으로 해줘야 할 것은 Context 로드시에 초기화시켜줄 설정 파일을 만들어주는 것이다.



package com.figo.web.initializer;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

public class WebInitializer implements WebApplicationInitializer {
	private static final String CONFIG_LOCATION = "com.figo.web.config";
	private static final String MAPPING_URL = "/";
	
	@Override
	public void onStartup(ServletContext servletContext) throws ServletException {
		WebApplicationContext context = getContext();
		servletContext.addListener(new ContextLoaderListener(context));
		ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(context));
		dispatcher.setLoadOnStartup(1);
		dispatcher.addMapping(MAPPING_URL);
	}
	private AnnotationConfigWebApplicationContext getContext() {
		AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
		context.setConfigLocation(CONFIG_LOCATION);
		return context;
	}
}


참고로 mapping_url을 /* 로 했더니, view 파일인 jsp 파일을 파싱 못하는 문제가 있었다.

해결에 도움을 주신 stackoverflow에 고마움을 다시 한번 ~~ ㅎㅎㅎ

쌩유


다음 단계로 servlet context를 대체할 config 파일을 만든다.


package com.figo.web.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@EnableWebMvc // 에 해당.
@ComponentScan(basePackages = {"com.figo.web"})  // 에 해당됨.
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {

    // 에 해당됨.
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/").setCachePeriod(31556926);
    }

    // 에 해당됨.
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }    
    
    // 뭐 이부분은 다 들 아실듯..~~
    @Bean
    public InternalResourceViewResolver getInternalResourceViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
    
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/web").setViewName("home");
        registry.addViewController("/").setViewName("home");
    }

}


끝이다..~~

xml 파일을 따로 안봐도 되니 깔끔하다는 사람도 있으나,

솔찍히 말해서 난 잘 모르겠다.

다음단계를 아마도 security 부분을 추가해봐야 할 듯 싶다.