서블릿(Servlet)과 JSP(Java Server Page), 그리고 서블릿 컨테이너(Servlet Container)

서블릿(Servlet)이란?

기존의 웹 환경은, 요청에 해당하는 준비된 웹페이지를 클라이언트에게 보여주는 정적인 웹 환경이었다. 처음에는 이 정도로도, 충분히 웹은 자신의 역할을 할 수 있었다.

허나 시간이 지나, 클라이언트는 점차 더 많은 것을 요구하기 시작했다. 단순히 준비된 웹페이지를 보여주는 것에서 벗어나, 요청에 따라 어떠한 일련의 작업을 하고 그 결과를 제공 받길 원했고, 이러한 서비스를 제공하는 동적인 웹 환경의 필요성이 대두되었다.

서블릿이란 자바의 웹 프로그래밍 기술이며, 웹 서버와 자바를 연결하여 클라이언트의 요청에 따라 자바로 만들어진 서비스가 제공되도록 만들어준다.

서블릿의 생명주기는 다음과 같다.

  1. 서블릿이 최초로 호출되면 서블릿 인스턴스가 생성되며, 이것은 메모리에 계속 상주한다.
  2. 클라이언트의 요청이 있을 때마다 스레드를 생성하여 일련의 작업을 실행한다.
  3. 일련의 작업이 끝난 후 클라이언트에게 응답한다.

서블릿이 더 이상 필요하지 않게 되어 제거되기 전까지 2~3번의 과정이 반복된다.

그럼 JSP(Java Server Page)는?

위의 서블릿을 사용하여 동적인 웹 환경을 구축하는 데에 성공했다. 훌륭하다. 그러나 구축하는 것으로 모든 것이 끝난다면 얼마나 좋을까. 서블릿을 통해 웹페이지를 구현했는데, 수정하고자 하니 큰 애로사항이 발생했다. 애초에 자바에서 HTML을 문자열 형식으로 코딩하는 것이 얼마나 비효율적이고 가독성이 떨어지며, 하물며 수 십 줄도 아니고 수 백 줄의 HTML이라면 어떻게 하겠는가?

이러한 고충을 해결하는 데에 JSP는 큰 기여를 했다. 기존의 서블릿이 자바 코드 안에 HTML을 포함시키는 것이었다면, JSP는 HTML 안에 자바 코드를 포함시키는 형태였다. 수 백 줄의 HTML을 굳이 자바의 문자열로 코딩할 필요가 없어진 것이다!

그렇지만 JSP도 내부적으로 서블릿으로 변환된다는 점은 잊지 말도록 하자.

서블릿 컨테이너(Servlet Container)

서블릿/JSP를 이용한 웹 애플리케이션을 구축한 경험이 있다면, 아마도 아파치 톰캣(Apache Tomcat)이라는 것을 사용해본 적이 있을 것이다. 우리가 잘 알고 있는 이 아파치 톰캣이 바로, 서블릿 컨테이너다.

서블릿 컨테이너는 그 이름처럼 서블릿을 담고 있는 컨테이너라고 생각하면 쉽다. 허나 단순히 담고 있는 것으로 끝나는 것이 아니라, 서블릿을 관리한다.
클라이언트의 요청을 받고, 요청에 해당하는 서블릿을 찾고, 서블릿을 생성하여 메모리에 상주시키고, 요청에 해당하는 일련의 작업을 실행하며, 그 결과를 다시 클라이언트에게 응답해주는 이러한 과정을 서블릿 컨테이너가 관리하는 것이다.

web.xml의 역할은 무엇인가?

위에서 본 서블릿 컨테이너의 안에는 여러가지 설정 정보가 저장되어 있는 배포 서술자(Deployment Descriptor, DD)가 존재한다. 우리가 서블릿 설정할 때 사용하는 web.xml 파일이 바로 이 배포 서술자에 해당한다. web.xml에서 서블릿의 이름과 클래스, 그리고 URL 매핑을 설정하며, 이러한 정보를 서블릿 컨테이너가 사용하는 것이다.