자바(Java)/JAVA 2EE

서블릿(Servlet)이란?

본클라쓰 2010. 12. 5. 17:02

 서블릿은 Java 2 EE 플랫폼의 기본 컴포넌트로 웹 컨테이너에 탑재되어 동적으로 웹 페이지를 만드는 프로그래밍 언어를 말한다.

서블릿은 서버 어플리케이션을 이루는 기본 컴포넌트이며 현재는 HTTP 프로토콜을 위한 서블릿이 대세를 이루고 있다. 우선 HTTP 프로토콜을 사용한 클라이언트와 서버간에 통신 방법에 대해 알아보자.

 

 

 

■ HTTP 프로토콜을 사용한 클라이언트와 서버간의 통신 절차

 

 클라이언트는 정보를 얻기 위해 서버에 HTTP 요청 메시지에 필요한 파라미터를 포함하여 서버에 전달한다. 서버는 클라이언트로부터 들어온 HTTP 요청을 해석하여 단순한 정적 자원에 대한 요청일 경우 해당 자원을 반환해주고, 그렇지 않은 요청일 경우에는 CGI 프로그램을 실행시켜 해당 결과를 리턴해준다.

 

 이 때 서버는 CGI 프로그램에게 클라이언트의 요청과 파라미터를 전달해 주고, 생성된 결과를 전달받기 위해 파이프라인을 연결한다. 파이프 라인이란 두 개의 프로그램 간에 서로 데이터를 주고 받기 위한 방법 중의 하나로 A프로그램의 표준 출력 방향을 B프로그램의 표준 입력을 설정하고, A프로그램의 표준 입력을 B프로그램의 표준 출력으로 설정하는 것을 말한다.

 

 웹 서버에 의해 실행된 CGI 프로그램은 환경변수, 파라미터, 서버에 존재하는 여러 시스템 자워, 기존의 시스템 또는 데이터베이스 등과 같은 여러 가지 자원들을 이용해 클라이언트가 요청한 작업을 수행한다.

 

 CGI 프로그램은 요청한 서비스에 해당하는 작업을 수행한 후 그 결과를 클라이언트에게 전달하기 위해 결과 페이지에 해당하는 MIME 타입의 컨텐츠 데이터를 웹 서버와 연결된 파이프라인에 출력함으로써 서버에 전달한다.

 

 서버는 파이프라인을 통해 CGI 프로그램에서 출력한 결과페이지의 데이터를 읽어 HTTP 응답 헤더를 생성하고 결과페이지의 데이터를 HTTP 응답 메시지의 엔티티 바디로 설정하여 클라이언트에게 반환해 준다.

 

이와 같은 순서로 클라이언트가 서버가 통신을 한다.

 

 

 

Java 2 EE의 플랫폼의 핵심인 서블릿(Servlet)의 특징

 

 서블릿은 웹 서버측에서 실행되므로 CGI 방식을 따라야 하며, 웹 서버에 존재하는 수 많은 자원에 접근할 수 있어야 하며, 자바 프로그램이므로 자바 문법을 따라야 하며, 자바 서블릿이 실행될 수 있도록 자바 실행 기능을 지원해 주어야 한다.

 

 서블릿은 서블릿 컨테이너를 통해 프로그램을 실행하는데 웹 서버와 서블릿은 네트워크를 통해 요청을 전달한다. 이렇게 네트워크를 통해 웹 서버와 서블릿 컨테이너가 메시지를 주고 받기 때문에 웹 서버가 실행되는 컴퓨터와 컨테이너가 실행되는 컴퓨터는 달라도 상관이 없다. 대신 두 대의 컴퓨터는 네트워크로 연결되어 있어야 한다.

 

 이처럼 서블릿 컨테이너는 네트워크를 통한 통신으로 무한한 확장성(Scalability)를 제공한다. 웹 서버와 서블릿 컨테이너가 네트워킹을 한다는 것은 같은 머신에서 실행될 필요없이 두 대 이상의 머신에 분산되어 실행될 수 있다는 것을 의미한다. 이는 서버의 부하를 줄일 수 있고, 보다 쉽게 서버를 확장할 수 있다는 것을 의미한다.

 

 

 

