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단을 사용한다)
'Spring Framework' 카테고리의 다른 글
[Spring] WebUtils 사용하기 (0) | 2021.06.23 |
---|---|
[Spring] Bean 등록 어노테이션 @Component, @Configuration, @Bean 차이 (0) | 2021.06.23 |
[Spring] Dispatcher-Servlet 이란? (0) | 2021.06.23 |
스프링 MVC 프로젝트의 기본 구성 (0) | 2020.12.15 |
@RequestBody 어노테이션과 @ReponseBody 어노테이션의 사용 (0) | 2020.12.09 |