웹 서버 VS 웹 애플리케이션 서버
웹 서버는 정적인 리소스만 제공되는 서버다. 정적인 리소스는 HTML, CSS와 같은 즉시 응답 가능한 파일을 말한다. 반면 웹 애플리케이션 서버(WAS)는 동적인 웹 페이지를 만들고 응답해준다. WAS는 웹 서버가 할 수 있는 기능도 처리가 가능하며 비즈니스 로직을 수행할 수 있어 클라이언트에게 동적인 컨텐츠를 전달할 수 있다. WAS의 대표적인 예로는 Tomcat, JBoss등이 있으며 Tomcat에서는 서블릿을 이용해 동적인 요청을 처리해준다.
서블릿이란?
서블릿이란 서버에서 실행되는 작은 자바 프로그램으로 동적인 컨텐츠를 제공할 수 있는 기능을 제공한다. 서블릿은 서블릿 컨테이너에 의해 관리되며 서블릿의 생명주기도 컨테이너가 관리하게 된다. 다음 그림은 서블릿의 생명주기를 나타낸다.
생명주기 흐름을 나타내면 다음과 같다.
init()
으로 서블릿이 초기화 되어 생성된다.- 서블릿 컨테이너가 일치하는 url에 해당하는 서블릿 스레드를 생성해
service()
를 호출한다. destroy()
로 서블릿이 종료된다.
위의 과정이 일반적인 서블릿의 생명주기이며 서블릿 인터페이스는 다음 코드로 구성되어 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package javax.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public interface Servlet {
public void init();
public void service(HttpServletRequest request, HttpServletResponse response)
throws IOException;
public void destroy();
}
init()
, service()
, destroy()
는 서블릿 인터페이스로 제공되는 메서드들로, 서블릿 생명주기를 이용해 필요시에 비즈니스 로직을 구성할 수 있다.
클라이언트 요청과 응답 흐름
서블릿은 클라이언트로부터 요청이 들어오면 서블릿 컨테이너에 의해 관리되게 된다. HTTP 요청이 오면 서블릿의 실행 흐름은 다음과 같다.
- 클라이언트로부터 HTTP 요청이 오면 서블릿 컨테이너가 요청온 URL가 매칭되는 서블릿이 존재하는지 확인한다.
- 서블릿 컨테이너는
HttpServletRequest
,HttpServletResponse
객체를 생성하고 찾은 서블릿에게 스레드를 할당 해 매개변수로 요청과 응답 객체가 전달되어service(request, response)
를 호출한다. service()
는 HTTP 메서드에 따라 해당되는 메서드를 찾아 실행한다.- 서블릿은 클라이언트에게 응답을 반환해주고 서블릿의 생명주기는 끝나게 된다.
서블릿 컨테이너는 클라이언트의 요청마다 스레드를 생성해 서블릿에게 스레드를 할당한다. 따라서 서블릿을 사용할때는 스레드 동기화에 대한 문제가 생길 수 있어 공유되는 변수는 조심해서 사용해야 한다.