서블릿과 서블릿 컨테이너에 대한 개념적 흐름을 정리해보고자 한다.
자바 서블릿(Java Servlet)은 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 또는 그 사양(스펙)을 말하며 흔히 서블릿
이라고 불린다.
서블릿은 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종으로 JSP와 비슷한 점이 있으나, JSP는 HTML 문서 안에서 Java코드를 포함하고 있고 서블릿은 자바 코드 안에 HTML을 포함하고 있다는 것이 차이점이다.
서블릿은 Java EE 사양의 일부분으로 이 기능을 활용하여 웹 애플리케이션 구현이 가능하다. 이러한 비슷한 기술들의 예로는 CGI, mod_php, ASP 등이 있다
서블릿 표준 History
서블릿은 자바 기반의 CGI 프로그램으로 CGI 규칙에 따라 웹 서버와 데이터를 주고 받는다.
일반적으로 Web Server는 정적인 페이지만 제공하는데 동적인 페이지를 제공하기 위해서 Web Server는 다른 곳에 요청을 보내 동적인 페이지를 받아야 한다. 동적인 페이지는 사용자의 요청을 받아 그 요청에 맞는 처리를 애플리케이션단에서 처리함과 동시에 그와 상호작용된 동적으로 페이지를 만들어 내는 것이다. 여기서 말한 애플리케이션이 자바에서 서블릿이라고 할 수 있다.
실행 과정
1. 웹 브라우저가 서블릿 컨테이너에 요청을 보낸다.
2. 요청을 받은 서블릿 컨테이너는 HttpServletRequest, HttpServletResponse 객체를 생성
3. 사용자가 요청한 URL을 읽어 어느 서블릿에 대한 요청인지 web.xml에 정의된 서블릿을 찾는다.
4. 요청을 받은 서블릿은 서비스 메소드를 호출하여 클라이언트의 요청 Method가 GET인지 POST인지에 따라서 doGet(), doPost()를 호출한다.
5. 서블릿은 호출받은 요청에 따라 doGet(), doPost() 메소드 내부에서 부터 기술된 비즈니스 로직을 수행하고 동적 페이지를 만들어 HttpServletResponse 객체에 응답을 담아 보낸다.
6. 응답이 끝나면 서블릿을 제외한 쓰레드 및 객체들이 GC에 의해 소멸된다.
과정 흐름에서 전체적인 흐름과 서블릿이 무엇을 하는지는 대충 이해가 간다 그런데 서블릿 컨테이너는 무엇일까?
서블릿 컨테이너는 한 줄로 요약해서 말하자면
서블릿의 생성, 실행, 소멸 등의 생명주기를 관리하며, 서블릿 대신 웹 서버와 데이터를 주고 받는다.
서블릿을 만들어도 서블릿은 스스로 작동하는게 아니라 서블릿 관리자가 필요하다. 서블릿 컨테이너가 그 역할을 수행해주는 것이며 서블릿 컨테이너가 클라이언트 요청을 받아 응답할 수 있도록 웹 서버와 소켓으로 통신한다. 서블릿 컨테이너는 서블릿이 배포(deploy)된 컨테이너라고 할 수 있으며 클라이언트로 요청에 따라 대응되는 서블릿을 찾고 HttpServletRequest, HttpServletResponse 객체를 만들어 서블릿 스펙에 정의되어 있는 doGet, doPost 메소드의 인자로 전달된다.
이와 같은 서버측의 애플리케이션의 생성/실행/소멸을 관리하는 프로그램을 애플리케이션 서버(Application Server)라고 부르며, 그 중에 서블릿 컨테이너가 있고 서블릿 컨테이너와 같이 웹 기술을 기반으로 동작하는 애플리케이션 서버를 WAS(Web Application Server)라고 한다.
Java에서 WAS는 Java EE 의 기술 스펙을 준수하여 만든 서버이며 Java EE 구현체라고 부르기도 한다. 이러한 구현체들의 예를 들면, 상업용 WAS인 제우스, 웹스피어, 웹로직, JBoss Enterprise 등이 있고 무료 WAS인 WildFly(JbossAS), GlassFish, Geronimo 등이 있다.
여기서 대표적인 톰캣과 제티가 빠진 이유는 WAS와 서블릿 컨테이너에 구분이 모호하기 때문이라고 한다. 보통 톰캣, 제티를 WAS라고 말하기도 하지만 엄밀히 말하면 서블릿 컨테이너이다. 왜냐하면 서블릿 컨테이너는 JSP, 서블릿 API등을 지원하지만 EJB와 같은 것을 구현한 것은 아니기 때문이다. 따라서 간단한 차이점으로는 WAS는 EJB 와같은 것들을 지원하지만 서블릿 컨테이너는 EJB를 지원하지 않는다. 필자는 사실 이러한 스펙 관련한 내용을 잘 알지 못하기 때문에 일단은 이러한 차이점이 있고 톰캣을 WAS 또는 서블릿 컨테이너와 같은 단어로 혼용되어 사용하는구나 정도로 인지하고 넘어가려고한다. (WAS와 EJB에 관하여 좀 더 공부할 필요가 있어보인다.)