본문 바로가기
IT 공부/자바와 웹 애플리케이션

[톰캣] - 웹 서버 기능을 구현하는 톰캣의 서블릿 매핑

by exdus3156 2024. 1. 2.

1. Web Serber vs WAS

톰캣은 Web Application Server(WAS)의 일종으로, 동적인 웹 콘텐츠를 서비스하는 서버 프로그램이다.

웹 애플리케이션 서버와 구분되는 개념으로 웹 서버(Web Server)가 있다. 웹 서버는 정적(static)인 데이터와 웹 콘텐츠를 제공해준다.

WAS가 웹서버의 업그레이드 버전이라고 이해해서는 안 된다. 단지 목적과 기능이 다를 뿐이다. 예를 들어, 어떤 웹 사이트가 특별히 사용자의 조건에 따라 동적인 데이터를 계산할 필요가 없으며, 콘텐츠 내용이 업데이트되는 주기도 매우 느리다면 어떻게 될까? 차라리 웹 서버가 나을지도 모른다. 

예를 들어, 코로나 현황 보드 웹사이트라면 특별히 사용자 로그인도 요구되지 않는데다, 정보만 예쁘게 잘 꾸며서 보여주는 용도다. 여기에 코로나 정보 업데이트 주기가 실시간이 아니라, 정부 부처가 매일 하루에 한 번 주기로 발표하는 정보에 따라 업데이트된다면..? 굳이 웹 애플리케이션 서버를 구축할 필요는 없을 것이다.

여하튼, 하고 싶은 말은 WAS나 Web Server나 장단점이 있다는 것이다.

 

2. 톰캣의 Web Server 기능

톰캣은 WAS로서 웹 애플리케이션 서버 기능을 담당한다. 엄밀하게 따지면 웹서버가 아니라 WAS다. 하지만 톰캣은 웹 서버 기능도 내장하고 있다. 실무에서는 WAS와 Web Server를 독립적으로 구축할 수도 있지만, 톰캣의 내장 웹 서버 기능을 활용할 수도 있다.

톰캣의 근본이 웹 애플리케이션 서버이고, 구체적으로 따지자면 URL 패턴에 매핑된 서블릿 코드를 실행하는 서블릿 컨테이너다. 

톰캣은 이러한 애플리케이션 서버의 기능을 활용해 웹 서버 기능까지 포괄해 구현한다.

톰캣의 설치 디렉토리의 [conf] 내에는 web.xml 파일이 있다. 이것은 모든 웹 애플리케이션 전체에 적용되는 상위 설정이다. 특정 웹 애플리케이션의 [WEB-INF] 디렉토리의 web.xml 과는 다르다.

이 파일에서도 URL 패턴에 대한 서블릿을 매핑할 수 있다.

파일에는 위와 같이 default servlet과 jsp servlet에 대한 매핑도 보여주고 있다. 

 

 

DefaultServlet (Apache Tomcat 9.0.84 API Documentation)

contextXsltFile protected String contextXsltFile Allow customized directory listing per context.

tomcat.apache.org

"The default resource-serving servlet for most web applications, used to serve static resources such as HTML pages and images."

디폴트 서블릿이 바로 정적 콘텐츠(html, css, js, ...)를 서비스하는 서블릿 코드다. 기본 루트인 / 에 매핑되므로 / URL에 대한 작업을 처리할 수도 있다.

물론 이 web.xml에 대한 매핑 정보는 최후의 수단으로서, 사용자가 자신의 애플리케이션의 WEB-INF 디렉토리 안에 있는 web.xml으로 동일 패턴을 오버라이딩(덮어쓰기)하면 작동하지 않는다. 디폴트 서블릿은 기존의 URL 매핑으로 연결되는 서블릿이나 필터를 찾지 못했을 때 작동한다.

따라서 톰캣을 웹 서버로 사용하는 것이 아주 바람직하다고 볼 수는 없다.

 

3. JSP 처리

JSP는 요즘 잘 사용하는 편은 아니라고 들었다. 하지만 명색이 JavaEE의 표준 명세이기 때문에 톰캣과 같은 서블릿 컨테이너가 이를 지원하고 있다.

JSP 코드는 겉으로는 html 파일처럼 생겼지만 결국은 서블릿 코드로 컴파일되어 실행되어야 한다. 따라서 이 기능을 담당하기 위해 JSP를 컴파일하고 처리하고 실행하는 애플리케이션(서블릿)이 있어야 하며, 이것이 바로 jsp servlet이다.

역시나 위 그림의 web.xml을 보면 모든 *.jsp 확장자에 대해 JSP Servlet이 받아서 처리한다고 나와 있다. 웹 서버의 동작 원리와 비슷한 원리다.