web.xml
was(톰캣)에게 servlet에 대한 정보는 줘야하는데 이때 쓰이는 파일이다
WAS가 처음 구동될떄 web.xml을 읽어 웹어플리케이션 설정을 구성한다
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
dispatcher는 항공기 운항 관리자(관제사),배차 담장자 라는뜻
servlet에 대합해보면 servlet Container로부터 들어오는 요청을 관제하는 컨트롤러다
아래 부분은 모든 요청을 DispatcherServlet이 처리하도록 서블릿 매핑을 설정한다.
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
url-pattern은 *.do,/*,/이런식으로 많이 혼용해서 사용했는데
*.do는 무의미한 확장자로 옛날에 사용하던 방식이고
/*는 톰캣(conf)에 있는 기본 web.xml의 .jsp를 처리하는 설정파일을 무시해버리게 되므로
/를 사용하는게 맞다
여기서 servlet-mapping을 /로 사용하게 되면 /*를 사용하는것과 마찬가지로
/*를 사용하는 것과 마찬가지로 톰캣에 있는 / 설정을 무시해버리게 되는 것이다.
여기서 한가지 알아둬야할 부분은 .jsp든 .css든 .js든 파일에 직접 접근하는 경우는 없다.
요청은 톰캣이 받게되고 서블릿에 패턴을 요청해서 처리하게 되는데 이 설정을 뭉개버린 것이다.
servlet-context.xml에 다음과 같은 코드를 통해 이 문제를 해결할 수 있다.
<mvc:default-servlet-handler />
설정을 추가하면 default-servlet-handler가 빈(Bean)으로 추가된다.
매핑되는 핸들러가 없다면 default-servlet-handler가 요청을 처리하게 된다.
또는 이 방법으로도 해결할 수 있다.
<mvc:resources mapping="/resources/**" location="/resources/"/>
root-context : 이 context에 등록되는 Bean들은 모든 context에서 사용되어 진다.(공유가 가능하다)
servlet-context : 이 context에 등록되는 Bean들은 servlet-container에만 사용되어진다.
@Controller는 servlet-context에 등록하고
@Service와 @Repository 등 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을 그때그때 사용하면 되는 것 같다.
'SPRING' 카테고리의 다른 글
db 이중화 작업(springBoot,mybatis) (0) | 2023.11.24 |
---|---|
MVC 패턴 구현 순서 (1) | 2023.11.24 |
Context란? (1) | 2023.11.24 |
로그인시 사용하는 HttpServletRequest와 HttpSession (0) | 2023.11.13 |
ModelAttribute,RedirectAttributes (0) | 2023.11.13 |