CGI 프로그래밍과 서블릿 프로그래밍 비교 

 

 대표적인 동적 웹 페이지 제작 언어가 CGI(Common Gateway Interface)이다. CGI는 웹 클라이언트의 요청에 따라 서버에서 프로그램을 실행한 후 결과를 페이지로 생성해 웹 클라이언트에게 응답하는 언어이다. CGI 프로그래밍은 프로그램 코드 안에 HTML 태그를 작성하여 문서를 출력하는 방법으로 웹 페이지를 제작하였다.  

 

println("<head>");

println("<title>CGI 프로그래밍 예제</title>");

println("<head>");


println("<body>");

println("<h2>CGI는 이런 방식으로 제작하였습니다.</h2>");

println("</body>");

 

 CGI 방식은 위와 같이 println() 함수 안에 태그를 작성하여 페이지를 출력하였다. 이에 자바측에서도 CGI 방식에 대응하는 기술로 서블릿을 발표한다. 서블릿은 웹 서버에서 실행되는 작은 자바 프로그램으로 자바 언어를 기반으로 웹 페이지를 동적으로 생성하는 서버측 프로그램이다. 서블릿은 CGI 프로그램과 마찬가지로 프로그램 코드 안에 태그를 작성하여 출력한다. 즉 서블릿은 실행 결과를 HTML 태그로 작성하는 방식이다.

 

 또한, 서블릿은 프로그램을 수행해야 하기 때문에 웹 컨테이너는 서버 프로그램이 필요하다. 컨테이너는 웹 클라이언트의 요청을 받아 요청에 해당하는 서블릿을 실행시켜 결과를 출력해주는 서버측 프로그램이다. 따라서 서블릿으로 작성된 프로그램 코드는 독립적으로 동작할 수 없고, 서블릿 컨테이너 안에 배치되어 컨테이너가 클라이언트의 요청 당 하나의 쓰레드를 생성하여 클라이언트의 요청을 전달해 주고 응답하는 방식으로 동작한다.

 

 이는 작성한 서블릿의 생성과 소멸시기를 개발자가 지정해 주는 것이 아니라 웹 클라이언트의 요청이 들어오면 요청에 해당하는 서블릿을 컨테이너가 선택하여 생성해주고 수행한 결과를 웹 클라이언트에게 반환하고 서블릿을 소멸시키는 방식이다. 따라서, 개발자는 해당 요청에 수행할 서블릿 클래스만 작성한 후 요청과 수행할 서블릿 클래스를 컨테이너에게 등록하는 절차만 가지면 된다.

 

 또한, 서블릿은 자바 기술을 사용한 CGI 프로그래밍 언어기 때문에 자바의 특성을 가지고 있다. 자바의 특성은 프로세스 방식이 아닌 쓰레드 방식으로 동작한다. 따라서 오버헤드가 줄어들어 접속자가 많아져도 속도의 저하가 적으며, 플랫폼에 독립성을 가지고 있다.

 서블릿으로 작성된 프로그램 코드는 클래스 파일로 변환되어 JVM에서 인터프린터 방식으로 해석하고 실행하기 때문에 어떤 플랫폼에서도 JVM과 서블릿 컨테이너가 있다면 사용할 수 있다.

 

 마지막으로 서블릿은 보안 모델을 적용하기 쉬우며, 자바 언어로 작성되어 있어 자바 API를 사용할 수도 있고, 자바가 가지는 OOP(Object Oriented Programming) 특성을 그대로 가지고 있다.

 

 

※ CGI(Common Gateway interface)

CGI는 특별한 라이브러리나 개발 툴을 지칭하는 것이 아니고 웹 서버와 별도로 만들어 놓은 프로그램 간의 데이터 교환 방식을 일컫는 말한다. CGI방식은 어떤 프로그래밍 언어로도 구현이 가능하고 별도로 만들어 놓은 프로그램에 HTML의 GET이나 POST의 방법을 통해 클라이언트의 데이터를 환경 변수로 전달하고 프로그램의 표준 출력 결과를 그대로 클라이언트에 되돌려 주는 형식이다.

 

즉, 자바 어플리케이션 코딩을 하듯 웹 브라우저용 출력 화면을 코딩하는 방식을 말한다.