스프링을 세팅하는 도중 궁금한 내용들이 생겨 따로 정리한다.
예제를 그대로 따라하기만 하면 되겠지만 왜 쓰는건지는 알고 넘어가자.
간단하게 정리하려고 했는데 생각보다 관련해서 알아야 하는 내용이 많다.
어려운 내용들이 많아 이해해하는데 시간이 조금 걸릴 것 같다.
web.xml
web.xml은 설정을 위한 설정 파일이다.
WAS가 처음 구동될 때 web.xml을 읽어 웹 애플리케이션 설정을 구성한다.
DispatcherServlet을 등록해주면서 스프링 설정 파일을 지정한다.
DispatcherServlet은 초기화 과정에서 지정된 설정 파일을 이용해 스프링 컨테이너를 초기화시킨다.
<!-- 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>
<!-- 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>
문자 인코딩 관련된 내용은 생략하고,
아래 부분은 모든 요청을 DispatcherServlet이 처리하도록 서블릿 매핑을 설정한다.
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
url-pattern은 *.do, /*, / 이런식으로 많이 사용하는 것 같은데 그 차이가 궁금했다.
*.do는 무의미한 확장자로 옛날에 사용하던 방식인 것 같고
/*는 톰캣(conf)에 있는 기본 web.xml의 .jsp를 처리하는 설정 파일을 무시해버리게 되기 때문에
/를 사용하는게 맞다고 한다.
하지만 여기서 한가지 문제가 발생하게 되는데 setvlet-mapping을 /로 사용하게 되면서
/*를 사용하는 것과 마찬가지로 톰캣에 있는 / 설정을 무시해버리게 되는 것이다.
여기서 한가지 알아둬야할 부분은 .jsp든 .css든 .js든 파일에 직접 접근하는 경우는 없다.
요청은 톰캣이 받게되고 서블릿에 패턴을 요청해서 처리하게 되는데 이 설정을 뭉개버린 것이다.
servlet-context.xml에 다음과 같은 코드를 통해 이 문제를 해결할 수 있다.
<mvc:default-servlet-handler />
설정을 추가하면 default-servlet-handler가 빈(Bean)으로 추가된다.
매핑되는 핸들러가 없다면 default-servlet-handler가 요청을 처리하게 된다.
또는 이 방법으로도 해결할 수 있다.
<mvc:resources mapping="/resources/**" location="/resources/"/>
servlet-context, root-context에 대해 알아보기 전 알아야 할 부분이 있다.
root-context : 이 context에 등록되는 Bean들은 모든 context에서 사용되어 진다.(공유가 가능하다)
servlet-context : 이 context에 등록되는 Bean들은 servlet-container에만 사용되어진다.
@Controller는 servlet-context에 등록하고
@Service와 @Repository 등 root-context에 등록하라고 하는 이유가 이것때문인 것 같다.
모두 root-context에 등록할 수 있겠지만 용도에 따라 나눈 것 같은데 다른 이유가 있는지 궁금하다.
servlet-context.xml
web.xml에서 DispatcherServlet 등록 시 설정한 파일이다.
앞서 설명한 것 처럼 설정 파일을 이용해서 스프링 컨테이너를 초기화시킨다.
코드를 하나 하나 짚어나가보자.
아래 코드는 Annotation을 활용할 때 기본적인 Default 방식을 설정해준다고 한다.
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
의존성을 주입하기 위해서는 xml이나 @Configuration을 이용해서 빈을 등록 해줘야 하는데
이런 번거로움을 해결해준다.
해당 패키지를 스캔해서 애노테이션을 명시한 클래스를 빈으로 등록해준다.
<context:component-scan base-package="com.board.controller" />
컨트롤러에서 return "home"; 을 했을때
/WEB-INF/views/home.jsp가 나올 수 있는게 이 설정 덕분이다.
viewResolver는 사용자의 요청에 대한 응답 view를 렌더링 하는 역활이다.
prefix는 렌더링 시 handelr에서 반환하는 문자열의 앞에 붙여줄 문자열을 의미하고
suffix는 뒷쪽에 붙는 문자열이다.
<!-- 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>
root-context.xml
스프링 프로젝트 생성 시 root-context.xml에는 특별한 설정이 없다.
공통적으로 사용하려는 Bean을 그때그때 사용하면 되는 것 같다.
참조 사이트 :
web.xml 분석 - https://m.blog.naver.com/blogpyh/221128330192
Servlet이란? - https://mangkyu.tistory.com/14
WAS, Servlet Container, Servlet개념 - https://sharryhong.github.io/2017/06/03/java-servlet/
servlet-mapping - https://multifrontgarden.tistory.com/145
context에 관하여 - https://m.blog.naver.com/writer0713/220701612165
'Spring' 카테고리의 다른 글
[Spring] 스프링 부트(Spring Boot)란? - 특징, 사용 이유, 시작하기 (0) | 2023.03.06 |
---|---|
[Spring] Servlet, DispatcherServlet 이란 (0) | 2020.06.22 |