웹 서버란, Client의 요청에 따라서 알맞은 응답을 반환하는 주체(프로세스)이다. 일반적으로 HTTP 또는 그 외의 프로토콜(SMTP, FTP …)을 사용하여 Client와 통신하며, 주로 HTML 문서나 JavaScript 파일 등을 클라이언트에게 전송하게 된다. 대표적인 Web Server 프로그램에는 Apache, Nginx 등이 있다.
웹서버와 클라이언트의 통신과정을 개략적으로 표현해보자면 다음과 같다.
이처럼 Web Server는 요청에 따라서 정적인 데이터 를 클라이언트에게 제공하게 된다. 그러나 정적인 데이터를 제공하는 웹 서버만으로는, 동적으로 작동하는 웹 페이지를 서비스하기가 어렵다.
예를 들어, 로그인한 사용자의 이름에 따라 Welcome <사용자이름>! 과 같은 메세지를 띄워주는 웹 사이트를 만든다고 가정해보자. 웹서버는 사용자 수만큼의 HTML 파일을 저장해놓고 있다가, 요청에 따라서 서로 다른 HTML 파일을 전달해 주어야 할 것이다.
이 경우, 클라이언트는 사용자별로 서로 다른 요청(/userA, /userB, …)을 보내야하고, 서버는 사용자 수만큼의 HTML 파일을 서버에 항상 저장하고 있어야 할 것이다. 이는 사용자가 점점 늘어날수록 수많은 중복된 HTML 파일을 만들어야 하므로 번거롭고 비효율적이다.
따라서 이런 문제를 해결하고, 동적으로 데이터를 제공해주고자 생겨난 것이 Web Application Server(WAS) 이다.
WAS(Web Application Server)란 웹서버와 웹 컨테이너를 합친 개념으로써, 클라이언트의 요청에 따라서 동적으로 데이터를 생성하여 클라이언트에게 응답해주는 서버를 말한다.
웹 애플리케이션 서버를 통해 응답이 오는 과정을 좀 더 자세히 살펴보자면 아래와 같다.
위처럼, 웹서버가 동적인 데이터 제공이 필요한 경우 요청(HTTP Request)을 웹 컨테이너에게 넘기면, 웹 컨테이너는 해당 요청을 분석하여 알맞은 응답을 다시 웹서버에게 보내주고, 웹서버는 클라이언트에게 응답 데이터(HTTP Response)를 다시 전송하게된다.
그렇다면, 웹 컨테이너는 정확히 어떤 역할을 하는지 알아보자
다음은 위키피디아에 올라와있는 웹 컨테이너의 정의이다.
A web container (also known as a servlet container and compare "webcontainer") is the component of a web server that interacts with Jakarta Servlets. A web container is responsible for managing the lifecycle of servlets, mapping a URL to a particular servlet and ensuring that the URL requester has the correct access-rights. A web container handles requests to servlets, Jakarta Server Pages (JSP) files, and other types of files that include server-side code. The Web container creates servlet instances, loads and unloads servlets, creates and manages request and response objects, and performs other servlet-management tasks. A web container implements the web component contract of the Jakarta EE architecture. This architecture specifies a runtime environment for additional web components, including security, concurrency, lifecycle management, transaction, deployment, and other services. [출처: 위키피디아]
위 설명에서 알 수 있듯이, 웹 컨테이너는 “서블릿 컨테이너” 라고도 불리며, 서블릿의 생명주기를 관리하고, 특정한 URL을 알맞은 서블릿으로 매핑해주는 등 서블릿을 전반적으로 관리해주는 역할을 수행한다.
(지금 말하는 “서블릿”은 기술 자체를 의미하는 것이 아닌, “서블릿 객체” 또는 “서블릿 인스턴스” 를 의미한다.)
이처럼 웹 컨테이너는 서블릿(객체)을 생성해 알맞은 메소드를 호출하며 서블릿을 관리하고, 클라이언트로부터 온 요청에 알맞은 서블릿을 호출하여 요청을 처리한다. 서블릿이 요청을 모두 처리하여 결과를 웹 컨테이너에 반환하면, 웹 컨테이너는 이를 HTTP 응답으로 변환하여 웹서버로 전달하게되고, 이는 다시 클라이언트에게 전달되게 되는것이다.
지금까지 다룬 내용을 전체적으로 나타내보면 다음과 같다.
마지막으로, 실제 프로젝트에서는 WAS 역할을 Tomcat이 모두 수행하거나, Apache 또는 Nginx가 Web Server로서 동작하고, Tomcat이 Web Container 역할을 수행하게 된다. 참고로 Tomcat만으로 WAS 역할이 가능한 이유는 Tomcat이 Apache 서버의 기능 일부를 포함하고 있기 때문이다.
앞으로 Tomcat이 실제로 어떻게 동작하는지와 서블릿의 구체적인 생명주기 등에 대해 다룬 후, 서블릿과 스프링 컨테이너에 대해 다루어보려고 한다.