Spring Framework

[Spring] 스프링 설정 - web.xml, root-context.xml, servlet-context.xml 역할

포포015 2021. 6. 23. 22:02

web.xml

web.xml은 설정을 위한 설정 파일이다.

WAS가 처음 구동 될때 web.xml을 읽어 웹 어플리케이션 설정을 구성한다.

DispatcherServlet을 등록해주면서 스프링 설정파일을 지정한다.

DispatcherServlet은 초기화 과정에서 지정된 설정파일을 이용해 스프링 컨테이너를 초기화 시킨다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    <!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/root-context.xml</param-value>
    </context-param>
    
    <!-- Creates the Spring Container shared by all Servlets and Filters -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
 
    <!-- Processes application requests -->
    <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/spring/appServlet/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
cs

아래 부분은 모든 요청을 DispatcherServlet이 처리하도록 서블릿 매핑을 한다.

(서블릿과 서블릿 매핑의 이름은 통일해야 작동한다.)

1
2
3
4
    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
cs

url-pattern 은 *.do, /* ,/ 이런식으로 많이 사용하는데 예전부터 사용해오던 관습느낌인거같다

*.do는 자바라는걸 알려준다고 했던거같은데..

 

아무튼 이런식의 방식은 톰캣(conf)에 있는 기본 web.xml의 .jsp 설정파일을 무시해버리게 되기 때문에 /를 사용하는게 맞다고 한다.

하지만 여기서 한가지 문제가 발생하게 되는데, servlet-mapping을 /로 사용하게 되면서

/*를 사용하는것과 마찬가지로 톰캣에 있는 / 설정을 무시하게 되버리는것이다

여기서 한가지 알아야할 부분은 .jsp든 .css든 .js든 파일에 직접 접근하는 경우는없다.

요청은 톰캣이 받게되고 서블릿에 패턴을 요청해서 처리하게 된다.

 

servlet-context.xml 에 아래와 같은 코드를 통해 문제를 해결할수 있다.

1
<mvc:default-servlet-handler />
cs

설정을 추가하면 default-servlet-handler가 빈(Bean)으로 추가된다

매핑되는 핸들러가 없다면 default-servlet-handler가 요청을 처리하게 된다.

또는 아래와 같은방법으로 해결할 수 있다.

1
2
<mvc:resources mapping="/resources/**" location="/resources/"/>
 
cs

 

servlet-context, root-context에 대해 알아보기전 알아야 할부분이 있다.

root-context : 이 context에 등록되는 Bean들은 모든 context에 사용되어진다.(공유가 가능하다.)

servlet-context: 이 context에 등록되는 Bean들은 servlet-container에만 사용되어진다.

 

@Controller는 servlet-context에 등록하고,

@Service와 @Repository등 root-context에 등록하라고 하는 이유가 이것때문인거같다.

 

servlet-context.xml

web.xml에서 DispatcherSevlet 등록시 설정한 파일이다.

앞서 설명한것처럼 설정파일을 이용해서 스프링 컨테이너를 초기화 시킨다.

코드를 하나하나 짚어 나가보겠다.

 

아래의 코드는 어노테이션을 활용할때 기본적인 Default 방식을 설정해준다고 한다.

1
2
    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven />
cs

 

의존성 주입을 위해서는 xml이나 @Configuration을 이용해서 빈을 등록해줘야 하는데 이런 번거로움을 해결해준다.

해당 패키지를 스캔해서 @Componet 같은 애너테이션을 사용해 클래스를 빈으로 등록해줄수 있다.

1
<context:component-scan base-package="com.board.controller" />
cs

컨트롤러에서 return "home"; 을 했을때

 /WEB-INF/views/home.jsp가 나올 수 있는게 이 설정 덕분이다.

viewResolver는 사용자의 요청에 대한 응답 view를 렌더링 하는 역활이다.

prefix는 렌더링 시 handelr에서 반환하는 문자열의 앞에 붙여줄 문자열을 의미하고

suffix는 뒷쪽에 붙는 문자열이다.

1
2
3
4
5
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<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>
cs

 

root-context.xml

스프링 프로젝트 생성시 root-context.xml에는 특별한 설정이 없다.

공통적으로 사용하려는 Bean을 그때그때 사용하는거같다 (보통 DB 이나, Service단을 사용한다)

 

 

참고 - https://node-js.tistory.com/entry/Spring-webxml-root-contextxml-servlet-contextxml-%EC%97%AD%ED%95%A0Servlet-DispatcherServlet%EC%9D%B4%EB%9E%80