Servlet & ServletContainer

김종하·2020년 10월 15일
1

DiveIntoJAVA

목록 보기
3/11
post-thumbnail

서블릿. 그 이전

웹 프로그래밍을 해본 사람이라면, 누구나 서블릿을 사용해봤을 것이다. 도대체, 어디서 이 서블릿이란 개념이 생겨났고 왜 생겨났을까? 그 이유를 알기 위해선 웹 프로그래밍의 역사에 대한 짧은 고찰이 필요하다.
웹 프로그래밍의 초창기, 그 동작은 지금에 비해 훨씬 단순했다. 클라이언트가 서버에 페이지를 요청하면 서버는 만들어져 있는 페이지를 있는 그대로 response 해주기만 하면 됐다. 하지만 모든 역사가 그러하듯, 웹 프로그래밍 역시 발전을 거듭하게 되면서 클라이언트의 요청에 따라 페이지를 조금씩 가공해 response 해주게 된다.


위 사진은 브라우저에서 velog 에 접속하면 우측상단에 보이는 화면인데, 보다시피 같은 요청을 보냈음에도 다른 화면을 받을 수 있게 됐는데. 이런 페이지를 우리는 동적페이지 라고 부르게 됐다.
그렇다면, 이 마법 같은 일은 도대체 어떻게 일어나는 것일까?
동작 과정을 생각해보면 대강 이러할 것이다. 클라이언트가 요청을 보낼 때, 단순히 페이지만 요청하는게 아니라 추가적인 데이터를 덧붙여 요청을 한다.
( " 1번 페이지 주세요 " 가 아니라 " 저는 jaden 인데 1번 페이지 주세요 " )
그럼 WAS 에서는 해당 데이터를 바탕으로 페이지를 가공하여 가공된 페이지를 response 해주는 식이다.
(Server 와 WAS 는 조금 다르다. 추후에 WAS 에 대한 포스팅도 올리도록 노력해보겠다)

당연히 클라이언트가 덧붙여 보내는 추가적인 데이터를 클라이언트측과 서버측이 서로 이해하려면, 규약이 필요하고 이런 규약이 바로 CGI(Common Gateway Interface) 인 것이다.

서블릿 이전에 C 나 Pear 과 같은 언어를 사용하여 가공된 페이지를 만들어주는 프로그램을 만들었다. (CGI를 사용하는 프로그램이니 CGI프로그램이라 하겠다) 이 프로그램은 앞서 말했던 WAS 에 배치되어 요청이 오면 페이지를 가공하는 역할을 담당하게 됐다. 그런데, 만약 다수의 클라이언트가 요청을 보내면 어떻게 될까? WAS에서는 요청마다 프로세스를 생성하여 즉, 멀티프로세싱을 이용하여 다수의 요청에 따른 처리를 했다.

서블릿의 등장

그런데 JAVA 로 구현한 CGI 프로그램 Servlet 은 바로 이부분에서 차별성을 만들어 낸다. 바로 멀티프로세싱이 아닌 멀티쓰레딩을 통해 다수의 요청을 처리하는 방식을 채택한 것인데 이를 통해 서버 사이드에서는 자원을 그 이전보다 훨씬 효율적으로 사용할 수 있게 된 것이다. 더불어 JAVA 프로그램이므로 JVM 위에서 작동하니, 이식성도 뛰어났다.

서블릿을 관리하는 서블릿컨테이너

WAS 에는 다양한 요청이 올 수 있다. A를 원하는 요청, B를 원하는 요청 C를 원하는 요청 등등 서블릿 인터페이스를 바탕으로 다양한 서블릿 클래스의 인스턴스들이 이런 다양한 요청에 대응하여 작업을 수행하게 된다.
서블릿 인터페이스에는 서블릿 객체의 라이프사이클과 관련된 추상메소드들이 있는데 init(), service(), destroy() 가 바로 그것이다.
https://docs.oracle.com/cd/E17802_01/products/products/servlet/2.5/docs/servlet-2_5-mr2/javax/servlet/Servlet.html
각설하고, 서블릿 컨테이너는 요청이 들어오면 해당 요청을 담당하는 서블릿의 service() 를 실행시켜 작업을 수행하게 한다. 이 때, 만약 해당 서블릿이 처음으로 요청을 받는다면 init()을 먼저 수행하여 인스턴스를 생성한 후 service()를 실행하여 작업을 수행하게 된다.
(그렇다면 서블릿 컨테이는 어떤 요청에 어떤 서블릿이 필요한지 어떻게 아는 것일까? 이는 마법이 아니라, 개발자가 특정 요청에 사용될 특정 서블릿은 무엇인지 맵핑을 해주어야 하고 이 맵핑 방법도 xml 에 명시하는 방법과 어노테이션을 사용하는 방법이 존재한다. 조금 더 나아가자면 이렇게 처리해두면 컨테이너가 알아서 init()을 통해 인스턴스를 만들어내고 service()를 실행시키는 Ioc(Inversion of Control) 이 가능해 진다.)

서블릿을 따라다니는 고양이 '톰'

서블릿을 공부하면 많이들 톰캣을 사용하게 된다. 누구는 이 톰캣을 WAS 라고 하고 누구는 서블릿컨테이너라고 하는데 뭐 사실 생각하기 나름일 것이다.
이 톰캣이란 녀석이 WAS 라고 하기에는 부족하고, 서블릿컨테이너라고 하기에는 서블릿관리만을 담당하는 것도 아니다. (JSP 도 사용할 수 있다.)
위키백과사전에는
톰캣: 서블릿과 JSP를 위한 웹 컨테이너
라고 설명되어 있는데, 이게 가장 명확한 표현인 것 같다. 어쨋든, 공짜로 사용할 수 있으니 못생겨도 귀엽다고 해주자

[도움을 얻은 곳]

0개의 댓글