Tomcat - Spring 프로젝트를 사용하면서 헷갈리는 설정파일들을 정리해 본다
이 중 conf파일을 확인해 보면 web.xml, context.xml, server.xml 등의 설정 파일이 존재한다
이러한 설정파일에 대해서 정리하고자 한다
Tomcat의 server.xml은 톰캣이 실행 시 필요한 정보를 정의한 파일이다.
포트 정보, DB 접속정보, 웹 리소스(ex. jsp, image 파일) 참조경로, 이벤트 리스너(event listener) 등을 설정한다.
server.xml 구조
<Server>
<Listener/>
<GlobalNamingResources>
<Resource/>
</GlobalNamingResources>
<Service>
<Connector/>
<Engine>
<Realm/>
<Host/>
</Engine>
</Service>
</Server>
- Listener: 톰캣의 이벤트 리스너 정의
- GlobalNamingResources: JNDI정보, 즉 JDBC와 같은 java-DB 연결정보를 정의
- Service: 클라이언트의 요청을 어떻게 처리할지 정의 ( Connector를 통한 요청/응답 설정)
자바 웹 애플리케이션 (Host)에 대한 설정, Context를 통해 base설정, path 설정 가능
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log" suffix=".txt"/>
<Context docBase="board2_file_interceptor" path="/board" reloadable="true" source="org.eclipse.jst.jee.server:board2_file_interceptor"/>
</Host>
web.xml은 톰캣 실행환경에 대한 정보를 담당하는 `환경설정` 파일
위치는 CATALINA_HOME(톰캣홈디렉토리)\conf\web.xml에 위치
<!-- This document defines default values for *all* web applications -->
<!-- loaded into this instance of Tomcat. As each application is -->
<!-- deployed, this file is processed, followed by the -->
<!-- "/WEB-INF/web.xml" deployment descriptor from your own -->
<!-- applications.
- 애플리케이션이 실행될 때 WEB-INF/web.xml의 descripter에 따라 처리가 된다
서블릿 매핑
- 기본 Servlet과 jsp처리에 대한 jsp 서블릿으로 구성되어 있음
<!-- The mapping for the default servlet -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- The mappings for the JSP servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<!-- 시작페이지 설정 -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
context.xml
Context 설정은 톰캣에서 구동되는 하나의 웹 애플리케이션 자체의 설정을 의미
주요 설정으로 Context Path, 어플리케이션 디렉터리 설정이 있다
- 톰캣이 요청을 받으면 Catalina 가 요청에 맞는 Context를 찾고, Context는 자신이 설정된 애플리케이션의 deployment descriptor file(web.xml)을 기반으로 전달받은 요청을 서블릿에게 전달하여 처리되도록 한다
- 클라이언트 HTTP request -> Catalina -> Context -> servlet -> 클라이언트 response
<Context>
<!-- Default set of monitored resources. If one of these changes, the -->
<!-- web application will be reloaded. -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
</Context>
다른 폴더에서도 Context를 설정했던 것 같은데 어떤 서블릿으로 우선순위가 정해지나요?
Context 설정의 위치
A. server.xml의 <Host>의 자식 엘레멘트.
B. $CATALINA_HOME/conf/context.xml
C. $CATALINA_HOME/conf/[enginename]/[hostname]/ROOT.xml
D. $CATALINA_HOME/conf/[enginename]/[hostname]/context.xml.default
E. $CATALINA_HOME/conf/[enginename]/[hostname]/[contextpath]. xml
F. 애플리케이션의 /META_INF/context.xml
- 만약 중복된 설정이 존재할 경우 E, D, C, F, B, A 이렇게 높은 우선순위의 설정이 적용된다.
- 만약 특정파일에서 더 높은 우선순위를 부여하기 위해서는 override="true"를 설정할 수 있다.
사실상 톰캣은 요청이 들어오면 어떤 서블릿으로 전달해야 할지 전달과 응답으로 반환되는 값에서 jsp 서블릿이 jsp를 처리해 주는 역할만한다
웹 애플리케이션 구조
web.xml은 설정을 위한 설정 파일이다
- WAS가 처음 구동될 때 web.xml을 읽어 웹 애플리케이션 설정을 구성한다.
- DispatcherServlet을 등록해 주면서 스프링 설정 파일을 지정한다.
- DispatcherServlet은 초기화 과정에서 지정된 설정 파일을 이용해 스프링 컨테이너를 초기화시킨다.
<!-- 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>
<!-- DispatcherServlet이 해당 mapping을 찾지 못할 경우 NoHandlerFoundException를 throw하게 설정 -->
<init-param>
<param-name>throwExceptionIfNoHandlerFound</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
여기서 보면 Tomcat에서 설정했던 Default Servlet과 appServlet의 url-pattern이 동일하다
그렇다면 왜 우리 요청이 Tomcat의 Default Servlet이 아닌 Dispatcher Servlet이 요청을 받을까?
URL 우선순위(매핑 조건이 긴 게 우선)에 따라 서블릿의 매핑에 해당하는 것은 등록된 것으로 가고 나머지는 디폴트 서블릿이나 JSP 서블릿이 담당한다
-> Dispatcher Servlet이 전체 path에 대해 매핑을 해놨기 때문에 Dispatcher Servlet으로 요청이 가며 jsp에 대한처리는 JSP 서블릿이 담당하고 있는 것
Default Servlet은 어떤 일을 하는가?
- 톰캣과 같은 서블릿 컨테이너는 정적 자원 (HTML, CSS, JavaScript 파일 등)을 제공하기 위해 기본 서블릿(Default Servlet)을 가지고 있음
- 이 기본 서블릿은 `/` 또는 다른 정적 자원의 URL 패턴과 연결
- Dispatcher Servlet의 URL 패턴과 일치하지 않는 모든 정적 자원 요청은 기본 서블릿으로 전달됨
Dispatcher Servlet은?
- 스프링의 DispatcherServlet은 기본적으로 / 또는 /*와 같이 매우 일반적인 URL 패턴과 연결
- Dispatcher Servlet은 대부분의 요청을 가로채고 스프링 애플리케이션으로 라우팅
그렇다면 정적 페이지와 API 호출 URL을 분리하는 건? -> Default: `/` Dispatcher: `/api`
- 정적 자원 관리: 정적 페이지 (예: HTML, CSS, JavaScript 파일)는 변경되지 않는 경우가 많으며, 이러한 자원을 별도로 관리하는 것이 효율적입니다. 따라서, 기본 서블릿 (Default Servlet)을 사용하여 정적 자원 요청을 처리하고, 웹 서버 또는 CDN (콘텐츠 전달 네트워크)와 같은 정적 자원 제공 서비스를 통해 이러한 자원을 효과적으로 제공할 수 있습니다
- 동적 API 관리: 동적 API 요청은 서버 측 로직을 실행하고 클라이언트에 동적 데이터를 제공합니다. 이러한 요청은 스프링과 같은 웹 프레임워크를 사용하여 처리되며, Dispatcher Servlet을 통해 라우팅 됩니다 이를 통해 API 엔드포인트를 효과적으로 관리하고 관련 비즈니스 로직을 처리할 수 있습니다
- 보안: API 엔드포인트와 정적 페이지 간의 분리는 보안에 도움이 됩니다. API에 대한 액세스 제어, 인증 및 권한 부여를 구현하기 쉽습니다. 정적 자원은 공개적으로 접근 가능하도록 설정할 수 있고, 민감한 API는 보안 메커니즘을 통해 보호할 수 있습니다
- 확장성: 이러한 구조는 웹 애플리케이션을 확장하기 쉽게 만듭니다. 새로운 API 엔드포인트를 추가하거나 정적 자원을 업데이트하는 경우, 각각의 요청을 처리하는 데 필요한 서블릿을 개발 및 관리하는 것이 간편해집니다
정적 페이지와 동적 API 요청을 분리하여 처리하는 방식은 일반적으로 웹 애플리케이션의 구조와 관리를 개선하는 데 도움이 될 수 있음
'Spring' 카테고리의 다른 글
Mockito 테스트 Argument(s) are different 에러 (0) | 2023.05.01 |
---|---|
카카오 OAuth2.0 적용하기 - 1 (0) | 2023.01.09 |
Spring Security 작동 원리 (0) | 2022.11.23 |
Refresh Token이란? (1) | 2022.11.19 |
JWT란 무엇인가? (0) | 2022.11.18 |