Spring MVC - 기본세팅(3) - JAVA

2020. 9. 4. 23:20Java/Spring

반응형

XML에 이어서 JAVA를 이용한 Spring MVC 세팅에 대해 알아보자.

 

XML 과 비교를 하면서 세팅을 해보자.

 

1. web.xml -> WebApplicationInitializer 인터페이스 구현 

            

 

WebApplicationInitializer 인터페이스 구현

 

  먼저 config 패키지를 생성 후 WebApplicationInitializer 인터페이스를 구현 한 SpringConfigClass를 생성한다.

 

   인터페이스 상속 후 메소드를 오버라이딩 한다.

public class SpringConfigClass implements WebApplicationInitializer{

	@Override
	public void onStartup(ServletContext servletContext) throws ServletException {
		System.out.println("onstart");
		
	}

	
}

해당 메소드는 실행 후 web.xml이 실행되던 것과 같이 내부 코드를 실행시킨다.

 

404가 발생하지만 onstart가 출력된다.


Spring Mvc 프로젝트에 관련된 설정을 하는 클래스인 ServletAppContext 를 WebMvcConfigurer 인터페이스를 구현해 config 패키지에 생성한다.

// Spring Mvc 프로젝트에 관련된 설정을 하는 클래스
public class ServletAppcontext implements WebMvcConfigurer{

}

 

onStartup 메소드에서 해당 클래스를 객체로 등록시킨다.

 

public class SpringConfigClass implements WebApplicationInitializer{

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

 //// 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("/");

1번째, 가장 먼저 시작하는 서블릿으로 지정하고, / 주소에서 실행되게 매핑한다.

 

위 코드를 xml 코드를 이전에 작성한 xml 코드로 보자면 web.xml의  다음 코드의 역할과 같다.

<servlet-mapping>
	<servlet-name>appServlet</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 요청 정보를 분석해서 컨트롤러를 선택하는 서블릿을 지정한다. -->
<servlet>
	<servlet-name>appServlet</servlet-name>
	<!-- Spring MVC에서 제공하고 있는 기본 서블릿을 지정한다. -->
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<!-- Spring MVC 설정을 위한 xml 파일을 지정한다. -->
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/config/servlet-context.xml</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>

 


Bean 지정 클래스 등록 

 

먼저 프로젝트 작업시 사용할 Bean을 정의 할 클래스 RootAppcontext를 만든다.

 

현재는 생성만 하고 따로 작성은 하지 않는다.

 

@Configuration
public class RootAppContext {

}

onStartup 메소드에 다음과 같이 추가하여 RootAppcontext를 등록한다.

 

// Bean을 정의하는 클래스를 지정한다.
AnnotationConfigWebApplicationContext rootAppContext = new AnnotationConfigWebApplicationContext();
rootAppContext.register(RootAppContext.class);
		 
ContextLoaderListener listener = new ContextLoaderListener(rootAppContext);
servletContext.addListener(listener);

위 코드를 xml 세팅에서 보면 아래와 같다.

 

<!-- Bean을 정의 할 xml 파일을 지정한다. -->
<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>
	

파라미터 인코딩 필터 설정 

 

onStartup 메소드에 다음을 추가한다.

 //파라미터 인코딩 필터 설정 
FilterRegistration.Dynamic filter = servletContext.addFilter("encodingFilter", CharacterEncodingFilter.class);
filter.setInitParameter("encoding","utf-8");
filter.addMappingForServletNames(null,false,"dispatcher");

위 코드는 web.xml의 다음과 같다.

<!-- 파라미터 인코딩 필터 설정 -->
<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>

2. Servlet-content.xml --> ServletAppContext.java 

 

 

기존의 Servlet-content.xml을 ServletAppContext.java로 변환시킨다.

 

<!-- 스캔한 패키지 내부의 클래스 중 Controller 어노테이션을 가지고 있는 클래스를 Controller로 로딩하도록 한다. -->
<annotation-driven/>

기존의 위 역할을 해주는 어노테이션은 @EnableWebMvc을 사용한다.

 

<!-- 스캔할 bean들이 모여있는 패키지를 지정한다. -->
<context:component-scan base-package="cookingcoding.controller"/>

위의 스캔역할은 아래 어노테이션이 대체한다.

@ComponentScan("cookingcoding.controller")
// Spring Mvc 프로젝트에 관련된 설정을 하는 클래스
@Configuration

// Controller 어노테이션이 세팅된 클래스를 Controller로 등록
@EnableWebMvc

@ComponentScan("cookingcoding.controller")
public class ServletAppcontext implements WebMvcConfigurer{

}

Controller의 메서드에서 반환하는 문자열 앞 뒤에 붙힐 경로를 세팅

 

@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
	
