2020. 9. 4. 23:20ㆍJava/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 |