본문 바로가기

[Servlet] 02-1 | WAS: Web Server와 서블릿 컨테이너

Servlet으로 웹 사이트를 만들기 위해 앞으로 톰캣(Tomcat)이라는 무료 WAS (Web Application Server)를 사용할 예정입니다. 톰캣은 Web Server 부분 그리고 서블릿 컨테이너 부분으로 이루어져 있습니다.

이번 글에서는 이 Web Server와 서블릿 컨테이너에 대해 알아보겠습니다.

01. Web Server

Web Server (웹 서버)라는 용어는 (1) 하드웨어인 컴퓨터를 지칭하기도 하고, (2) 소프트웨어인 프로그램을 지칭하기도 하고, (3) 둘 모두를 동시에 지칭하기도 합니다.

 

(1) 하드웨어로서 Web Server란 1️⃣ Web Server 프로그램(일반적으로 HTTP Server)과 2️⃣ 웹 사이트의 정적 자원(HTML 파일, CSS 파일, Javascript 파일, 이미지 등)이 위치한 컴퓨터를 의미합니다. 

 

하드웨어로서 Web Server

 

(2) 소프트웨어로서 Web Server란 웹을 이용하는 사람들이 서버(Server) 단에 위치한 파일에 접근하는 방식을 통제하는 프로그램을 의미합니다.

 

> HTTP 서버

Web Server는 다양한 프로토콜(두 컴퓨터가 통신하기 위해 사용하는 규칙 <예시> HTTP, FTP, DNS, SMTP 등)을 지원할 수 있지만 대부분의 Web Server는 기본적으로 HTTP 서버입니다. HTTP 서버란 URL(웹 주소)과 HTTP(브라우저가 웹 페이지를 보기 위해 사용하는 프로토콜)를 이해하는 소프트웨어 서버입니다.

 

(3) 종합하자면 브라우저가 요청을 보내는 Web Server란 하드웨어이자 소프트웨어입니다. Web Server 컴퓨터에 요청이 도달하면 소프트웨어 HTTP Server가 요청을 받아들이고 요청받은 문서를 찾아 브라우저에게 돌려보냅니다.

 

02. WAS (Web Application Server)

웹 사이트를 운영하기 위해서는 정적 웹 서버와 동적 웹 서버가 모두 필요합니다.

 

정적 웹 서버란 정적 자원을 제공하는 서버를 의미합니다. 정적 자원의 예로는 HTML 파일, CSS 파일, Javascript 파일, 이미지 등이 있습니다. 이들을 '정적' 자원이라고 부르는 이유는 서버가 이 파일들을 '있는 그대로' 브라우저에 전송하기 때문입니다. 위에서 살펴본 HTTP 서버는 정적 웹 서버입니다.

정적 웹 서버 소프트웨어 제품들

 

동적 웹 서버는 HTTP 정적 웹 서버에 더해 동적 자원을 처리할 수 있는 추가적인 프로그램으로 이루어져 있습니다. 동적 자원의 예로는 JSP, Servlet 등이 있습니다. 이들을 '동적' 자원이라고 부르는 이유는 HTTP 서버(정적 웹 서버)가 이 파일들을 있는 그대로 브라우저로 보내지 않기 때문입니다. 이 파일들은 프로그래밍적으로 처리된 후에 브라우저에 전달됩니다.

동적 웹 서버가 있다면 웹 페이지를 만들 때 수백 개의 HTML 문서를 준비하지 않아도 됩니다. 몇 개의 HTML 템플릿만을 사용하여 내용만 그때그때 교체할 수 있습니다. WAS (Web Application Server)가 동적 웹 서버에 해당합니다. 

동적 웹 서버 소프트웨어 제품들

 

WAS 제품으로는 아파치 재단의 톰캣(Tomcat), 오라클의 웹로직(WebLogic), 티맥스소프트의 제우스(JEUS), IBM의 웹스피어(WebSphere), 레드햇의 제이보스(JBOSS) 등이 있습니다. 어떤 개발사의 WAS 제품이든지 이들은 모두 썬 마이크로 시스템즈가 개발한 JAVA EE의 스펙을 따르고 있습니다. 따라서 자바로 구현한 웹 애플리케이션이라면 모든 개발사의 WAS에서 운영할 수 있습니다. 이를 두고 자바 웹 어플리케이션은 서버 간 이식성이 보장된다고 표현하기도 합니다.

 

