프로그래밍/Spring

[Spring] Tomcat의 내부 구조, 설정 파일에 대해 알아보자

byungmin 2021. 12. 28. 12:09

웹 서버 구조

Web Service Architecture 출처 :  https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html

 

톰캣의 내부 구조와 처리과정

Tomcat의 내부 구조

1. 클라이언트가 브라우저에서 URL을 요청 (8080포트) - ex) http://www.naver.com/event/list

2. 톰캣의 Thread Pool에서 해당 요청을 받아서 Connector를 통해 HTTP버전에 맞는 요청을 연결해준다.

3. Engine에서 URL에 해당하는 Host로 접근 - ex) www.naver.com  

4. 호스트의 각 Context(Spring Project) 로 접근 - ex) /event 

5. Context 내부에는 각각의 서블릿이 들어있으며 url에 맞는 서블릿에 접근한다. - ex) /list

6. 해당 서블릿이 실행되고 그 결과를 브라우저에  전송한다.

 

브라우저 요청 -> 톰캣서버 -> Host -> Context -> Servlet (DispathcerServlet) -> 결과값 응답 순으로 실행된다.

 

STS에서 요청, 응답 과정을 확인해보자

디버깅을 통해 실행 시 쌓여있는 호출 스택을 통해 Tomcat 내부에서 어떤일이 일어나는지 확인할 수 있다.

 

톰캣의 내부 설정 파일 - server.xml, web.xml

톰캣설치경로/conf/server.xml : Tomcat 서버 설정 파일

톰캣설치경로/conf/web.xml : Tomcat의 모든 web app의 공통 설정 

웹앱이름/WEB-INF/web.xml : 각 프로젝트별 web app의 개별 설정

(sts에서는 프로젝트/src/main/webapp/WEB-INF/web.xml)

 

server.xml 

<Server port="8005" shutdown="SHUTDOWN">
...
<Service name="Catalina">
...
    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
    ...
    // Engine은 여러 Host 포함 가능 그 중에서 어떤 host를 디폴트로 설정할지 지정할 수 있다.
    <Engine defaultHost="localhost" name="Catalina">
    ...
    	<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
        ...
        <Context docBase="ch2" path="/ch2_1" reloadable="true" source="org.eclipse.jst.jee.server:ch2"/>
        ...

- Host

appBase : 해당 폴더 안에 war파일 저장

unpackWARs : war파일로 배포하면 자동으로 압축을 풀라는 설정

 

web.xml ( 공통 설정)

// 서블릿 등록
<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

// 등록한 서블릿을 URL에 매핑
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

 

web.xml (개별 프로젝트 설정)

// 원격프로그램 등록
<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>
	
// URL 매핑
<servlet-mapping>
	<servlet-name>appServlet</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>

원격프로그램을 브라우저에서 요청하려면 서블릿으로 등록하고 URL을 연결해야 한다.

 

기존에는 web.xml에서 등록했던 것을 Spring에서 어노테이션으로 옮겨졌다. 우린 Spring에서 @Controller, @RequestMapping 어노테이션을 통해 원격프로그램을 연결했다.