프로젝트 기본 설정
아파치 톰캣에서 제공하는 디스패처 서블릿을 스프링에서 제공하는 디스패처 서블릿으로 변경하는 것부터 작업이 시작된다.
⇒ Spring MVC는 디스패처 서블릿을 확대하여 제공하고 있으며, 기본적으로 아파치 톰캣이 제공하는 디스패처 서블릿기능을 그대로 갖고 있으며, Spring MVC에서 정의한 방식으로 동작될 수 있도록 재정의한 클래스
XML 설정
3.x 까지만 하더라도 XML으로 셋팅하는 방법을 지원했지만, 현재는 JAVA로 셋팅하는 방법도 지원
1. DispatcherServlet 설정하기
기본적으로 Apache Tomcat 안에 ServletJSP 실행에 관련된 기본셋팅이 되어있다. Web.xml 파일이 WebApplication에 없다면 Apache Tomcat이 가지고 있는 web.xml을 적용을 하고, WebApplication 내부에 web.xml이 있다고 한다면 해당 web.xml을 통해서 셋팅한 내용이 최우선시 된다. 셋팅이 안되어있는 나머지부분은 Tomcat에 있는 web.xml을 사용하여 셋팅이 되게 된다.
Tomcat web.xml에 존재하는 DispatcherServlet 설정 살펴보기
… 생략 …
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
… 생략 …
Spring MVC에서 사용할 DispatchServlet을 재정의해줘야 하므로, WEB-INF 하위에 web.xml을 만든다.
web.xml
...생략
<!-- 요청 정보를 분석해서 컨트롤러를 선택하는 서블릿을 지정한다. -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<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>
<!-- 현재 웹 애플리케이션에서 받아들이는 모든 요청에 대해 appServlet이라는 이름으로 정의되어 있는 서블릿을 사용하겠다. -->
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
...생략
servlet-context.xml
… 생략 …
<!-- 스캔한 패키지 내부의 클래스 중 Controller 어노테이션을 가지고 있는 클래스들을 Controller로 로딩하도록 한다. -->
<annotation-driven/>
<!-- 스캔할 bean들이 모여있는 패키지를 지정한다. -->
<!-- 서블릿을 운영하기 위한 정보를 가지고 있는 파일 -->
<context:component-scan base-package="com.nhn.corn.controller"/>
<!-- ViewResolver 설정 -->
<!-- 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:property>
</beans:bean>
<!-- 정적파일(이미지, 사운드, 동영상, JS, CSS 등등) 경로 셋팅 -->
<resources mapping="/**" location="/resources/"></resources>
… 생략 …
- resources 설정을 하는 이유?
디스패처 서블릿이 모든 요청을 처리하다보니, 리소스파일(image, js, css, html)또한 컨트롤러로 넘겨버리는 문제가 있다. 이 때 resource 태그를 사용해서 처리를 할 수 가 있는데, 전략은 다음과 같다.
디스패처 서블릿이 해당 요청에 대한 컨트롤러를 찾을 수 없다면 2차적으로 resources에 설정한 경로를 탐색하여 해당 자원을 찾게 된다.
2. RootContext 설정하기
이제 웹애플리케이션을 개발할 때 회원정보를 관리한다던가를 할때, bean들을 설정하게 되는데, 이 bean을 정의하는 파일을 설정하는 파일이다 사실 이 servlet-context.xml에서도 bean을 정의할 수 있으나, 개발을 하다보면 수많은 bean들이 정의되므 코드의 분리가 필요하다. servlet-context.xml은 Spring MVC 관련된 bean들을 정의하고 설정하는 작업을 하고, 그 외의 빈들은 root-context 에 설정한다.
… 생략 …
<!-- 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>
… 생략 …
root-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 필요한 빈들을 정의 -->
</beans>
3. Filter 설정하기
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>
Java Config 설정
xml에서 설정한 web.xml, root-context.xml, servlet-context.xml 을 자바코드로 옮긴다.
web.xml ⇒ AbstractAnnotationConfigDispatcherServletInitializer를 상속받은 클래스를 사용하거나 WebApplicationInitializer 인터페이스를 구현한 클래스 둘 중 하나를 이용
root-context.xml ⇒ 우리가 class를 만들어서 bean들을 정의
servlet-context.xml ⇒ WebMvcConfigurer 인터페이스를 구현하여 작업
1. DispatcherServlet 설정하기
WebApplication을 실행을 하였을 때, 만약에 WebApplicationInitializer 구현한 클래스가 존재한다면 WebApplicationInitializer 클래스가 갖고있는 onStartUp 메소드를 자동으로 호출해준다. web.xml을 로딩하는 대신 onStartUp 메소드를 호출하게 되는데, onStartUp메소드 안에 web.xml에서 작업했던 것을 자바코드로 구현을 하면 된다.
SpringConfigClass.java 생성(web.xml 역할)
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("/");
// Bean을 정의하는 클래스를 지정한다.
AnnotationConfigWebApplicationContext rootAppContext = new AnnotationConfigWebApplicationContext();
rootAppContext.register(RootAppContext.class);
ContextLoaderListener listener = new ContextLoaderListener(rootAppContext);
servletContext.addListener(listener);
}
}
ServletAppContext.java 생성(servlet-context.xml 역할)
// Spring MVC 프로젝트에 관련된 설정을 하는 클래스
@Configuration
// Controller 어노테이션이 셋팅되어 있는 클래스를 Controller로 등록한다.
@EnableWebMvc
// 스캔할 패키지를 지정한다.
@ComponentScan("com.nhn.corn.controller")
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/");
}
}
2. RootContext 설정하기
RootAppContext.java 생성(root-context.xml 역할)
// 프로젝트 작업시 사용할 bean을 정의하는 클래스
@Configuration
public class RootAppContext {
}
3. Filter 설정하기
SpringConfigClass.java (web.xml 역할)
public class SpringConfigClass implements WebApplicationInitializer{
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
… 생략 …
// 파라미터 인코딩 설정
FilterRegistration.Dynamic filter = servletContext.addFilter("encodingFilter", CharacterEncodingFilter.class);
filter.setInitParameter("encoding", "UTF-8");
filter.addMappingForServletNames(null, false, "dispatcher");
}
}
'프로그래밍 노트 > SPRING' 카테고리의 다른 글
Master/Slave DB 라우팅/이용하기(feat. AbstractRoutingDataSource) (0) | 2022.04.03 |
---|---|
[SpringBatch] JobParameter와 Scope (0) | 2021.12.01 |
[Spring] 스프링이란? Spring MVC 동작방식 (0) | 2020.12.19 |
[Spring] AOP_3 : @AOP (0) | 2020.04.06 |
[Spring] 스프링 AOP_2 : 프록시 기반 AOP (0) | 2020.04.03 |