	WebMvcConfigurer.super.configureViewResolvers(registry);
	registry.jsp("/WEB-INF/views",".jsp");
}

위 메서드를 오버라이딩하여 작성한다.

 

위 메서드는 xml의 아래 코드를 대체한다.

<!-- Controller의 메서드에서 반환하는 문자열 앞 뒤에 붙힐 경로를 세팅한다. -->
<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>

정적파일의 경로를 매핑

 

 

아래 메서드를 오버라이딩하여 작성한다.

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
	WebMvcConfigurer.super.addResourceHandlers(registry);
	registry.addResourceHandler("/**").addResourceLocations("/resources/");
}

위 코드는 아래 xml 코드를 대체한다.

<!-- 정적파일 경로 세팅 -->
<resources mapping="/**" location="/resources/"></resources>

 

 

ServletAppContext.java 전체 코드

// Spring Mvc 프로젝트에 관련된 설정을 하는 클래스
@Configuration

// Controller 어노테이션이 세팅된 클래스를 Controller로 등록
@EnableWebMvc

@ComponentScan("cookingcoding.controller")
public class ServletAppcontext implements WebMvcConfigurer{
	@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/");
	}
}

3. Controller 패키지 및 클래스 생성

Controller 패키지 및 클래스는 xml에서와 맨 위 어노테이션을 제외하고 동일하다.

 

첫 어노테이션을 @Controller로 준다.

 

Controller 패키지와 그 안에 HomeController.java 를 생성한다.

 

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

위와 같이 작성한다.

 

resources 폴더를 WebContent안에 생성하고 그 안에 image 폴더를 만든다.

 

image 폴더 안에 이미지를 하나 넣는다.

 

그 후 WEB-INF에 views 폴더를 생성 후 index.jsp 생성한다.

폴더 구조가 위와 같이 생성이 되었다면 index.jsp를 다음과 같이 작성하고 실행한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>index</h3>
<img src="image/1.png">
</body>
</html>

정상적으로 작동한다.


AbstractAnnotationConfigDispatcherServletInitializer 상속하여 web.xml 작성

WebApplicationInitializer 인터페이스 구현 외에 AbstractAnnotationConfigDispatcherServletInitializer 상속하는 방법도 있다.

 

스프링에서 공통적으로 세팅을 해주는 부분은 알아서 해주고, 사용자가 직접 설정해야 하는 부분만 작성하면 되기에 세팅면에서는 이 방법이 더 간단하다.

 

다른 파일은 그대로 두고 SpringConfigClass.java 만 작성하면 된다.

 

DispatcherServlet에 매핑할 요청 주소를 세팅

 

  - 기존 WebApplicationInitializer - 

servlet.setLoadOnStartup(1); 
servlet.addMapping("/");

- 변경 -

@Override
protected String[] getServletMappings() {
	return new String[] {"/"};
}

Spring MVC 프로젝트 설정을 위한 클래스 지정

 

  - 기존 WebApplicationInitializer -

 

AnnotationConfigWebApplicationContext servletAppContext = new AnnotationConfigWebApplicationContext();
servletAppContext.register(ServletAppcontext.class);
 
DispatcherServlet dispatcherServlet = new DispatcherServlet(servletAppContext);
ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", dispatcherServlet);

- 변경 -

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

프로젝트에서 사용할 bean들을 정의하기 위한 클래스 지정

 

 - 기존 WebApplicationInitializer -

AnnotationConfigWebApplicationContext rootAppContext = new AnnotationConfigWebApplicationContext();
rootAppContext.register(RootAppContext.class);
  
ContextLoaderListener listener = new ContextLoaderListener(rootAppContext);
servletContext.addListener(listener);

- 변경 -

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

파라미터 인코딩 필터 설정

 

 - 기존 WebApplicationInitializer -

FilterRegistration.Dynamic filter = servletContext.addFilter("encodingFilter", CharacterEncodingFilter.class);
filter.setInitParameter("encoding","utf-8");
filter.addMappingForServletNames(null,false,"dispatcher");

- 변경 -

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

 


전체 코드

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() {
		CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
		encodingFilter.setEncoding("UTF-8");
		return new Filter[] {encodingFilter};
	}
}

web.xml 을 위와 같이 작성해도 정상 작동이 된다.

 

 

반응형

'Java > Spring' 카테고리의 다른 글

Spring MVC - 요청방식(Get,Post)  (0) 2020.09.05
Spring MVC - URL Mapping  (0) 2020.09.05
Spring(MVC) - 기본세팅(2) - XML  (0) 2020.09.03
Spring(MVC) - 기본세팅(1)  (0) 2020.09.02
Spring - mybatis  (0) 2020.09.01