본문 바로가기
Spring/Spring MVC 5

프로젝트설정(not Xml, but Java)

코동이 2020. 5. 24.

Xml으로 Spring 초기 설정을 했을 때, WEB-INF 폴더의 안에 했다. 

이번 시간에는, Java로 구현한다. java파일은 Java Resources의 src안에 만든다.

 

가장 핵심이었던 DispatcherServlet에 대한 설정을 web.xml에 했었는데, 이를 자바로 구현하면 2가지 방식이 있다.

 

1. WebApplicationInitializer (implements 구현)

  - web.xml에서 했던 것처럼 세세한 설정이 가능하며 이 interface를 구현하면 web.xml처럼 이 코드를 먼저 실행

 

2. AbstractAnnotationConfigDispatcherServletInitializer (extends 상속)

   

 

1. WebApplicationInitializer

@Override
	public void onStartup(ServletContext servletContext) throws ServletException {
    
    ...
}

onStartup메서드를 정의해야한다. 이름에서 보다시피 처음에 실행될 떄 어떠한 동작을 시킬지 구체적으로 정할 수 있다.

// 1. Spring MVC 프로젝트 설정을 위해 작성하는 클래스의 객체를 생성
AnnotationConfigWebApplicationContext servletAppContext = new AnnotationConfigWebApplicationContext();
servletAppContext.register(ServletAppContext.class);
		
// 2. 요청 발생 시 요청을 처리하는 서블릿을 DispatcherServlet으로 설정한다. 
DispatcherServlet dispatcherServlet = new DispatcherServlet(servletAppContext);
ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", dispatcherServlet);
		
// 3. 부가 설정
servlet.setLoadOnStartup(1);
servlet.addMapping("/");
	
// 4. Bean을 정의하는 클래스를 지정한다.
AnnotationConfigWebApplicationContext rootAppContext = new AnnotationConfigWebApplicationContext();
rootAppContext.register(RootAppContext.class);
		
// 5. 리스너지정
ContextLoaderListener listener = new ContextLoaderListener(rootAppContext);
servletContext.addListener(listener);
		
// 6. 파라미터 인코딩 설정
FilterRegistration.Dynamic filter = servletContext.addFilter("encodingFilter", CharacterEncodingFilter.class);
filter.setInitParameter("encoding", "UTF-8");
filter.addMappingForServletNames(null, false, "dispatcher");

1.

Spring MVC 프로젝트에서 설정하는 클래스(ServletAppContext.java)를 객체로 만들기 위한 작업이다.

register를 통해서 servletAppContext.register(ServletAppContext.class)로 등록시킨다.

 

2. 요청 발생 시 요청을 처리하는 서블릿을 DispatcherServlet으로 설정한다.

이 DispatcherServlet은 우리가 servlet 관련 설정하는 클래스를 객체로 만든 servletAppContext를 매개변수로 갖는다.

servletContext에 "dispatcher"라는 이름으로 우리가 정의한 dispatcherServlet을 추가한다.

 

3. 이 servlet은 가장 먼저 실행되어야 하며(setLoadOnStartup), / 페이지 처음 접속시에 발동할 것이다.(addMapping)

 

4. ServletAppContext.class 와는 다른 RootAppContext.class를 등록한다. 여기서는 Bean을 정의한다.

 

5. 2번에서는 servletContext에 dispatcherServlet을 addServlet했는데, 여기서는 addListener를 한다.

이전에 등록시킨 rootAppContext를 listen하면서 Bean이 생성되면 처리한다.

 

6. servletContext에 addServlet, addListener를 했으며 마지막으로 addFilter를 한다.

filter에 대한 설정으로, UTF-8을 하며, "dispatcher"를 통해 등록했던 것으로, Mapping시킨다.

 

차이점을 보자면,

ServletAppContext.class는 addServlet으로 추가되고, RootAppContext.class는 addListener로 추가된다.

addServlet은 dispatcher인 servlet이 실행될 떄 처음에 bean을 등록시키기 위한 기능으로 예상된다.

addListener는 Bean에 대한 생성, 수정, 소멸 등의 일련의 과정을 관리하고 처리하기 위해서 listener로 예상된다.

 

Xml작성 했을 떄, servlet-context.xml에서 component-scan이 있었다. 하지만 Java설정 중에는 그러한 코드가 없다. 아무래도 onStartup이 실행되면서 자동적으로 이루어지는 것 같다.

 

ServletAppContext.java와 RootAppContext.java는 모두 @Configuration을 가지고 있다. @Configuration을 갖는다는 것은 또한 @Component를 갖는다는 것인데, 그렇다면 AnnotationConfigWebApplicationContext는 @Configure를 annotation으로 달 수 있도록 도와주는것인가? 설정을 위한 java파일임을 명시하는 것인가?

 

<ServletAppContext.java>

@Configuration
@EnableWebMvc
@ComponentScan("kr.co.exmaple.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/");
	}
}

@Configure = Spring MVC 프로젝트와 관련된 설정을 한다는 의미

@EnableWebMvc = Controller 어노테이션이 정의된 클래스에 Controller를 bean으로 등록

(Bean 설정을 자동으로 해준다.)

@ComponentScan(...) = scan할 패키지를 지정한다.

 

viewResolvers는 prefix, suffix를 설정한다.

addResourceHandelrs는 정적 파일경로를 설정한다.

 

 

2. AbstractAnnotationConfigDispatcherServletInitializer

 

	@Override
	protected String[] getServletMappings() {
		// TODO Auto-generated method stub
		return new String[] {"/"};
	}
	
	
	//프로젝트에서 사용할 Bean들을 정의하기 위한 클래스를 지정한다.
	@Override
	protected Class<?>[] getRootConfigClasses() {
		// TODO Auto-generated method stub
		return new Class[] {RootAppContext.class};
	}

	//Spring MVC 프로젝트 설정을 위한 클래스를 지정한다.
	@Override
	protected Class<?>[] getServletConfigClasses() {
		// TODO Auto-generated method stub
		return new Class[] {ServletAppContext.class};
	}

	// 파라미터 인코딩 필터 설정
	@Override
	protected Filter[] getServletFilters() {
		// TODO Auto-generated method stub
		CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
		encodingFilter.setEncoding("UTF-8");
		return new Filter[] {encodingFilter};
	}

해당 interface를 implements하면 구현해야하는 3가지 class가 생성된다.

 

getServletMapping()은 이름처럼 DispatcherServlet에 매핑할 요청주소를 설정한다.

 

getRootConfigClasses는 Bean을 주입하기 위한 RootAppContext.class를 반환다.

 

getServletConfigClasses는 Spring MVC 설정을 위한 ServletAppContext.class를 반환한다.

 

getServletFilter()는 UTF-8을 사용하기 위한 인코딩형식을 지정한다.

반응형

'Spring > Spring MVC 5' 카테고리의 다른 글

파라미터에 객체를 주입받기  (0) 2020.05.25
파라미터 추출하기  (0) 2020.05.25
URL Mapping  (0) 2020.05.24
프로젝트 세팅(web.xml, servlet-context.xml)  (0) 2020.05.24
프로젝트 세팅(pom.xml)  (0) 2020.05.23