들어가기전에.. 그냥 주저리..
막연하게 스프링을 공부해야지.. 하고나서 스프링을 공부하려고 보니 너무 어려웠다. 그 이유가 무엇인가 생각을 해보니 기본적으로 servlet, jsp 웹프로그래밍에 대해 경험도 없고 지식도 없었던 것이 큰 장애물 이었던 것 같다. 더하기를 모르고 곱하기를 하려고 했던 느낌이랄까.. 아무튼 내가 느끼기엔 그랬다. 지금도 잘 아는 것은 아니지만… 서블릿 컨테이너의 이해라는 책을 보고 간략하게 제 생각과 정리할 것을 적어봤습니다.
서블릿이란?
1997년 SUN사에서 웹 서비스를 위한 기본 인터페이스로 서블릿을 제안했다. 서블릿을 배치, 서비스하는 구조로 서블릿 컨테이너의 개념도 전파했다.
서블릿은 javax.servlet.Servlet 인터페이스를 구현한 것이 서블릿이라고 한다.
나의 생각으로는 web application 이라는 생각을 하고 있다. Servlet 자체가 web application 이라기 보다는 Servlet을 이용해서 웹 서비스를 하고 내부적인 비지니스 로직과 같은 부가적인 기능을 더하면 Web application이라고 생각한다. 이러한 생각을 하는 이유는 또 있다.
Servlet은 기본적으로 우리가 자바 응용프로그램을 만들때 public static void main에서 프로그램이 시작한다면 Servlet은 서블릿 컨테이너에 의해 생성, 호출, 소멸이 이루어진다. 또한 서블릿 컨테이너가 네트워크 통신, 생명주기 관리, 스레드 기반의 병렬처리를 대행해 주기도 한다. 이렇게 보면 Servlet은 서블릿 컨테이너에서 돌아가는 일종의 프로그램이라고 할 수 있다. 그렇게 따지면 서블릿 컨테이너는 서블릿을 관리하는 작은 os와 같이 생각을 할 수 있다고 생각한다.(os가 해주는 역할을 다 하지는 않겠지만..)
서블릿과 서블릿 컨테이너(tomcat)
앞서 말했듯이 서블릿은 서블릿 컨테이너에서 관리된다. 서블릿 컨테이너는 bootstrap.jar와 tomcat-juli.jar 이렇게 2개만 classpath에 지정되어 있다.
이 2개는 서블릿 컨테이너가 서버를 띄우기 위해 필요한 것이다. 서버가 정상적으로 작동되고 나면 우리가 작성한 서블릿은 어떻게 올라가게 되는 것일까?
우리가 만든 서블릿을 서버위에서 동작시키려면 우리가 만든 서블릿class를 서블릿 컨테이너가 찾을 수 있어야 한다. 또한 어떠한 url로 요청이 들어 왔을때 우리가 만든 서블릿을 실행해야 한다는 사실을 알려줘야 한다. 이러한 과정을 배치라고 한다. 배치를 하기 위해 우리가 만든 서블릿을 서블릿 컨테이너가 알 수 있도록 해야 한다.
서블릿 컨테이너가 서블릿을 탐색하는 방법
서블릿 컨테이너는 웹 애플리케이션의 구조를 보고 탐색하게 된다. 그 구조는 web-inf 폴더내의 클래스 파일과 web.xml을 보고 판단하게 된다.
url은 web.xml에 정의된 url 패턴에 따라 처리할 서블릿이 결정이 된다. 서블릿 컨테이너는 public static void main을 통해 실행 됩니다.
여기서 command에 따라 분기를 나누어 각 상태에 맞는 로직을 실행합니다. 서블릿 컨테이너가 서블릿(웹 애플리케이션을 실행하는 단계를 요약해 보면 다음과 같습니다.)
- 서블릿 컨테이너가 서블릿이 포함된 웹 애플리케이션을 동작시키기 위해 클래스 로더를 생성하고
- 클래스 로더는 서블릿 명세에 미리 약속된 특정 위치 web-inf/lib, web-inf/classes에 있는 jar나 class 파일을 로딩 합니다.
- 모든 서블릿은 javax.servlet.Servlet 인터페이스를 구현한 것이므로 사용자가 작성한 다양한 형태의 서블릿을 Servlet.service 메소드로 호출 할 수 있습니다. 따라서 서블릿 컨테이너는 클래스 로더와 인터페이스를 이용해서 우리가 만든 서블릿을 호출하게 됩니다.
간략하게.. 제 생각이 섞여서 어떻게 보면 뒤죽박죽일 수 있는 내용입니다. 혹시나 궁금한 점, 틀린 점이 있으시면 댓글 달아주시면 감사하겠습니다.