서블릿이 없는 세상을 상상해보자.
오라클에서 발표한 서블릿 공식 설명은
A servlet is a small Java program that runs within a Web server. Servlets receive and respond to requests from Web clients, usually across HTTP, the HyperText Transfer Protocol.
다음과 같다.
즉, 웹 서버에서 실행되는 작은 자바 프로그램으로써, 클라이언트로부터 들어오는 HTTP 요청에 해당하는 응답을 담당한다.
서블릿은 매우 편하다. 클라이언트에 들어오는 HTTP요청을 알아서 통신 및 파싱하여 파싱된 정보에 맞게 이를 해석하게 해준다.
서블릿이 없다면 HTTP정보를 받기 위한 TCP/IP 소켓 연결부터 시작해서 정보를 파싱하는 로직, 파싱한 정보들에 맞게 정보들을 재가공하는 것 (content type같은 것) 까지 포함하여 수많은 기능을 담당해야 한다.
요청 정보를 다 파악한 후에, 비즈니스 로직을 실행하고
그 이후에는 다시 HTTP Response 메시지를 만드는 과정까지 거친다.
이 과정에서 중복이 생기는 부분은 비즈니스 로직 이외의 모든 것이다. 파싱과정은 중요하지 않다.
그래서 이러한 과정을 도와주기 위해 서블릿이 등장하였다.
URL 매핑 정보를 바탕으로 HttpServletRequest와 HttpServletResponse로 Http 메시지를 손쉽게 처리할 수 있게 된다.
@WebServlet(name = "example", urlPatterns = "/here")
public class ExampleServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response){
// 애플리케이션 로직만 실행한다. 나머지 과정은 서블릿이 알아서 처리
}
}
서블릿을 지원하기 위해 WAS 안에 서블릿 전용 컨테이너가 존재한다. (톰캣)
Bean들을 싱글톤으로 만들어주는 스프링 컨테이너처럼 말이다.
서블릿 전용 컨테이너에서는 서블릿 객체들의 생명주기를 관리한다. 물론 싱글톤이겠다. 다만, 유의할 점이 있다.
Request, Response는 항상 달라진다는 점이다.
서블릿 컨테이너에 등록되는 것은 단지 서블릿 객체일 뿐이고, Request와 Response정보는 서블릿 컨테이너 바깥 WAS내부에서 생성하여 서블릿 컨테이너에 파라미터로 넘긴다는 점에 유의하자.
즉, 모든 사람들의 요청은 컨테이너 덕분에 같은 서블릿 객체 인스턴스를 참조하지만, Request와 Response는 항상 다르다.
클라이언트로부터 요청('/here' 경로) 이 들어오면 HttpServletRequest와 HttpServletResponse를 새로 만든다.
방금 만든 ExampleServlet 서블릿 객체를 실행하고 HttpServletRequest HttpServletResponse를 파라미터로 넘긴다.
Servlet이 가공한 HttpServletResponse객체를 WAS에 return한다.
WAS는 HttpServletResponse 객체 정보를 바탕으로 HTTP Response Message를 만든다.
이를 웹 브라우저에 응답한다.