앞으로 웹 사이트를 만들 때 사용하고자 하는 제품은 아파치 재단에서 개발한 톰캣입니다. 톰캣은 WAS에 해당하기는 하지만 다른 WAS에서 제공하는 핵심적인 기능(<예시> 클러스터링, 부하 분산, 보안 등)을 지원하지 않기 때문에 비교적 제한적인 WAS입니다. 이런 이유로 톰캣은 주로 작은 규모의 웹 어플리케이션을 구축할 때 사용된다고 합니다.

 

03. 톰캣의 서블릿 컨테이너

톰캣(Tomcat)은 HTTP Web Server와 서블릿 컨테이너로 구성되어 있습니다. 다시 말해 톰캣은 HTTP Web Server를 내장하고 있습니다.

톰캣의 Web Server는 HTTP 서버로서 HTML, CSS, 이미지 등 정적 자원의 처리를 담당합니다. 톰캣에 정적 자원 요청이 들어온 경우, Web Server가 자체적으로 정적 자원을 검색한 후에 바로 브라우저에 응답할 수 있으므로 응답 속도가 빠릅니다.

 

톰캣의 서블릿 컨테이너는 JSP, Servlet 등 동적 자원 처리를 담당합니다. 톰캣으로 동적 자원 요청이 들어오면, HTTP Web Server는 이를 처리할 수 없어 해당 요청을 서블릿 컨테이너로 포워딩합니다. HTTP Web Server로부터 요청을 넘겨받은 서블릿 컨테이너는 동적 자원을 적절하게 처리한 후 그 결과를 HTTP Web Server에 돌려보냅니다.

동적 자원 요청을 처리하기 위해서는 여러 절차를 거쳐야 하므로 정적 자원과 비교했을 때 상대적으로 더 많은 시간이 소요됩니다.

 

서블릿 컨테이너는 톰캣 서버를 구동할 때 자동으로 생성됩니다. 톰캣 서버를 구동하면 콘솔에 '서버 엔진을 시작합니다.'라는 메시지가 출력되는데, 이 메시지에서 말하는 '서버 엔진'이 바로 서블릿 컨테이너입니다. 

 

서블릿 컨테이너는 Servlet (서블릿) 클래스의 객체를 생성하고 관리합니다. 서블릿 컨테이너는 자신이 생성하고 관리할 Servlet (서블릿) 클래스들에 대한 정보를 `WEB-INF` 폴더에 있는 web.xml 파일을 통해 획득합니다. 

*WEB-INF 폴더는 브라우저에서 직접 요청할 수 없는 보안된 디렉터리입니다. 이 폴더에는 web.xml 파일, 컴파일된 클래스 파일들, 애플리케이션 실행에 필요한 외부 라이브러리(jar) 파일 등이 들어있습니다.

WEB-INF 폴더 내의 web.xml 파일 / web.xml 파일의 일부

 

Servlet (서블릿) 클래스

Servlet (서블릿)은 서버에서 실행되는 Java EE 기반의 클래스입니다. Servlet (서블릿) 클래스는 다음과 같은 규칙에 따라 작성해야 합니다.

  • 서블릿 컨테이너가 Servlet 클래스에 접근할 수 있도록 public으로 선언
  • javax.servlet.http 패키지를 import하여 HttpServlet 클래스를 상속받음
  • javax.servlet.http 패키지의 HttpServletRequest과 HttpServletResponse 객체를 메서드의 매개변수로 사용
  • javax.servlet 패키지를 import하여 ServletException을 메서드의 예외 클래스로 사용
  • java.io.IOException을 메서드의 예외 클래스로 사용
  • 생성자는 반드시 기본 생성자 소유
  • Servlet 객체의 생애주기와 관련된 콜백 메서드(<예시> init(), service(), destroy())를 오버라이딩

다음은 서블릿 클래스의 예시입니다.


참고 자료

도서

- 채규태, <03장 서블릿 객체와 라이프 사이클>, <<채쌤의 Servlet&JSP 프로그래밍 핵심>>, 쌤즈, 2022년, 55~78쪽

 

- mdn web docs, "What is a web server?", 글 보러가기