티스토리 뷰


서블릿이란 한마디로 자바로 개발된 CGI프로그램이다.


서블릿 = server + applet

-> server에서 돌아가는 작은 applet(자바 프로그램)


자바EE기술중에서 jsp와 서블릿 기술만 구현한 서버를 서블릿 컨테이너라고 한다.


웹 서버가 있고 웹 애플리케이션이 있다. 이때 이 프로그램이 자바로 개발되었으면 서블릿인것이다. CGI프로그램에는 펄,PHP등 유명한것들이 있다.



CGI 프로그램이 무엇인가?


CGI프로토콜이 뭔지 우선 설명하겠다. CGI프로토콜이란, 웹 서버와 웹상에서 돌아가는 프로그램 사이의 통신 규약이다. 즉, 웹 서버와 웹 앱이 서로 데이터를 어떻게 주고 받을것인지에 대한 프로토콜이다. 그리고, 이 프로토콜을 지킨 웹에서 돌아가는 응용프로그램이 CGI프로그램이다. 자바로 구현된 CGI프로그램이 서블릿이다.


따라서, 서블릿을 통해서 동적으로 HTML을 만들어서 클라이언트에 응답 할 수 있고, 기타 다양한 로직들을 수행할 수 있는것이다. 서블릿이 PHP나 펄같은 스크립트 언어에 비해서 좋은 점은, 멀티 쓰레딩 환경에서 동작한다는것이다. PHP나 펄은 멀티 프로세스 환경에서 돌아가는데, 이것은 부모 프로세스의 대부분을 자식 프로세스가 물려 받기 때문에 메모리 낭비가 심해진다. 하지만, 멀티 쓰레드 환경에서는 새로운 쓰레드를 만들때 메모리 차지를 훨씬 덜 하게 되고 빠르다. 그렇기 때문에 PHP 보다 훨씬 더 많은 클라이언트의 요청을 처리 할 수 있게 된다. 물론 생산성 자체는 PHP가 JSP보다 높다고 한다. 그렇기 때문에 클라이언트의 요청이 많지 않은 프로그램을 개발할때는 오히려 PHP로 개발하는게 더 좋을 수도 있다.


스크립트 언어(PHP,펄)는 컴파일 되지 않고 실행중에 동적으로 해석 되고, 서블릿은 실행 되기 전에 우선 컴파일 된 다음에 class파일이 JVM에 로드 되어 인터프리터 방식으로 실행되기 때문에 실행 속도도 서블릿이 더 빠르다.


스크립트 언어의 경우에는 어떤 컴파일 과정도 없이 바로 스크립트 해석 엔진에 의해 스크립트가 한줄 한줄 해석되기 떄문에 실행 도중에 문법 체크등을 해야 한다. 그렇기 때문에 한번이라도 컴파일을 거친 서블릿보다 느릴 수 밖에 없다. 물론 자바도 완전히 기계어로 컴파일 되는게 아니라 바이트 코드가 들어있는 클래스 파일로 컴파일 되지만, 그래도 아예 컴파일을 안하는 스크립트 언어 보다는 빠를 것이다.


흔히들 서블릿 클래스를 만드려면 HttpServlet클래스를 상속받은 하위 클래스를 만들어야 한다고 얘기한다. 하지만, 왜? 저 클래스를 상속 받아야 하는지 아시는가?


서블릿 인터페이스


서블릿은 서블릿 컨테이너에 의해서 생성,실행,소멸된다. 클라이언트로 부터 요청이 들어오면 서블릿 컨테이너가 적절한 서블릿을 찾아서 콜백 메소드를 호출하게 된다.(service()) 따라서, 서블릿 인터페이스를 상속받은 나만의 서블릿 클래스를 작성해서 콜백 메소드를 오버라이딩하여 구현해 놓아야지, 내가 원하는대로 프로그램이 동작할것이다.


그렇기 때문에 서블릿 클래스를 만드려면 Servlet인터페이스를 구현해야 하는것이다. HttpServlet이라는것은 Servlet인터페이스를 구현한 하위 클래스일 뿐이다.


인터페이스를 바로 구현하게 되면 인터페이스에 있는 모든 메소드들(딱히 필요 없는,구현할 필요 없는 init() destroy()등등)의 메소드들까지 모두 구현해야 되기 때문에 GenericServlet 추상 클래스에서는 service() 메소드만 추상 메소드로 만들어 놓았고 나머지는 간략하게 구현을 해 놓았다. 따라서, 서블릿 클래스를 만들고 싶을때 이 추상 클래스를 상속받아서 구현하게 되면 service() 메소드만 재정의 하면 되기 때문에 좀 더 간편하게 서블릿 클래스를 만들 수 있다. HttpServlet는 GenericServlet을 상속받은 추상 클래스이다. 이 HttpServlet 추상 클래스에는 service() 메소드 마저 구현이 되어 있다. 즉, 구조가 다음과 같다. 


Servlet 인터페이스

GenericServlet 추상클래스

HttpServlet 추상 클래스


서블릿 인터페이스의 5가지 콜백 함수

init(), service(), destroy(), getServletConfig(), getServletInfo()


서블릿 인터페이스의 5가지 콜백함수 중에서 4가지 콜백함수(init,destroy,getServletConfig,getServletInfo)는 구현 되어 있는것이 GenericServlet 추상 클래스이다.


또한, service()메소드 마저 구현 되어 있는것이 HttpServlet추상 클래스이다. 모든 메서드가 다 구현 된 것 같은데, HttpServlet 클래스는 왜 추상 클래스 일까? 사실 service()추상 클래스 내부에 doGet() doPost()등과 같은 메소드가 아직 직 추상메소드로 남아 있기 때문이다.


보통 서블릿 클래스를 만들때, HttpServlet 추상 클래스를 상속받아서 만들게 되는데 이때 doGet() doPost()를 오버라이딩 하라고 나온다. 서블릿 컨테이너가 요청을 받고 서블릿의 service() 메소드를 호출하는데 service()내부적으로 요청 메소드에 따라서 doGet()또는 doPost()를 호출한다. 따라서, HttpServlet 추상 클래스를 상속받는 하위 클래스에서 doGet과 doPost를 재정의 해 놓아야 한다. 다시말해서, GenericServlet 추상 클래스를 상속 받은 다음에 service()메소드를 재정의 해도 서블릿 컨테이너의 요청에 제대로 응답을 해 줄 수 있을것이다. 하지만, 요청 메소드에 따라 응답을 다르게 하기 위해서는 HttpServlet추상 클래스를 상속 받도록 하자.


정리하면, 왜 서블릿 클래스를 만들기 위해서 HttpServlet클래스를 상속 받아야 하는가?

-> 서블릿 컨테이너가 HttpServlet의 콜백 메소드를 호출 하기 때문에 , 이 클래스의 메소드들을 오버라이딩 해 놓아야 한다.





'컴퓨터 공학과 졸업 > JSP&Servlet' 카테고리의 다른 글

서블릿 구동 절차  (0) 2018.08.01
모델1 모델2 MVC패턴  (0) 2018.07.27
필터와 래퍼  (0) 2018.07.27
JSP의 새로운 문법  (0) 2018.07.26
Servlet Container  (0) 2018.07.26
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함