ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring MVC 세팅 - Java로 셋팅
    Spring/초기 설정 2021. 12. 25. 13:38
    728x90
    반응형

    web.xml -> AbstractAnnotationConfigDispatcherServletInitializer 상속

                   혹은 WebApplicationInitializer 인터페이스 구현

    root-context.xml -> 상속없음

    servlet-context.xml ->WebMvcConfigurer 인터페이스 구현

     

     

    방법 1 - WebApplicationInitializer 를 이용하여 Java로 셋팅

    Step.1 web.xml에 설정한 내용을 Java로 설정하기

     웹 어플리케이션이 실행됐을때 WebApplicationInitializer를 상속받은 클래스가 있으면 자동적으로 실행해준다. 이 방법은 방법 2 보다 코드가 더 복잡하지만 내가 원하는대로 작성해주기 때문에 코드의 자율성이 좋아진다.

    public class SpringConfigClass implements WebApplicationInitializer{
    
    	@Override
    	public void onStartup(ServletContext servletContext) throws ServletException {
    		// TODO Auto-generated method stub
    		// Spring MVC 프로젝트 설정을 위해 작성하는 클래스의 객체를 생성한다.
    		AnnotationConfigWebApplicationContext servletAppContext = new AnnotationConfigWebApplicationContext();
    		servletAppContext.register(ServletAppContext.class);
    		
    		// 요청 발생 시 요청을 처리하는 서블릿을 DispatcherServlet으로 설정해준다.
    		DispatcherServlet dispatcherServlet = new DispatcherServlet(servletAppContext);
    		ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", dispatcherServlet);
    		
    		// 부가 설정
    		servlet.setLoadOnStartup(1);
    		servlet.addMapping("/");
    		
    		// Bean을 정의하는 클래스를 지정한다
    		AnnotationConfigWebApplicationContext rootAppContext = new AnnotationConfigWebApplicationContext();
    		rootAppContext.register(RootAppContext.class);
    		
    		ContextLoaderListener listener = new ContextLoaderListener(rootAppContext);
    		servletContext.addListener(listener);
    		
    		// 파라미터 인코딩 설정
    		FilterRegistration.Dynamic filter = servletContext.addFilter("encodingFilter", CharacterEncodingFilter.class);
    		filter.setInitParameter("encoding", "UTF-8");
    		filter.addMappingForServletNames(null, false, "dispatcher");
    	}
    }

     세부적으로 세팅을 하나하나 어떻게 하는지 보자.

    DispatcherServlet으로 등록을 하기위해 SevletAppcontext.java 객체를 생성

    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/config/servlet-context.xml</param-value>
    </init-param>
    AnnotationConfigWebApplicationContext servletAppContext = new AnnotationConfigWebApplicationContext();
    servletAppContext.register(ServletAppContext.class);

     

     

     위 코드는 엄밀히 말해서는 다르다. xml로 설정할때는 Dispatcherservlet을 등록하면서 DI를 한 경우이고 Java로 쓴 코드는 우선 Dispatcherservlet에 DI할 객체를 생성을 하는 코드이다. 전체적으로 어떻게 xml설정에서 java설정으로 바뀌는지 이해를 돕기위해 같다고 본 것이다.


     아래 코드는 servletAppContextDispatcherservlet로 등록과 한것과 servlet-mapping을 설정한 것이다. 

    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        ....
        <load-on-startup>1</load-on-startup>
    </servlet>
    DispatcherServlet dispatcherServlet = new DispatcherServlet(servletAppContext);
    ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", dispatcherServlet);
    		
    servlet.setLoadOnStartup(1);
    servlet.addMapping("/");

     

     메게변수로 들어온 servletContextDispatcherServlet 객체에 DispatcherServlet로 등록해고 Mapping을 해주었다.    정리하면 servletAppContextDispatcherServlet으로 등록과 이 DispatcherServlet을 사용하겠다는 설정이다.


     다음은 bean을 정의해주는 RootAppContext.java 객체를 생성해주고, rootAppConext 객체를 읽어 올 수 있는

    listener 설정을 해준다.

     

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/config/root-context.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    AnnotationConfigWebApplicationContext rootAppContext = new AnnotationConfigWebApplicationContext();
    rootAppContext.register(RootAppContext.class);
    		
    ContextLoaderListener listener = new ContextLoaderListener(rootAppContext);
    servletContext.addListener(listener);

      마지막으로 Parameter Incoding 설정이다.

    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
        
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    FilterRegistration.Dynamic filter = servletContext.addFilter("encodingFilter", CharacterEncodingFilter.class);
    filter.setInitParameter("encoding", "UTF-8");
    filter.addMappingForServletNames(null, false, "dispatcher");

     이렇게 web.xml 설정들을 Java로 설정은 끝났다.


    Step.2 ServletAppContext.java  설정
    // Spring MVC 프로젝트에 관련된 설정을 하는 클래스
    @Configuration
    // Controller 어노테이션이 셋팅되어 있는 클래스를 Controller로 등록한다.
    @EnableWebMvc
    // 스캔할 패키지를 지정한다.
    @ComponentScan("kr.co.softcampus.controller")
    public class ServletAppContext implements WebMvcConfigurer{
    	// Controller의 메서드가 반환하는 jsp의 이름 앞뒤에 경로와 확장자를 붙혀주도록 설정한다.
    	@Override
    	public void configureViewResolvers(ViewResolverRegistry registry) {
    		// TODO Auto-generated method stub
    		WebMvcConfigurer.super.configureViewResolvers(registry);
    		registry.jsp("/WEB-INF/views/", ".jsp");
    	}
    	
    	// 정적 파일의 경로를 매핑한다.
    	@Override
    	public void addResourceHandlers(ResourceHandlerRegistry registry) {
    		// TODO Auto-generated method stub
    		WebMvcConfigurer.super.addResourceHandlers(registry);
    		registry.addResourceHandler("/**").addResourceLocations("/resources/");
    	}
    }

     세부적으로 보자.

    <!-- 스캔한 패지키 내부의 클래스 중 Controller 어노테이션을 가지고 있는 클래스들을 Controller로 로딩하도록 한다 -->
    <annotation-driven/>
    	
    <!-- 스캔할 bean들이 모여있는 패키지를 지정한다. -->
    <context:component-scan base-package="kr.co.softcampus.controller"/>
    // Spring MVC 프로젝트에 관련된 설정을 하는 클래스
    @Configuration
    // Controller 어노테이션이 셋팅되어 있는 클래스를 Controller로 등록한다.
    @EnableWebMvc
    // 스캔할 패키지를 지정한다.
    @ComponentScan("kr.co.softcampus.controller")

     ViewResolver 등록과 정적 파일 경로 매핑

    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/"/>
        <beans:property name="suffix" value=".jsp"/>
    </beans:bean>
    
    <resources mapping="/**" location="/resources/"/>
    public class ServletAppContext implements WebMvcConfigurer{
    	// Controller의 메서드가 반환하는 jsp의 이름 앞뒤에 경로와 확장자를 붙혀주도록 설정한다.
    	@Override
    	public void configureViewResolvers(ViewResolverRegistry registry) {
    		// TODO Auto-generated method stub
    		WebMvcConfigurer.super.configureViewResolvers(registry);
    		registry.jsp("/WEB-INF/views/", ".jsp");
    	}
    	
    	// 정적 파일의 경로를 매핑한다.
    	@Override
    	public void addResourceHandlers(ResourceHandlerRegistry registry) {
    		// TODO Auto-generated method stub
    		WebMvcConfigurer.super.addResourceHandlers(registry);
    		registry.addResourceHandler("/**").addResourceLocations("/resources/");
    	}
    }

    Step.3 HomeController.java 설정

    이 부분은 원래 자바로 설정해 놓은 상태라 변경할 부분이 없다.

    @Controller
    public class HomeController {
    	
    	@RequestMapping(value = "/", method = RequestMethod.GET)
    	public String home() {
    		System.out.println("home");
    		return "index";
    	}
    	
    }

     

    방법 2 - AbstractAnnotationConfigDispatcherServletInitializer             를 상속받아 Java로 셋팅

     

     이 방법이 더 간단하지만 정해진 방법으로만 작성해줘야 하기 때문에 자율성은 떨어진다.

    public class SpringConfigClass extends AbstractAnnotationConfigDispatcherServletInitializer{
    	// DispatcherServlet에 매핑할 요청 주소를 셋팅한다.
    	@Override
    	protected String[] getServletMappings() {
    		// TODO Auto-generated method stub
    		return new String[] {"/"};
    	}
    	
    	// Spring MVC 프로젝트 설정을 위한 클래스를 지정한다.
    	@Override
    	protected Class<?>[] getServletConfigClasses() {
    		// TODO Auto-generated method stub
    		return new Class[] {ServletAppContext.class};
    	}
    	
    	// 프로젝트에서 사용할 Bean들을 정의기 위한 클래스를 지정한다.
    	@Override
    	protected Class<?>[] getRootConfigClasses() {
    		// TODO Auto-generated method stub
    		return new Class[] {RootAppContext.class};
    	}
    	
    	// 파라미터 인코딩 필터 설정
    	@Override
    	protected Filter[] getServletFilters() {
    		// TODO Auto-generated method stub
    		CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
    		encodingFilter.setEncoding("UTF-8");
    		return new Filter[] {encodingFilter};
    	}
    }

     

    728x90
    반응형

    댓글

Designed by Tistory.