본문 바로가기
Spring

톰캣과 스프링 web 설정

by wwns 2023. 10. 25.
반응형

Tomcat - Spring 프로젝트를 사용하면서 헷갈리는 설정파일들을 정리해 본다

https://hamdi.tistory.com/23

이 중 conf파일을 확인해 보면 web.xml, context.xml, server.xml 등의 설정 파일이 존재한다

이러한 설정파일에 대해서 정리하고자 한다

https://hamdi.tistory.com/23

 



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 &quot;%r&quot; %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를 처리해 주는 역할만한다

 

 


웹 애플리케이션 구조

https://hamdi.tistory.com/23

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